首頁 >後端開發 >Golang >GoESL 與 Temporal:通話並非源自 FreeSWITCH 中的某一點

GoESL 與 Temporal:通話並非源自 FreeSWITCH 中的某一點

WBOY
WBOY轉載
2024-02-06 09:21:04942瀏覽

GoESL 与 Temporal:呼叫并非源自 FreeSWITCH 中的某个点

問題內容

我正在將GoESL (https://www.php.cn/link/d9b64cee05c46d31b10b9869a3198a6d) 與Temporal 集成,以透過FreeSWITCH 自動撥號。此設定允許 1,000 個並發通道和每秒 50 個呼叫 (CPS)。每次撥號嘗試都會啟動臨時工作流程,該工作流程透過活動發起呼叫。

成功發起 96 個呼叫(可變數量)後,FreeSWITCH 不再處理更多呼叫。 CLI 中沒有日誌,事件套接字層中沒有事件指示進一步的嘗試。但是,如果我停止 Temporal Worker,先前「卡住」的呼叫會出現在 FreeSWITCH CLI 中,表示它們已由 GoESL 用戶端排隊。我可以確認工作人員不會陷入困境,因為它會繼續啟動主要工作流程。

以下是相關程式碼片段:

潛在客戶處理循環:

for _, lead := range leadResult.Leads {
    // [omitted setup and checks]

    // Checking for channel availability and sleeping to respect CPS limits
    workflow.Await(ctx, func() bool {
        return dialerQueryResponse.AvailableChannels > 0
    })

    timeToSleep := time.Second / time.Duration(dialerQueryResponse.CallsPerSecondLimit)
    workflow.Sleep(ctx, timeToSleep)

    // Dialing the lead
    fmt.Printf("dialing lead %s\n", lead)
    dialLead(lead, selectedDialer.Id, callTimeout) 
    fmt.Print("lead dialed\n\n")
}

撥號引導邏輯:

dialLead := func(lead string, selectedDialerId, dialerCallTimeout int) {
    // Setup child workflow context with unique ID
    cwo.WorkflowID = fmt.Sprintf("Campaign_Call_%s", lead)
    childCtx := workflow.WithChildOptions(ctx, cwo)

    // Struct to pass input to the child workflow
    input := domain.CallWorkflowInput{
        Lead:                lead,
        DialerId:            selectedDialerId,
        CampaignName:        cds.CampaignName,
        DialplanExtension:   cc.Survey.DialplanExtension,
        CallTimeout:         dialerCallTimeout,
    }

    // Executing the child workflow and handling its future
    future := workflow.ExecuteChildWorkflow(childCtx, CallWorkflow, input)
    var dialerId int
    selector.AddFuture(future, func(f workflow.Future) {
        err := f.Get(ctx, &dialerId)
        // Error handling and updating concurrency state
        // ...
    })
}

呼叫工作流程函數:

func CallWorkflow(ctx workflow.Context, input domain.CallWorkflowInput) (int, error) {
    // [omitted setup]

    // Executing the originate call activity
    var dialLeadResult domain.DialLeadResponse
    if err := workflow.ExecuteActivity(ctx, activity.Dialer.OriginateCallActivity, dialInput).Get(ctx, &dialLeadResult); err != nil {
        // Error handling
    }

    // [omitted post-call handling]
}

依序執行發起呼叫活動:

func (a *DialerActivities) OriginateCallActivity(ctx context.Context, input domain.DialLeadRequest) (domain.DialLeadResponse, error) {
    // [omitted client selection]

    // Command to originate the call
    cmd := fmt.Sprintf("originate {%s}%s/%s/%s 704 XML default test %s 10", variables, protocol, gateway, input.DestinationNumber, input.OriginatingNumber)
    err := selectedClient.BgApi(cmd)

    if err != nil {
        // Error handling
    }

    // [omitted response preparation]
}}, nil
}

是否有人在使用 GoESL 或 Temporal 時遇到類似的問題,其中呼叫似乎在排隊並且超過某個點後未執行?關於如何調試這種情況或為什麼終止臨時工作線程可能會觸發排隊呼叫的處理有什麼建議嗎?

我嘗試過的:

  • 確保遵守限制。
  • 使用 FreeSWITCH CLI 進行偵錯並檢查 CDR。
  • 檢查 FreeSWITCH 日誌以嘗試尋找任何異常情況。
  • 嘗試在 FreeSWITCH 設定中記錄 GoESL 事件的日誌,但沒有將任何日誌寫入該檔案。
  • workflow.Sleep 持續時間從幾毫秒修改為 5 - 10 秒,以確保不是網路延遲導致問題。
  • 確認在終止工作流程之前我的程式碼或日誌中不會引發任何錯誤。
  • 已停止 FreeSWITCH 實例,以確保這不是 GoESL 與 FreeSWITCH 之間的通訊問題。停止 FreeSWITCH 實例時,日誌指示通訊失敗。否則我不會收到任何日誌。
  • 研究:在Google 上找到這篇文章(https://lists.freeswitch.org/pipermail/freeswitch-users/2019-May/131768.html),該文章似乎與我們遇到的同一問題有關,但是,沒有解決辦法。

正確答案


決定更換GoESL 軟體包(https://www.php.cn/link/d9b64cee05c46d31b10b9869a3198a6d )使用不同的GoESL 套件(https://www.php.cn/link/8c8566b78ac2b99c542bef8c37cac179)和問題已經解決了。似乎是初始 GoESL 套件中的一個根本問題。

我在此處的 Github 儲存庫上提出了一個問題 (https://github.com /0x19/goesl/issues/40)以防將來有人遇到同樣的問題。

以上是GoESL 與 Temporal:通話並非源自 FreeSWITCH 中的某一點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除