Тонкая настройка фильтров на основе регулярных выражений
Фильтрация на базе регулярных выражений - это мощный инструмент внешней компоненты ROM-Asterisk. В других внешних компонентах для работы с Asterisk эта функциональность отсутствует.
Именно эта функциональность дает возможность успешно реализовать проекты в больших call-центрах, где идет серьезный поток звонков и Asterisk генерирует огромное количество событий.
Правильная настройка фильтра регулярных выражений дает возможность "отбить" лишние события еще на стороне ROM-Asterisk, не пуская их в процедуру ОбработкаВнешнегоСобытия и тем самым значительно снять нагрузку с пользовательского сеанса 1С.
В идеале, сеанс пользователя 1С должен получать только те события Asterisk, которые касаются только его.
Пример
Пользователь Василий имеет внутренний номер телефона "902".
При начале входящего звонка, еще до поднятия трубки, необходимо показать номер звонящего. А при ответе на звонок, необходимо создать документ "Событие".
Соответственно, пользовательский сеанс 1С должен отслеживать события Asterisk: Dial, Bridge и Hangup. Но, не все, а только касающиеся номера "902".
Событие Dial выглядит следующим образом:
Event: Dial
Privilege: call,all
SubEvent: Begin
Channel: SIP/202-0000019c
Destination: SIP/902-0000019d
CallerIDNum: 202
CallerIDName: Operator-202
ConnectedLineNum: 902
ConnectedLineName: Vasiliy-902
UniqueID: 1335616897.790
DestUniqueID: 1335616897.791 Dialstring: 902
Для этого применим регулярное выражение:
Dial.{1,}?902|Bridge.{1,}?902|Hangup.{1,}?902
Можно слегка усложнить задачу, ведь нам важно получать только события начала звонка, т.е. Dial...Begin, а в при использовании фильтра выше, в сеанс Василия попадут еще и события окончания набора Dial...End. Модифицируем регулярное выражение:
Dial.{1,}?Begin.{1,}?902|Bridge.{1,}?902|Hangup.{1,}?902
Установка строки фильтра выполняется с помощью метода УстановитьРегулярноеВыражение объекта ROM-Asterisk.
Правильная настройка фильтров классов событий Asterisk
Еще одним способом уменьшить количество событий, обрабатываемых сеансом 1С, является установка фильтра классов событий Asterisk.
Например, если в сеансе пользователя 1С нужно получать только события о звонках, тогда имеет смысл ограничить этот сеанс только классом "call". Сделаем это с помощью команды Events:
Action: Events Eventmask: call
Отправка команды серверу Asterisk выполняется с помощью метода ВыполнитьКоманду объекта ROM-Asterisk.
Обязательное закрытие клиентского соединения с Asterisk
ROM-Asterisk дает возможность клиентскому сеансу 1С открывать более одного соединения. Поэтому, при закрытии сеанса следует выполнить команду Logoff, чтобы не оставлять Asterisk Manager "висящих" коннекций.
Action: Logoff
Отправка команды серверу Asterisk выполняется с помощью метода ВыполнитьКоманду объекта ROM-Asterisk.
Использование проксирования при большом количестве клиентов
При большом количестве клиентских соединений Asterisk Manager может начать обрывать соединения. Опытным путем установлено, что данная проблема возникает при использовании более 50-ти соединений.
Для решения этой проблемы, можно использовать так называемые AMI-proxy. Принцип их работы в том, что все клиентские сессии они держат на себе, а к Asterisk Manager-у имеется только одна коннекция. Достаточно хорошо себя зарекомендовал AstManProxy. Проект открытый и неплохо документирован.
Коллеги из МИКО написали в блоге статью по установке AstManProxy
Заключение
При реализации больших проектов всегда имеет место "эффект масштаба", когда каждая неточность умножается многократно. Однако, есть и положительный момент - оптимизация тоже умножается многократно.
Оптимизируйтесь
Ссылки
ROM-Asterisk: свободная внешняя компонента для связи 1С и Asterisk