首页 > 解决方案 > Kamailio 伪变量 $var 在单个消息处理程序结束之前是否可以安全使用?

问题描述

我在 Kamailio 中使用伪变量 $var 因为根据文档,它们比 $dlg_var 快,但我想知道这样使用它们是否安全:

jansson_get("a", $http_rb, "$var(a)");

$var(i) = 0;
jansson_array_size("elements", $http_rb, "$var(elements_size)");

while($var(i) < $var(elements_size)) {
    jansson_get("elements[$var(i)].key", $http_rb, "$var(key)");
    jansson_get("elements[$var(i)].value", $http_rb, "$var(value)");
    insert_hf("$var(key): $var(value)\r\n");
    $var(i) = $var(i) + 1;
}

if ($var(a) == "some value") {
    route(RELAY);
}

我尝试在配置文件中使用一个进程设置 Kamailio,只是为了看看一个 Kamailio 进程如何处理消息。然后我同时拨打了两个电话,根据我的日志,似乎消息是同时处理的(我不确定一个 Kamailio 进程中是否有多个线程)。

所以,我的问题是:并发消息是否有可能覆盖 $var 的值(因为它是由同一个 Kamailio 进程处理的所有消息的共享变量),是否有一种安全的方法可以使用 $var 来最小化或消除它可能性?

我阅读了文档并指出:

“注意:脚本变量在初始化它的 Kamailio 进程中持续存在,因此请确保在读取它之前给它一个新值,否则您将获得由同一 Kamailio 进程处理的任何其他先前消息中分配的值(pid )。”

这篇笔记让我认为消息是按顺序处理的,或者至少我可以在处理单个消息时安全地使用 $var。我如何确保我提供的价值在我仍在使用时不会改变?

标签: concurrencysipkamailio

解决方案


并发处理不会覆盖 $var(x) 变量,$var(x) 的值存储在进程的私有内存中。Kamailio 不使用线程来处理 SIP 流量,只有当您将 Kamailio 配置为启动多个 SIP 工作进程时,才能并行处理 SIP 消息。

换句话说,看看您的示例,在处理该特定 SIP 消息时,$var(a) 不能被覆盖,无论其他 SIP 工作进程处理了多少其他 SIP 消息。$var(a) 值将在下一次相同的 SIP 工作进程处理新消息时更新,并且 jansson_get("a", "$http_rb", "$var(a)") 将再次执行 $var(a) 的不同值http_rb。

作为旁注,$http_rb 不是标准 Kamailio 发行版的有效变量,但我猜你要么编写了自己的扩展,要么是为了这个例子而给出的。


推荐阅读