Freeswitch: mod_distributor
mod_distributor распределяет вызовы по транкам (gateways) по весу в стиле round-robin (по кругу). Правила настраиваются в XML файле, где может быть назначено множество списков транков. Также вы можете использовать данный модуль не только для распределения вызовов между траками, но везде, где требуется какая-либо ротация, например Caller Id Number.
Установка
Отредактируйте modules.conf
и добавьте следующие строки:
applications/mod_distributor
тогда,
make mod_distributor
make mod_distributor-install
Укажите FS загружать модуль при старте добавив в файл $FS_CONF/autoload_configs/modules.conf.xml
следующие строки:
<load module="mod_distributor"/>
Использование
Есть несколько способов использовать распределитель, онднако чаще всего он используется с приложением bridge
<action application="bridge" data="sofia/gateway/${distributor(distributor_list)}/${destination_number}"/>
– или –
<action application="bridge" data="sofia/external/${destination_number}@${distributor(distributor_list)}"/>
Перечитать из командной строки конфиг distributor.conf.xml:
reloadxml distributor_ctl reload
Настройка
mod_distributor возвращает значение поля «node» из конфигурационного файла.
Рассмотрим пример:
<configuration name="distributor.conf" description="Distributor Configuration"> <lists> <!-- каждые 10 вызовов сначала будте возвращено foo1 один раз и затем foo2 раз...да, Девять раз! --> <!-- а например 100 с 10 и 90 возвратит foo1 10 раз подряд, а затем foo2 90 раз подряд --> <list name="test" total-weight="10"> <node name="foo1" weight="1"/> <node name="foo2" weight="9"/> </list> </lists> </configuration>
Список «test» имеет собственный вес равный 10. Возвратив 1 раз foo1 и 9 раз foo2, он начнет круг заново.
Попробуем сделать немного иначе:
<list name="alternating" total-weight="2"> <node name="alt_one" weight="1"/> <node name="alt_two" weight="1"/> </list>
В примере выше, каждый вызов будет возвращать попеременно alt_one и alt_two
Вы можете использовать это для равномерного распределения вызовов между несколькими транками. Давайте представим что у нас есть транки по имени gateway1, gateway2 и gateway3. Чтобы отправить каждый 3-й вызов через каждый транк добавьте в ваш distributor.conf.xml файл:
<list name="3gw" total-weight="3"> <node name="gateway1" weight="1"/> <node name="gateway2" weight="1"/> <node name="gateway3" weight="1"/> </list>
И затем назначьте в диалплане:
<extension name="3-way gateway distro"> <condition field="destination_number" expression="^(.*)$"> <action application="bridge" data="sofia/gateway/${distributor(3gw)}/$1"/> </condition> </extension>
Распределитель добавит имя транка вместо переменной.
Петля в XML Dialplan
Если вы хотите чтобы вызов был повторен в случае неудачи, вы можете добавить директиву loop в правило набора:
<extension name="3-way gateway distributor"> <condition field="destination_number" expression="^(.*)$"> <action application="set" data="continue_on_fail=true"/> <action application="set" data="hangup_after_bridge=true"/> <action application="bridge" data="sofia/gateway/${distributor(3gw)}/$1" loop="3"/> </condition> </extension>
Мёртвые транки
Исключить нерабочие транки из набора:
<action application="bridge" data="sofia/gateway/${distributor(<listname> ${sofia(profile <profilename> gwlist down)})}/$1"/>
–или–
Note: parentheses are optional on functions as vars: ${foo(bar)} is the same as ${foo bar}
<action application="bridge" data="sofia/gateway/${distributor <listname> ${sofia profile <profilename> gwlist down}}/$1"/>
–или–
<action application="bridge" data="sofia/gateway/${expand(distributor <listname> \${sofia(profile <profilename> gwlist down)})}/$1"/>
API Command
Использование в API:
expand distributor <listname> ${sofia profile <profilename> gwlist down}
Смотри также