亚洲综合伊人,成人欧美一区二区三区视频不卡,欧美日韩在线高清,日韩国产午夜一区二区三区,大胆美女艺术,一级毛片毛片**毛片毛片,你瞅啥图片

您當前的位置是:  首頁 > 資訊 > 文章精選 >
 首頁 > 資訊 > 文章精選 >

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

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


  根據(jù)OpenSIPS官方對OpenSIPS的定義,OpenSIPS或者Kamailio可以支持SIP軟交換環(huán)境中的各種靈活的路由機制,就是我們通常使用的模塊包括dispatcher和loadbalance模塊。網(wǎng)上有各種對這兩個模塊的具體定義和說明,也包括其中文概念。在大部分的中文稱謂中,我們將dispatcher 翻譯為調(diào)度,loadbalance翻譯為負載均衡。這里,為了方便使用,我們也使用這樣的稱謂。本人不是英文翻譯人員,關于以上中文稱謂是否正確,我們不做討論。我們僅針對其具體使用進行分享。很多剛剛進入到IP領域的讀者可能會對OpenSIPS中的dispatcher和loadbalance有一些誤解,這種誤解可能導致在部署OpenSIPS和其他第三方媒體服務器方面產(chǎn)生很多的疑問,也浪費了很多時間。另外,一些用戶因為對這兩個模塊的功能了解不足,在后續(xù)的拓展支持和其更高級功能的處理上難以對其實行控制,導致很多項目部署的失控。為了更加明確dispatcher和loadbalance的使用場景和其潛在的應用風險,我們重點對diapatcher的概念,以及dispatcher和loadbalance的區(qū)別,dispatcher的使用以及dispatcher的呼叫失敗處理,以及dispatcher模塊配置示例做一個完整的分享。在后續(xù)章節(jié)中,筆者將對loadbalance的使用示例做更多分享。
  因此,在本文章的分享中,筆者將介紹dispatcher的基本概念,以及它和loadbalance的區(qū)別,dispatcher的處理以及呼叫失敗處理邏輯處理和dispatcher配置示例做詳細說明。
  OpenSIPS/Kamailio/媒體服務器路由調(diào)度模塊集成示例
  說明:在配置示例的討論中,筆者將使用dialpaln模塊, drouting和其他的路由輔助模塊和OpenSIPS的控制界面做必要的配置來實現(xiàn)調(diào)度功能示例演示,所以,用戶如果需要實現(xiàn)調(diào)度功能示例的話,用戶必須首先安裝配置環(huán)境。
  除了使用開源OpenSIPS或者Kamailio的調(diào)度模塊以外,用戶可以選擇freesbc作為一個媒體服務器的前端對呼叫進行路由調(diào)度處理。
  1、OpenSIPS的dispatcher模塊的基本概念
  OpenSIPS也稱為軟交換。既然是軟交換的話,它必須具備一定的dispatcher的調(diào)度功能。簡單來說,dispatcher的調(diào)度可能主要是實現(xiàn)對呼叫進行呼叫目的地的調(diào)度管理。通過呼叫請求結(jié)合目的地選項實現(xiàn)呼出代理的路由管理。調(diào)度模塊通過權重設置對呼叫目的地進行設置。實際上,調(diào)度模塊可以實現(xiàn)一個無狀態(tài)的負載均衡機制,它不會保證其最終路由結(jié)果。因此,調(diào)度模塊實現(xiàn)的是一個簡單的呼叫分發(fā)功能,不涉及呼叫最終結(jié)果的處理。關于dispatcher的完整描述,用戶可以參考官方文檔關于dispatcher的說明。
  2、dispatcher和loadbalance的區(qū)別
  前面筆者已經(jīng)說明,在使用OpenSIPS時,很多用戶仍然對調(diào)度和負載均衡有一些迷惑和誤解。調(diào)度模塊和負載均衡模塊有一個共同之處-它們都是對呼叫進行分發(fā)處理。因為這個共同之處所以導致用戶對兩個模塊的錯誤理解。這里,筆者簡單介紹一下dispatcher和loadbalance的區(qū)別。它們兩者之間有比較大的區(qū)別:
  Dispatching/調(diào)度:
  • 無負載目的地端任何信息,僅直接分發(fā)
  • 僅通過peer做一個概率性的數(shù)據(jù)路由分發(fā)
  • 假設所有目的地端是確定的,包括目的地端是正常工作狀態(tài)
  • 處理速度快,無需獲得返回消息,完全是一種“盲”或者無狀態(tài)的處理
  Loadbalance/負載均衡:
  • 基于dialog模塊,可對目的地端負載計數(shù)
  • 因為支持能力不同,目的地端可能完全不同(例如,媒體能力,業(yè)務功能不同)
  • 可收到目的地端的返回消息
  • 對目的地端無任何偵測的要求
  3、Dispatcher 其他討論
  用戶需要啟用Dispatcher的話,它和其他的模塊一樣,也同樣需要加載一些必要的參數(shù)和支持模塊。具體的語法這里不再介紹,官方有完整的語法說明。筆者這里想介紹幾個使用dispatch模塊時幾個特別需要說明的地方。
  針對呼叫目的地的調(diào)度路由,dispatcher 模塊可以支持幾種不同的路由方式,用戶可以根據(jù)自己的業(yè)務場景來設置不同的路由:
  • 可以通過SIP URLS定義來進行路由
  • 可以通過組設置來進行路由
  • 在組設置中可以支持不同權重來定義調(diào)度路由
  • 可以通過MI CLI命令關閉/開啟目的地組
  • 可以通過組設置中的優(yōu)先級順序來實現(xiàn)路由
  • 可以通過屬性字符串的標識來定義路由
  針對dispatcher模塊的數(shù)據(jù)處理,OpenSIPS支持的是實時的數(shù)據(jù)存儲方式。路由目的地通過數(shù)據(jù)庫存儲的方式進行設置。數(shù)據(jù)庫數(shù)據(jù)在OpenSIPS啟動時加載的內(nèi)存中的,在系統(tǒng)運行中不會再訪問數(shù)據(jù)庫獲取數(shù)據(jù)。如果用戶需要重新加載數(shù)據(jù)的話,可以通過MI CLI命令執(zhí)行ds_reload 來實現(xiàn)數(shù)據(jù)加載。比較新的OpenSIPS版本(官方推薦使用2.3)可以支持針對dispatcher的數(shù)據(jù)實現(xiàn)分區(qū)的功能,調(diào)度模塊的表可以和多個數(shù)據(jù)庫資源進行訪問支持。數(shù)據(jù)分區(qū)的功能目前支持dialplan,dispatcher和drouting。dispatcher模塊可以同時對兩種不同的業(yè)務場景實現(xiàn)不同的數(shù)據(jù)庫訪問來獲取調(diào)度業(yè)務所需要的數(shù)據(jù),具體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種),這些方式也非常靈活。調(diào)度模塊可以根據(jù)不同的業(yè)務場景執(zhí)行不同的路由。dispatcher模塊可以支持通過hash table的路由,也可以支持round-robin的路由方式。一般情況下,如果沒有特別的業(yè)務要求,很多用戶使用round-robin的方式。
  但是如果需要針對SIP用戶限定等特別的業(yè)務功能支持的話,用戶需要使用hash table來實現(xiàn)不同的路由。一些非常常用的場景也必須通過hash table方式來實現(xiàn),例如:
  一個SIP用戶的所有注冊終端必須能夠注冊到同一注冊服務器peer端,一般情況下,系統(tǒng)也不允許出現(xiàn)不同的注冊目的地地址。
  SIP 用戶如果呼叫的話,所有它們的呼叫始終呼叫到同一服務器目的地端。
  針對媒體會議服務器的端路由中,對每個會議服務器的會議室能夠路由到正確的目的地端服務器地址
  在hash 表的路由中用戶需要特別注意這些細微的區(qū)別, 通過不同的SIP 頭確保其呼叫路由到正確的目的地:
  0-hash over callid-確保所有同一dialog的請求能夠路由到同一目的地代理服務器。通過dialog中的callid來跟蹤同一呼叫。
  • 1-hash over From URL-確保所有從同一用戶發(fā)出的請求能夠路由到同一代理服務器目的地。
  • 2-hash over To URL-確保一個AOR的所有注冊能夠路由到同一代理服務器地址。
  • 3-hash over Request-URL-確保所有對同一目的地的請求能夠路由到同一目的地服務器
  為了滿足會議服務器路由和其他正常語音呼叫的處理調(diào)度,可以通過Dispatch 腳本中針對具體會議服務器路由和正常路由進行處理的示例,使用了0和3參數(shù)設置:
  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 調(diào)度呼叫失效處理控制討論
  Dispatcher模塊實現(xiàn)的是一個非常簡單的呼叫調(diào)度路由,dispatcher假設對端peer是正常狀態(tài),它本身不關心對端peer的呼叫是否成功或者失敗。但是,在實際應用環(huán)境中,如果對端peer出現(xiàn)故障的話,用戶如果使用了調(diào)度模塊的話,系統(tǒng)仍然需要對peer進行檢查,否則,系統(tǒng)對呼叫失去了控制。例如,對端媒體會議媒體服務器出現(xiàn)故障,如何對其進行檢查等。那么,OpenSIPS 的dispatcher 模塊如何實現(xiàn)對對端peer進行檢測是一個非常重要的環(huán)節(jié)。OpenSIPS的dispatcher 模塊可以通過一些幾種方式對對端peer進行檢測:
  • 無返回消息,例如可能是timeout 超時,peer出現(xiàn)故障。
  • 對端返回1xx,例如可能是媒體服務器沒有足夠的落地資源或者可用端口(例如,落地使用的FXO/E1端口正在被占用)。
  • 返回5xx消息,peer服務器內(nèi)部錯誤
  • 返回6xx消息,可能是全局網(wǎng)絡失敗
  • 返回4xx消息,可能是其他能力支持問題,例如編碼轉(zhuǎn)換或者落地端口被占用,擁塞等。
  在dispatcher使用時,可以通過失敗路由檢測到腳本對peer進行檢測,具體的cfg示例如下:
  failure_ route[ds_failed] {
  if(t_check_status( "[56][0-9][0-9]") ||
  # 對端 peer 錯誤
  (t_local_replied("all") &&t_check_status("408")) ||
  # 本地 408 錯誤
  t_ check_ status("409") )
  # 其他錯誤
  # 執(zhí)行失效呼叫處理
  ]
  Dispatcher對對端peer的檢測完成以后,仍然需要呼叫失效處理的邏輯腳本對失效呼叫進行二次處理,然后進行目的地狀態(tài)更新以后的呼叫。針對OpenSIPS的dispatcher(負載均衡類似)失效處理的算法大概需要經(jīng)過以下六個步驟:
  通過ds_select 獲取一個初始對端peer的組順序
  從路由組中選擇第一個路由peer
  對可用的第一個目的地peer發(fā)送request請求
  如果檢測到失敗的話,對此peer做一個失敗標識,關閉此peer,繼續(xù)查詢下一個可用的peer
  使用下一個peer,然后添加到branch中執(zhí)行serial forking處理
  重復第三步
  根據(jù)以上流程,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重新發(fā)出告警
  }
  }
  筆者應該注意,以上的處理方式僅說明在使用dispatcher 模塊時,opensips的呼叫失效的處理邏輯。mark的策略也可以做一定的調(diào)整,例如,檢測到的參數(shù),如果達到3次以上,就標識為一個關閉的peer。另外,marked peer也可以通過一定的周期性檢測,超時設置重新激活其檢測狀態(tài)。當然,如果用戶也可以在對端peer側(cè)來設置基于自己業(yè)務層面的呼叫失效的處理流程。例如,如果對端是一個會議系統(tǒng)或者其他的媒體服務器的話,如果呼叫的終端出現(xiàn)異常,本身媒體服務器端也可以設置其他的策略來執(zhí)行呼叫失效,例如,設置一個分機隨行,呼叫其他的終端,或者轉(zhuǎn)入語音郵箱等方式。
  OpenSIPS的dispatcher 模塊可以支持多種對SIP對端peer的狀態(tài)進行探測。此功能的使用方式和drouting類似。另外,MI CLI命令可以對ds_list 執(zhí)行狀態(tài)檢測,包括活動狀態(tài),非活動狀態(tài)和正在探測狀態(tài)。MI CLI命令也可以對目的地狀態(tài)進行管理,用戶可以使用ds_set_state 進行修改。
  5、OpenSIPS的dispatcher/調(diào)度配置示例
  根據(jù)以上的討論,筆者在此章節(jié)介紹一個使用調(diào)度模塊配置動態(tài)路由的配置示例。在配置dispatcher模塊之前,和其他的模塊配置一樣,用戶需要修改cfg配置文件,加載必要的模塊和參數(shù),然后修改dispatch的路由設置,最后通過控制界面添加dispatcher的路由設置,重新啟動OpenSIPS實現(xiàn)調(diào)度模塊和呼叫失效設置。此示例中,前端是一個OpenSIPS,兩個對端peer是媒體服務器。
  首先修改cfg配置文件,添加必要的參數(shù)設置和模塊:
  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 邏輯塊,實現(xiàn)調(diào)度處理:
  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"))) {
  # 媒體服務器呼叫失效,標識為失敗狀態(tài)
  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;
  }
  # 發(fā)送呼叫到新的媒體服務器
  xlog("Trying the new $du media server\n");
  t_on_failure("media_failover");
  t_relay();
  }
  }
  重新啟動OpenSIPS,然后登錄OpenSIPS控制界面,添加修改的目的地地址和組設置。通過dispatcher菜單添加不同的兩個媒體服務器地址。添加以后,重新刷新界面。如果對端設置正常的話,dispatcher模塊會看到活動的peer狀態(tài)。
  添加好dispatcher模塊數(shù)據(jù)以后,用戶可以進行呼叫測試。在呼叫測試時,用戶同時還要需要添加dialplan來實現(xiàn)對撥號的控制,按照自己的設置,通過終端進行撥號測試。參數(shù)方式如下:
  如果同一號碼,正常情況下,此終端的呼叫會一直在路由到同一媒體服務器。關閉另外一個調(diào)度路由設置,通過終端重新進行呼叫,檢測呼叫是否可以正常通過。
  修改第一個路由的peer地址,修改為一個127.0.0.2,測試呼叫,強制呼叫失效處理,檢查返回的消息。
  關閉其中一個媒體服務器或者在媒體服務器側(cè)進行撥號規(guī)則修改,終端檢查返回的SIP消息。
  通過以上不同的測試流程,OpenSIPS的調(diào)度模塊的腳本處理產(chǎn)生不同的peer狀態(tài)消息,用戶可以通過MI CLI命令來檢查其狀態(tài)。如果一切配置成功的話,可以看到界面的演示是返回失效呼叫的邏輯的。
  6、總結(jié)
  在本文章中,筆者首先介紹了調(diào)度模塊的一些簡單比較知識,然后強調(diào)了幾個調(diào)度模塊和負載均衡模塊的不同。接下來,筆者介紹了調(diào)度路由中特別需要關注的幾個參數(shù)和其非常具體的應用場景。為了保證調(diào)度模塊的完整實現(xiàn),調(diào)度路由需要呼叫失效的處理,筆者又介紹了dispatcher中關于呼叫失效的處理機制和六個步驟,同時分享了cfg配置的邏輯腳本。最后,筆者分享了一個關于OpenSIPS的dispatcher模塊的使用示例,在示例中,列出了具體的加載模塊的代碼和界面相關配置,并且提示用戶如何使用SIP終端對dispatcher模塊進行測試。
  通過本文章的介紹,筆者相信用戶可能對OpenSIPS的調(diào)度模塊和負載均衡模塊區(qū)別有了新的認識,同時也更加深入了解了調(diào)度模塊的使用和其呼叫失效的管理邏輯。通過完整的調(diào)度路由策略,結(jié)合完整的調(diào)度失效控制機制來實現(xiàn)完整強大的dispatcher模塊集成,并且保證了媒體服務器端的呼叫穩(wěn)定性和SIP路由的完整處理。
  為了完整介紹OpenSIPS的路由處理,在后續(xù)關于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商業(yè)解決方案:www.hiastar.com
  • 最新Asterisk完整中文用戶手冊詳解:www.asterisk.org.cn
  • Freepbx/FreeSBC技術文檔: www.freepbx.org.cn
  • 如何使用免費會話邊界控制器-FreeSBC,qq技術分享群:334023047
  • 關注微信公眾號:asterisk-cn,獲得有價值的通信行業(yè)技術分享
【免責聲明】本文僅代表作者本人觀點,與CTI論壇無關。CTI論壇對文中陳述、觀點判斷保持中立,不對所包含內(nèi)容的準確性、可靠性或完整性提供任何明示或暗示的保證。請讀者僅作參考,并請自行承擔全部責任。

專題

CTI論壇會員企業(yè)

承德市| 兴业县| 阳新县| 准格尔旗| 东至县| 木里| 冕宁县| 静乐县| 兴国县| 疏勒县| 南平市| 正镶白旗| 平果县| 温州市| 霍州市| 原平市| 东乡县| 金山区| 嘉兴市| 综艺| 孝感市| 琼结县| 开鲁县| 北京市| 峨边| 桂平市| 福泉市| 静安区| 正安县| 松江区| 乳山市| 盐山县| 全州县| 南川市| 大连市| 盖州市| 常州市| 冷水江市| 宁武县| 中山市| 新晃|