<address id="lbt7n"></address>
      <delect id="lbt7n"><mark id="lbt7n"></mark></delect>
      <form id="lbt7n"></form>

          <big id="lbt7n"><cite id="lbt7n"><cite id="lbt7n"></cite></cite></big>
          <cite id="lbt7n"></cite>

          <p id="lbt7n"></p>
          您當前的位置是:  首頁 > 資訊 > 文章精選 >
           首頁 > 資訊 > 文章精選 >

          OpenSIPS學習筆記-dispatcher調度模塊概要-失效呼叫處理邏輯及示例演示

          2021-03-01 09:21:29   作者:james.zhu    來源:Asterisk開源派   評論:0  點擊:


            根據OpenSIPS官方對OpenSIPS的定義,OpenSIPS或者Kamailio可以支持SIP軟交換環境中的各種靈活的路由機制,就是我們通常使用的模塊包括dispatcher和loadbalance模塊。網上有各種對這兩個模塊的具體定義和說明,也包括其中文概念。在大部分的中文稱謂中,我們將dispatcher 翻譯為調度,loadbalance翻譯為負載均衡。這里,為了方便使用,我們也使用這樣的稱謂。本人不是英文翻譯人員,關于以上中文稱謂是否正確,我們不做討論。我們僅針對其具體使用進行分享。很多剛剛進入到IP領域的讀者可能會對OpenSIPS中的dispatcher和loadbalance有一些誤解,這種誤解可能導致在部署OpenSIPS和其他第三方媒體服務器方面產生很多的疑問,也浪費了很多時間。另外,一些用戶因為對這兩個模塊的功能了解不足,在后續的拓展支持和其更高級功能的處理上難以對其實行控制,導致很多項目部署的失控。為了更加明確dispatcher和loadbalance的使用場景和其潛在的應用風險,我們重點對diapatcher的概念,以及dispatcher和loadbalance的區別,dispatcher的使用以及dispatcher的呼叫失敗處理,以及dispatcher模塊配置示例做一個完整的分享。在后續章節中,筆者將對loadbalance的使用示例做更多分享。
            因此,在本文章的分享中,筆者將介紹dispatcher的基本概念,以及它和loadbalance的區別,dispatcher的處理以及呼叫失敗處理邏輯處理和dispatcher配置示例做詳細說明。
            OpenSIPS/Kamailio/媒體服務器路由調度模塊集成示例
            說明:在配置示例的討論中,筆者將使用dialpaln模塊, drouting和其他的路由輔助模塊和OpenSIPS的控制界面做必要的配置來實現調度功能示例演示,所以,用戶如果需要實現調度功能示例的話,用戶必須首先安裝配置環境。
            除了使用開源OpenSIPS或者Kamailio的調度模塊以外,用戶可以選擇freesbc作為一個媒體服務器的前端對呼叫進行路由調度處理。
            1、OpenSIPS的dispatcher模塊的基本概念
            OpenSIPS也稱為軟交換。既然是軟交換的話,它必須具備一定的dispatcher的調度功能。簡單來說,dispatcher的調度可能主要是實現對呼叫進行呼叫目的地的調度管理。通過呼叫請求結合目的地選項實現呼出代理的路由管理。調度模塊通過權重設置對呼叫目的地進行設置。實際上,調度模塊可以實現一個無狀態的負載均衡機制,它不會保證其最終路由結果。因此,調度模塊實現的是一個簡單的呼叫分發功能,不涉及呼叫最終結果的處理。關于dispatcher的完整描述,用戶可以參考官方文檔關于dispatcher的說明。
            2、dispatcher和loadbalance的區別
            前面筆者已經說明,在使用OpenSIPS時,很多用戶仍然對調度和負載均衡有一些迷惑和誤解。調度模塊和負載均衡模塊有一個共同之處-它們都是對呼叫進行分發處理。因為這個共同之處所以導致用戶對兩個模塊的錯誤理解。這里,筆者簡單介紹一下dispatcher和loadbalance的區別。它們兩者之間有比較大的區別:
            Dispatching/調度:
          • 無負載目的地端任何信息,僅直接分發
          • 僅通過peer做一個概率性的數據路由分發
          • 假設所有目的地端是確定的,包括目的地端是正常工作狀態
          • 處理速度快,無需獲得返回消息,完全是一種“盲”或者無狀態的處理
            Loadbalance/負載均衡:
          • 基于dialog模塊,可對目的地端負載計數
          • 因為支持能力不同,目的地端可能完全不同(例如,媒體能力,業務功能不同)
          • 可收到目的地端的返回消息
          • 對目的地端無任何偵測的要求
            3、Dispatcher 其他討論
            用戶需要啟用Dispatcher的話,它和其他的模塊一樣,也同樣需要加載一些必要的參數和支持模塊。具體的語法這里不再介紹,官方有完整的語法說明。筆者這里想介紹幾個使用dispatch模塊時幾個特別需要說明的地方。
            針對呼叫目的地的調度路由,dispatcher 模塊可以支持幾種不同的路由方式,用戶可以根據自己的業務場景來設置不同的路由:
          • 可以通過SIP URLS定義來進行路由
          • 可以通過組設置來進行路由
          • 在組設置中可以支持不同權重來定義調度路由
          • 可以通過MI CLI命令關閉/開啟目的地組
          • 可以通過組設置中的優先級順序來實現路由
          • 可以通過屬性字符串的標識來定義路由
            針對dispatcher模塊的數據處理,OpenSIPS支持的是實時的數據存儲方式。路由目的地通過數據庫存儲的方式進行設置。數據庫數據在OpenSIPS啟動時加載的內存中的,在系統運行中不會再訪問數據庫獲取數據。如果用戶需要重新加載數據的話,可以通過MI CLI命令執行ds_reload 來實現數據加載。比較新的OpenSIPS版本(官方推薦使用2.3)可以支持針對dispatcher的數據實現分區的功能,調度模塊的表可以和多個數據庫資源進行訪問支持。數據分區的功能目前支持dialplan,dispatcher和drouting。dispatcher模塊可以同時對兩種不同的業務場景實現不同的數據庫訪問來獲取調度業務所需要的數據,具體cfg操作方式如下:
            modparam("dispatcher", "partition",
            "vprov:
            db_url = mysql://oss:oss@10.0.0.10/oss;
            table_name = dispatcher;
            attrs_avp = $avp(vprov_attr);")
            modparam("dispatcher", "partition",
            "pbx:
            db_url = postgres://admin:admin@192.168.10.10/opensips;
            table_name = dispatcher;
            attrs_avp = $avp(ds_media_attr);")
            在OpenSIPS平臺中,Dispatcher路由可以支持多種方式(10種),這些方式也非常靈活。調度模塊可以根據不同的業務場景執行不同的路由。dispatcher模塊可以支持通過hash table的路由,也可以支持round-robin的路由方式。一般情況下,如果沒有特別的業務要求,很多用戶使用round-robin的方式。
            但是如果需要針對SIP用戶限定等特別的業務功能支持的話,用戶需要使用hash table來實現不同的路由。一些非常常用的場景也必須通過hash table方式來實現,例如:
            一個SIP用戶的所有注冊終端必須能夠注冊到同一注冊服務器peer端,一般情況下,系統也不允許出現不同的注冊目的地地址。
            SIP 用戶如果呼叫的話,所有它們的呼叫始終呼叫到同一服務器目的地端。
            針對媒體會議服務器的端路由中,對每個會議服務器的會議室能夠路由到正確的目的地端服務器地址
            在hash 表的路由中用戶需要特別注意這些細微的區別, 通過不同的SIP 頭確保其呼叫路由到正確的目的地:
            0-hash over callid-確保所有同一dialog的請求能夠路由到同一目的地代理服務器。通過dialog中的callid來跟蹤同一呼叫。
          • 1-hash over From URL-確保所有從同一用戶發出的請求能夠路由到同一代理服務器目的地。
          • 2-hash over To URL-確保一個AOR的所有注冊能夠路由到同一代理服務器地址。
          • 3-hash over Request-URL-確保所有對同一目的地的請求能夠路由到同一目的地服務器
            為了滿足會議服務器路由和其他正常語音呼叫的處理調度,可以通過Dispatch 腳本中針對具體會議服務器路由和正常路由進行處理的示例,使用了0和3參數設置:
            modparam("dispatcher", "db_ url",
            "mysql://opensips:opensipsrw@localhost/opensips")
            # 呼叫路由部分,僅支持初始INVITEs
            if ( $rU=~"^3[0-9][0-9]$") {
            # 呼叫到媒體服務器的電話會議室路由
            ds_selert_dst(l,3);
            # hash over RURI-3,組1
            }
            else {
            # 正常呼叫
            ds_select_dst(2, o);
            # hash over CalllD-0,組2;
            }
            t relayl();
            4
            Dispatcher 調度呼叫失效處理控制討論
            Dispatcher模塊實現的是一個非常簡單的呼叫調度路由,dispatcher假設對端peer是正常狀態,它本身不關心對端peer的呼叫是否成功或者失敗。但是,在實際應用環境中,如果對端peer出現故障的話,用戶如果使用了調度模塊的話,系統仍然需要對peer進行檢查,否則,系統對呼叫失去了控制。例如,對端媒體會議媒體服務器出現故障,如何對其進行檢查等。那么,OpenSIPS 的dispatcher 模塊如何實現對對端peer進行檢測是一個非常重要的環節。OpenSIPS的dispatcher 模塊可以通過一些幾種方式對對端peer進行檢測:
          • 無返回消息,例如可能是timeout 超時,peer出現故障。
          • 對端返回1xx,例如可能是媒體服務器沒有足夠的落地資源或者可用端口(例如,落地使用的FXO/E1端口正在被占用)。
          • 返回5xx消息,peer服務器內部錯誤
          • 返回6xx消息,可能是全局網絡失敗
          • 返回4xx消息,可能是其他能力支持問題,例如編碼轉換或者落地端口被占用,擁塞等。
            在dispatcher使用時,可以通過失敗路由檢測到腳本對peer進行檢測,具體的cfg示例如下:
            failure_ route[ds_failed] {
            if(t_check_status( "[56][0-9][0-9]") ||
            # 對端 peer 錯誤
           。╰_local_replied("all") &&t_check_status("408")) ||
            # 本地 408 錯誤
            t_ check_ status("409") )
            # 其他錯誤
            # 執行失效呼叫處理
            ]
            Dispatcher對對端peer的檢測完成以后,仍然需要呼叫失效處理的邏輯腳本對失效呼叫進行二次處理,然后進行目的地狀態更新以后的呼叫。針對OpenSIPS的dispatcher(負載均衡類似)失效處理的算法大概需要經過以下六個步驟:
            通過ds_select 獲取一個初始對端peer的組順序
            從路由組中選擇第一個路由peer
            對可用的第一個目的地peer發送request請求
            如果檢測到失敗的話,對此peer做一個失敗標識,關閉此peer,繼續查詢下一個可用的peer
            使用下一個peer,然后添加到branch中執行serial forking處理
            重復第三步
            根據以上流程,dispatcher的失效呼叫腳本處理流程示例如下:
            # dispatch的呼叫失效
            route[do_dispatching] {
            if(!ds_select_dst(2,0)){
            # 所有 calllD 跟蹤
            send_reply(503,"Servlee Unavallable");
            exit;,
            t_on_failure("ds_failover");
            t relay();
            }
            failure route[ds_failover]{
            If (failure_condition) {
            ds_mark_dst);  # step 3
            #避免下一次再次選擇此peer,標識為失敗peer
            If(!ds_next_dst()){
            t_reply(503,"Servlce Unavallable");
            exit;
            }
            t_on_failure("ds fallover");
            t_relay() #必須對前面的relay重新發出告警
            }
            }
            筆者應該注意,以上的處理方式僅說明在使用dispatcher 模塊時,opensips的呼叫失效的處理邏輯。mark的策略也可以做一定的調整,例如,檢測到的參數,如果達到3次以上,就標識為一個關閉的peer。另外,marked peer也可以通過一定的周期性檢測,超時設置重新激活其檢測狀態。當然,如果用戶也可以在對端peer側來設置基于自己業務層面的呼叫失效的處理流程。例如,如果對端是一個會議系統或者其他的媒體服務器的話,如果呼叫的終端出現異常,本身媒體服務器端也可以設置其他的策略來執行呼叫失效,例如,設置一個分機隨行,呼叫其他的終端,或者轉入語音郵箱等方式。
            OpenSIPS的dispatcher 模塊可以支持多種對SIP對端peer的狀態進行探測。此功能的使用方式和drouting類似。另外,MI CLI命令可以對ds_list 執行狀態檢測,包括活動狀態,非活動狀態和正在探測狀態。MI CLI命令也可以對目的地狀態進行管理,用戶可以使用ds_set_state 進行修改。
            5、OpenSIPS的dispatcher/調度配置示例
            根據以上的討論,筆者在此章節介紹一個使用調度模塊配置動態路由的配置示例。在配置dispatcher模塊之前,和其他的模塊配置一樣,用戶需要修改cfg配置文件,加載必要的模塊和參數,然后修改dispatch的路由設置,最后通過控制界面添加dispatcher的路由設置,重新啟動OpenSIPS實現調度模塊和呼叫失效設置。此示例中,前端是一個OpenSIPS,兩個對端peer是媒體服務器。
            首先修改cfg配置文件,添加必要的參數設置和模塊:
            loadmodule "dispatcher.so"
            modparam("dispatcher","db_url",
            "mysql://opensips:opensipsrw@localhost/opensips")
            modparam("dispatcher", "ds_ping_interval", 30)
            modparam("dispatcher", "ds_ping_from", "sip:ds@sip.domain.com")
            modparam("dispatcher", "ds_probing_threshhold", 1)
            然后修改to_media 邏輯塊,實現調度處理:
            route[to_media] {
            xlog("routing to media servers via dispatcher\n");
            if (!ds_select_dst(1, 2,"f")) { # over To URI
            send_reply(500,"No route to Media");
            exit;
            }
            xlog("Using media server $du (RURI=$ru) \n");
            t_on_failure("media_failover");
            t_relay();
            exit;
            }
            添加一個對媒體服務器呼叫失效的處理邏輯:
            failure_route[media_failover] {
            if (t_was_cancelled()) exit;
            if ( t_check_status( "[56][0-9][0-9]" ) ||
           。╰_local_replied("all") && t_check_status("408"))) {
            # 媒體服務器呼叫失效,標識為失敗狀態
            xlog("Media server routing failed with reply $T_reply_code\n");
            ds_mark_dst("p");
            # 如果有可用的媒體服務器,嘗試另外一個媒體服務器
            if (!ds_next_dst()) {
            xlog("no more media servers available\n");
            t_reply(503,"Service Unavailable");
            exit;
            }
            # 發送呼叫到新的媒體服務器
            xlog("Trying the new $du media server\n");
            t_on_failure("media_failover");
            t_relay();
            }
            }
            重新啟動OpenSIPS,然后登錄OpenSIPS控制界面,添加修改的目的地地址和組設置。通過dispatcher菜單添加不同的兩個媒體服務器地址。添加以后,重新刷新界面。如果對端設置正常的話,dispatcher模塊會看到活動的peer狀態。
            添加好dispatcher模塊數據以后,用戶可以進行呼叫測試。在呼叫測試時,用戶同時還要需要添加dialplan來實現對撥號的控制,按照自己的設置,通過終端進行撥號測試。參數方式如下:
            如果同一號碼,正常情況下,此終端的呼叫會一直在路由到同一媒體服務器。關閉另外一個調度路由設置,通過終端重新進行呼叫,檢測呼叫是否可以正常通過。
            修改第一個路由的peer地址,修改為一個127.0.0.2,測試呼叫,強制呼叫失效處理,檢查返回的消息。
            關閉其中一個媒體服務器或者在媒體服務器側進行撥號規則修改,終端檢查返回的SIP消息。
            通過以上不同的測試流程,OpenSIPS的調度模塊的腳本處理產生不同的peer狀態消息,用戶可以通過MI CLI命令來檢查其狀態。如果一切配置成功的話,可以看到界面的演示是返回失效呼叫的邏輯的。
            6、總結
            在本文章中,筆者首先介紹了調度模塊的一些簡單比較知識,然后強調了幾個調度模塊和負載均衡模塊的不同。接下來,筆者介紹了調度路由中特別需要關注的幾個參數和其非常具體的應用場景。為了保證調度模塊的完整實現,調度路由需要呼叫失效的處理,筆者又介紹了dispatcher中關于呼叫失效的處理機制和六個步驟,同時分享了cfg配置的邏輯腳本。最后,筆者分享了一個關于OpenSIPS的dispatcher模塊的使用示例,在示例中,列出了具體的加載模塊的代碼和界面相關配置,并且提示用戶如何使用SIP終端對dispatcher模塊進行測試。
            通過本文章的介紹,筆者相信用戶可能對OpenSIPS的調度模塊和負載均衡模塊區別有了新的認識,同時也更加深入了解了調度模塊的使用和其呼叫失效的管理邏輯。通過完整的調度路由策略,結合完整的調度失效控制機制來實現完整強大的dispatcher模塊集成,并且保證了媒體服務器端的呼叫穩定性和SIP路由的完整處理。
            為了完整介紹OpenSIPS的路由處理,在后續關于OpenSIPS的學習筆記中,筆者將進一步介紹負載均衡中的路由處理處理。
            參考資料:
            https://opensips.org/html/docs/modules/2.3.x/dispatcher.html
            www.freesbc.cn
            www.freepbx.org.cn
            https://blog.opensips.org/2017/08/18/how-to-use-database-partitions-in-opensips/
          • 關于Asterisk文檔,參考:www.asterisk.org.cn
          • 融合通信/IPPBX/FreePBX商業解決方案:www.hiastar.com
          • 最新Asterisk完整中文用戶手冊詳解:www.asterisk.org.cn
          • Freepbx/FreeSBC技術文檔: www.freepbx.org.cn
          • 如何使用免費會話邊界控制器-FreeSBC,qq技術分享群:334023047
          • 關注微信公眾號:asterisk-cn,獲得有價值的通信行業技術分享
          【免責聲明】本文僅代表作者本人觀點,與CTI論壇無關。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內容的準確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔全部責任。

          專題

          CTI論壇會員企業

          久久成人永久免费播放,国产精品二区在线,鲁啊鲁在线视频免费播放,精品三级内地国产在线观看

              <address id="lbt7n"></address>
              <delect id="lbt7n"><mark id="lbt7n"></mark></delect>
              <form id="lbt7n"></form>

                  <big id="lbt7n"><cite id="lbt7n"><cite id="lbt7n"></cite></cite></big>
                  <cite id="lbt7n"></cite>

                  <p id="lbt7n"></p>