Безопасно ли использовать псевдопеременные Kamailio $ var до конца одного обработчика сообщений? - PullRequest
0 голосов
/ 04 марта 2020

Я использую псевдопеременные $ var в Kamailio, потому что, согласно документации, они быстрее, чем $ 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 при обработке одного сообщения. Как я могу быть уверен, что данное мной значение не изменится, пока я его еще использую?

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Параллельная обработка не перезаписывает переменные $ var (x), значение $ var (x) сохраняется в личной памяти процесса. Kamailio не использует потоки для обработки трафика SIP c, параллельная обработка сообщений SIP может происходить, только если вы настроили Kamailio для запуска более одного рабочего процесса SIP.

Другими словами, глядя на ваш пример, $ var (a) не может быть перезаписан при обработке этого * SIP-сообщения c, независимо от того, сколько других SIP-сообщений обрабатываются другими рабочими процессами SIP. Значение $ var (a) будет обновлено в следующий раз, когда тот же рабочий процесс SIP обработает новое сообщение, и jansson_get ("a", "$ http_rb", "$ var (a)") будет снова выполнен с другим значением для $ http_rb.

В качестве примечания: $ http_rb не является допустимой переменной со стандартным дистрибутивом Kamailio, но я думаю, вы либо написали свое собственное расширение, либо было дано для примера.

0 голосов
/ 10 марта 2020

Значения переменных $ vars очищаются в начале нового сообщения l oop.

Так что для отдельного сообщения это безопасно.

Kamailio запускает X потоков (настраивается в конфигурации / при запуске) основной l oop отправляет каждое сообщение одному из потоков. Таким образом, обработка может go согласовать и использовать все процессоры.

...