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>

Распределитель добавит имя транка вместо переменной.

Если вы хотите чтобы вызов был повторен в случае неудачи, вы можете добавить директиву 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:

expand distributor <listname> ${sofia profile <profilename> gwlist down}

Смотри также

 

  • freeswitch/mod/mod_distributor.txt
  • Последние изменения: 2023/11/08