Kamailio async模块

Kamailio async模块

ASYNC 模块

作者:Daniel-Constantin Mierla
miconda@gmail.com
编辑:Daniel-Constantin Mierla
miconda@gmail.com
版权所有 © 2011-2016 asipto.com

目录

  1. 管理员指南
    1. 概述
    2. 依赖项
      1. Kamailio 内置模块
      2. 外部库与应用
    3. 配置参数
      1. workers(整数)
      2. ms_timer(整数)
      3. return(整数)
      4. mode(整数)
    4. 可用函数
      1. async_route(routename, seconds)
      2. async_ms_route(routename, milliseconds)
      3. async_sleep(seconds)
      4. async_ms_sleep(milliseconds)
      5. async_task_route(routename)
      6. async_task_group_route(routename, groupname)
      7. async_task_data(routename, data)
      8. async_task_group_data(routename, groupname, data)
      9. async_tkv_emit(type, key, value)

示例列表
1.1 配置 workers 参数
1.2 配置 ms_timer 参数
1.3 配置 return 参数
1.4 配置 mode 参数
1.5 async_route 使用示例
1.6 async_ms_route 使用示例
1.7 async_sleep 使用示例
1.8 async_ms_sleep 使用示例
1.9 async_workers 核心参数示例
1.10 async_task_route 使用示例
1.11 async_task_group_route 使用示例
1.12 async_task_data 使用示例
1.13 async_task_group_data 使用示例
1.14 async_tkv_emit 使用示例


第 1 章 管理员指南

1. 概述

本模块为配置脚本中的 SIP 请求处理提供异步操作能力。

异步功能底层依赖 TM 与 TMX 模块提供的t_suspend()t_continue()函数实现。

注意:触发异步操作后,后续的报文处理会在另一个应用进程中恢复执行。因此不建议使用私有内存变量,若需要在处理恢复后读取数据,请使用共享内存变量(例如$avp(...)$xavp(...)$shv(...)、htable 模块的$sht(...))。

2. 依赖项

2.1 Kamailio 内置模块

加载本模块前必须先加载以下模块:

  • tm:事务管理模块
  • tmx:事务管理扩展模块
2.2 外部库与应用

无额外外部依赖。

3. 配置参数

3.1workers(整数)

用于处理async_route()async_sleep()异步任务的工作进程数量。

默认值:1

示例 1.1 配置 workers 参数

... modparam("async", "workers", 2) ...
3.2ms_timer(整数)

async_ms_sleep()async_ms_route()函数启用毫秒级定时器,参数值为定时器的分辨率(单位:毫秒)。
分辨率数值越小,系统负载越高。设置为 1 代表 1 毫秒精度,设置为 20 代表 20 毫秒精度。

默认值:0(不启用毫秒级定时器)

示例 1.2 配置 ms_timer 参数

... modparam("async", "ms_timer", 10) ...
3.3return(整数)

异步函数执行成功时的返回值。该参数仅对会挂起 SIP 事务的异步函数生效,对异步数据类函数无效。

默认值:0

示例 1.3 配置 return 参数

... modparam("async", "return", 1) ...
3.4mode(整数)

控制本模块是否绑定 TM 模块:0表示绑定,1表示不绑定。
如果仅使用async_tkv_emit()这类功能,无需依赖 TM 模块函数,可设置为 1。

默认值:0(绑定 TM 模块)

示例 1.4 配置 mode 参数

... modparam("async", "mode", 1) ...

4. 可用函数

4.1async_route(routename, seconds)

将当前 SIP 请求挂起指定秒数后,转入route[routename]路由块继续处理。

  • 内部发生错误时函数返回 false;
  • 执行成功时,函数会直接终止当前脚本的执行(等同于返回 0 的行为)。

参数说明:

  • routename:目标路由块名称,支持静态字符串或带配置变量的动态字符串;
  • seconds:请求挂起的秒数,最大值为 100,支持静态整数或存储整数的变量。

由于请求恢复后运行在新的进程中,原配置脚本的执行状态会丢失;恢复执行后,跑完指定的路由块就会结束处理,不会回到原调用位置。

可在REQUEST_ROUTE中使用。

示例 1.5 async_route 使用示例

... request_route { ... async_route("RESUME", "4"); ... } route[RESUME] { send_reply("404", "Not found"); exit; } ...
4.2async_ms_route(routename, milliseconds)

功能与async_route()一致,时间单位为毫秒。仅当ms_timer参数大于 0 时生效。

  • 内部发生错误时函数返回 false;
  • 执行成功时终止当前脚本执行。

参数说明:

  • routename:目标路由块名称,支持静态或动态字符串;
  • milliseconds:请求挂起的毫秒数,最大值为 30000(即 30 秒),支持静态整数或变量。

请求恢复后执行状态同样会丢失,目标路由执行完毕即结束。

可在REQUEST_ROUTE中使用。

