Concurrency Kamailio伪变量$var在单个消息处理程序结束之前是否可以安全使用?

Concurrency Kamailio伪变量$var在单个消息处理程序结束之前是否可以安全使用?,concurrency,sip,kamailio,Concurrency,Sip,Kamailio,我在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(

我在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);
}
jansson_-get(“a”、$http_-rb、$var(a)”;
$var(i)=0;
jansson_数组大小(“元素”、$http_rb、$var(元素大小)”;
而($var(i)<$var(元素大小)){
jansson_-get(“元素[$var(i)].key”,$http_-rb,$var(key)”;
jansson_-get(“元素[$var(i)].value”、$http_-rb、$var(value)”;
插入\u hf(“$var(键):$var(值)\r\n”);
$var(i)=$var(i)+1;
}
如果($var(a)=“某个值”){
路线(接力);
}
我尝试在配置文件中用一个进程设置Kamailio,只是想看看一个Kamailio如何处理消息。然后我同时进行了两次调用,根据我的日志,消息似乎是并发处理的(我不确定一个Kamailio进程中是否有多个线程)

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

我阅读了文档,其中说明:

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


这个注释使我认为消息是按顺序处理的,或者至少我可以在处理单个消息时安全地使用$var。如何确保我给出的值在我仍在使用时不会更改?

在新消息循环开始时清除$vars变量的值

因此,对于单个消息,它是安全的


Kamailio运行X线程(可在配置/启动时配置),主循环将每条消息发送到其中一个线程。这样,处理可以并发并使用所有CPU。

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

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


作为旁注,$http_rb对于标准Kamailio发行版来说不是一个有效的变量,但我猜您要么编写了自己的扩展,要么就是为了这个示例而提供的。

如果您想要一个范围为SIP事务而不是进程(子进程)的变量,您可能需要使用$avp

实际上,$var(…)变量在新SIP消息处理开始时不会重置/清除,它们的值在许多SIP消息处理过程中每个进程都会保持不变。它们仅在显式赋值或作为配置中函数的输出参数时更新。脚本解释器没有自动更新(重置或其他值)。