dispatcher模块用来分发sip消息。

dispatcher如何记录目的地状态

dispatcher会使用一张表。

需要关注两个字段destionations, state。

  • destionations表示sip消息要发往的目的地
  • state表示对目的地的状态检测结果
    • 0 可用
    • 1 不可用
    • 2 表示正在检测

opensips只会想可用的目的地转发sip消息

idsetiddestionationsstate
11sip:p1:50600
21sip:p2:50601
31sip:p2:50612

dispatcher如何检测目的地的状态

本地的opensips会周期性的向目的地发送options包,如果对方立即返回200ok, 就说明目的地可用。

在达到一定阈值后,目的地一直无响应,则opensips将其设置为不可用状态,或者正在检测状态。如下图所示

代码例子

ds_select_dst()函数会去选择可用的目的地,并且设置当前sip消息的转发地址。如果发现无用可转发地址,则进入504 服务不可用的逻辑。

如果sip终端注册时返回504,则可以从dispatcher模块,排查看看是不是所有的目的地都处于不可用状态。

if (!ds_select_dst("1", "0")) {
	send_reply("504","Service Unavailable");
  exit;
}