示例 1.6 async_ms_route 使用示例

... request_route { ... async_ms_route("RESUME", "250"); ... } route[RESUME] { send_reply("404", "Not found"); exit; } ...
4.3async_sleep(seconds)

将当前 SIP 请求挂起指定秒数,之后继续执行当前路由块的后续逻辑。
注意:恢复后会一直执行到当前路由块末尾。如果需要更精准地控制等待后的执行逻辑,建议使用async_route()
由于执行会在新进程中恢复,异步等待前后不要使用私有内存变量。

参数说明:

  • seconds:请求挂起的秒数,最大值为 100,支持静态整数或变量。

内部发生错误时函数返回 false。

可在REQUEST_ROUTE中使用。

示例 1.7 async_sleep 使用示例

... async_sleep("4"); send_reply("404", "Not found"); exit; ...
4.4async_ms_sleep(milliseconds)

功能与async_sleep()一致,时间单位为毫秒。仅当ms_timer参数大于 0 时生效。

参数说明:

  • milliseconds:请求挂起的毫秒数,最大值为 30000(即 30 秒),支持静态整数或变量。

可在REQUEST_ROUTE中使用。

示例 1.8 async_ms_sleep 使用示例

... route[REQUESTSHAPER] { $var(res) = http_connect("leakybucket", "/add?key=$fd", $null, $null,"$avp(delay)"); $var(d) = $(avp(delay){s.int}); if ($var(d) > 0) { # 将请求延迟 $avp(delay) 毫秒 async_ms_sleep("$var(d)"); if (!t_relay()) { sl_reply_error(); } exit; } # 无延迟直接转发 if (!t_relay()) { sl_reply_error(); } exit; } ...
4.5async_task_route(routename)

将 SIP 请求交给核心异步框架第一组中的空闲工作进程,在指定路由块中继续处理。
使用该功能需要先配置核心参数async_workers以启用异步框架;任务无需等待固定时长,异步工作进程空闲时就会立即执行。

内部发生错误时函数返回 false;执行成功时终止当前脚本执行。

参数说明:

  • routename:目标路由块名称,支持静态或动态字符串。

请求恢复后原执行状态丢失,目标路由执行完毕即结束。

可在REQUEST_ROUTE中使用。

示例 1.9 async_workers 核心参数示例

... # 启用 8 个工作进程,供 async 及其他模块使用 async_workers=8 ...

示例 1.10 async_task_route 使用示例

... request_route { ... async_task_route("RESUME"); ... } route[RESUME] { t_relay(); exit; } ...
4.6async_task_group_route(routename, groupname)

功能与async_task_route()一致,额外支持指定异步工作进程组的名称。更多细节可参考核心全局参数async_workers_group

可在REQUEST_ROUTE中使用。

示例 1.11 async_task_group_route 使用示例

... async_workers_group="name=abc;workers=4;nonblock=0;usleep=0" ... request_route { ... async_task_route("RESUME", "abc"); ... } route[RESUME] { t_relay(); exit; } ...
4.7async_task_data(routename, data)

向第一组异步任务进程发送数据,进程会执行指定路由块,并可通过$async(data)读取传入的数据。

该函数不会挂起当前 SIP 报文,异步任务进程中也无法访问原始 SIP 报文,仅使用本地构造的虚拟 SIP 请求。
参数支持嵌入变量。

返回值:成功返回正值(true),失败返回负值(false)。

可在任意路由块(ANY_ROUTE)中使用。

示例 1.12 async_task_data 使用示例

... async_workers_group="name=abc;workers=4;nonblock=0;usleep=0" ... request_route { ... async_task_data("RESUME", "caller: $fU - callee: $tU"); ... } route[RESUME] { xinfo("$async(data)\n"); exit; } ...
4.8async_task_group_data(routename, groupname, data)

功能与async_task_data()一致,额外支持指定异步工作进程组的名称。更多细节可参考核心全局参数async_workers_group

返回值:成功返回正值(true),失败返回负值(false)。

可在任意路由块(ANY_ROUTE)中使用。

示例 1.13 async_task_group_data 使用示例

... async_workers_group="name=abc;workers=4;nonblock=0;usleep=0" ... request_route { ... async_task_group_data("RESUME", "abc", "caller: $fU - callee: $tU"); ... } route[RESUME] { xinfo("$async(data)\n"); exit; } ...
4.9async_tkv_emit(type, key, value)

触发一个「类型-键-值(TKV)」事件。

可在任意路由块(ANY_ROUTE)中使用。

示例 1.14 async_tkv_emit 使用示例

... async_workers_group="name=tkv;workers=1;nonblock=0;usleep=0" ... request_route { ... async_tkv_emit("8000", "call", "caller='$fU';callee='$tU'"); ... } event_route[core:tkv] { xinfo("$atkv(type) / $atkv(key) / $atkv(val)\n"); exit; } ...