concurrency - 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。我如何确保我提供的价值在我仍在使用时不会改变?
解决方案
并发处理不会覆盖 $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 发行版的有效变量,但我猜你要么编写了自己的扩展,要么是为了这个例子而给出的。
推荐阅读
- javascript - 在页面上的文本中插入今天的日期加上两天(JavaScript?)
- c# - 跨进程互斥体实例化
- c# - 我可以在 Unity 运行时加载抽象类吗?
- python - 使用 QRunnable 进行线程处理 - 发送双向回调的正确方式
- javascript - React app - 调试器和控制台日志之间的差异
- python - Python散点图不适用于“无”点
- excel - 根据在另一张纸上输入的值自动排序一张纸
- qt - 当我尝试运行在另一台 Mac 上构建的应用程序时找不到 Qt 库
- php - 尽管凭据正确,Laravel 7X admin/login 仍会循环回到 admin/login
- java - JUnit:使用 RowCallbackHandler 模拟 jdbcTemplate 的 query() 方法