ROM-Asterisk в высоконагруженных проектах интеграции

Публикация № 169174

Администрирование - Торговое оборудование - Телефония, SIP

Хочу поделиться опытом, нажитым непосильным трудом при реализации больших проектов по интеграции 1С и Asterisk.
ROM-Asterisk неплохо себя проявил под большими нагрузками. Выделю основные рекомендации, которые следует выполнять при интеграции с высоконагруженными Asterisk

Тонкая настройка фильтров на основе регулярных выражений

Фильтрация на базе регулярных выражений - это мощный инструмент внешней компоненты 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

Заключение

При реализации больших проектов всегда имеет место "эффект масштаба", когда каждая неточность умножается многократно. Однако, есть и положительный момент - оптимизация тоже умножается многократно.

Оптимизируйтесь Cool

Ссылки

ROM-Asterisk: свободная внешняя компонента для связи 1С и Asterisk

AstManProxy: open-source proxy для Asterisk Manager

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. krein 63 14.01.13 23:39 Сейчас в теме
Я так понял, что компонента ROM-Asterisk не дает переводить звонок,
это означает, что его вообще не перевести,
или просто придется это делать из софтфона и "событие" не скорректируется в 1с?
2. oleg.rizvanov 240 15.01.13 01:04 Сейчас в теме
(1) krein,
Перевод делается очень легко и просто.
Есть 2 вида перевода: условный и безусловный
Условный выполняется командой: Atxfer
Безусловный выполняется командой: Transfer
Эти команды нужно отправить на сервер методом компоненты ROM-Asterisk - ВыполнитьКоманду()
Так что, все у вас получится :-)
3. wondermaker 13.06.13 05:04 Сейчас в теме
Прокси для АТС? Все сидят и "слушают"?
А может проще можно сделать? Зачем всем сидеть "в консоли", покдлюченными к АТС, если можно устроить игру "царь горы", когда этим занимается 3-5 пользователей, динамически отслеживающих наличие входящих вызовов и пишут это в регистр. А уже прочие пользователи просто получают информацию из регистра и "понимают", что звонок касается их номера.
Если один из "слушателей" отвалился (нет данных о том, что он следит за АТС крайние 2-3-5 секунд - следим через РегСвед), то новый становится на его место и следит и пишет события телефонии в регистр. Основные проблемы - это определение "царей" и исключение дублей в регистре при записи несколькими слушателями.
Оригинацию звонков делают все подключенные клиенты своими компонентами - там нагрузка не велика.
В итоге, при 3-5 слушателях будет еще 2-3 одновременных подключения (не знаю сколько нужно осуществлять звонков, чтобы каждую секунду было больше вызовов).

Пока у нас нагрузка небольшая и пропущенных вызовов не замечено, но это явно лучше, чем мучать АТС прокси.

P.S. пояснение: компонента работает только на клиенте, посему сделать одно подключение с севера без клиентов не получается.
4. oleg.rizvanov 240 13.06.13 11:31 Сейчас в теме
(3) wondermaker,

ИМХО, не взлетит...

1) Допустим у нас 100 одновременных звонков в минуту (для колл-центра, это нормально). По каждому звонку нам нужно как минимум 3-4 события. Обязательные: начало звонка, соединение с абонентом, завершение звонка. Опционально: файл записи. В итоге, в регистр сведений, который вы предлагаете, будет попадать 300-400 записей в минуту. Соответственно, за день - 144 000 записей, а за 7 дней их будет уже миллион (точнее 1008000).

2) Представьте нагрузку на сервер БД и на сервер приложений 1С... Кроме того, что сервер будет записывать большое количество записей, так еще каждые 2-3-5 секунд, как вы предлагаете, его будет дергать 1С-клиенты, чтобы спросить "а нет ли для меня событий в регистре сведений?".
Вам ресурсов хватит? Ведь пользователи еще должны работать, например, Расходные проводить...

И последнее... Насчет вашего P.S.-а
компонента работает только на клиенте, посему сделать одно подключение с севера без клиентов не получается

А какой в этом смысл?
Допустим, у вас есть волшебная ВК, которая работает на сервере (это сделать не сложно) и вы даже написали серверную функцию, которая слушает Asterisk. И что дальше? Кто вызовет эту серверную функцию? Она сама вызовется или все-таки нужен клиент?
А если, все равно нужен клиент, то напрашивается вопрос: "А зачем тогда сервер, если все можно сделать на клиенте???"

P.S.
Вы хороший спецалист, просто не до конца разобрались в проблеме :)
5. wondermaker 14.06.13 04:11 Сейчас в теме
Количество записей не критично, т.к. в данном регистре хранить все записи нет смысла - они чисто для обработки в текущем режиме и можно очищать периодически.

А тут мы и решаем какие события ловим - нужно ли нам знать кто на линию попал?
Если используется очередь, то какой смысл знать, что кто-то есть в очереди? Ловим только событие поднятия трубки и пишем данные в регистр. Задержка в появлении мастера создания нового события (а там еще поиск номера телефона по базе в 300 тыс. строк) составляет в рабочем режиме 1-2 секунды (т.е. оператор/менеджер еще не успел сказать "драсьте", а окно уже показывает кто на линии. Максимум задержки поймали в 5 секунд при первом запуске на тестовом сервере.

У нас на одном сервере работает несколько баз с общим количеством одновременно работающих пользователей порядка 160-170 и обрабатываемые объемы информации не малы. А база, к которой прикрутили ASterisk крутится на другом более мощном сервере с минимальной нагрузкой.

В одной конфигурации видел схему, когда внешний сервис мониторит Asterisk и передает данные на web-сервис в 1С. Минусы за полгода выловили такие
1) при не очень большой нагрузке (порядка 20-30 звонков в минуту) были пропущенные звонки - тоочнее из-за задержки обработки попадали в базу через 5-10 секунд. Фильтры не достаточно гибкие
2) схема работы внешней программы не оптимальна - подклчюение к web-сервису происходил по 12-13 раз в секунду, что, подозреваю, и приводит к потерям и задержкам
3) периодически софт подвисает и звонки не поступают в базу.

С нашей схемой такого не наблюдается, хотя нагрузка выше.

Нагрузки в 100 звонков в минуту у нас, пока, не предвидится, хотя, было бы интересно увидеть что будет. Но у нас еще многие пользователи заведены на другие АТС и постепенно будут переведены на Asterisk.

> просто не до конца разобрались в проблеме
Всё может быть :)
6. oleg.rizvanov 240 14.06.13 12:10 Сейчас в теме
(5) wondermaker,
Нагрузки в 100 звонков в минуту у нас, пока, не предвидится, хотя, было бы интересно увидеть что будет. Но у нас еще многие пользователи заведены на другие АТС и постепенно будут переведены на Asterisk.

Будет весело, гарантирую :)

С нашей схемой такого не наблюдается, хотя нагрузка выше.

Наверное компонента хорошая :)
11. comol 4170 28.04.15 18:13 Сейчас в теме
(5) wondermaker, (4) Коллеги, а правильно я понимаю если "Слушает" порядка 50-70 человек то надо уже устанавливать AMI Porxy, потому как обрыв и установка соединения в этом случае дело нормальное, потому как Asterisk Manager "не любит" множественные к нему соединения?
12. oleg.rizvanov 240 28.04.15 22:46 Сейчас в теме
(11) comol,
Не факт. Если есть обрывы, то надо разбираться почему они происходят.

Начиная с версии Asterisk 1.8 работа AMI стала куда лучше, чем в 1.6. На версии 11, 13 у меня тоже нареканий нет.

АМИ-прокси - это вариант, но я пока не встречал нормальных прокси без утечек и потерь пакетов. ИМХО, прокси может стать дополнительным гемором.

Какая версия Астериск у вас используется? При каком кол-ве наблюдаете выпадения?
13. comol 4170 30.04.15 18:29 Сейчас в теме
(12) 1.8 Обрывы есть... пользователей около 50
15. oleg.rizvanov 240 01.05.15 01:36 Сейчас в теме
(13) comol,
При 50-ти вроде не должно такого быть.

Может АМИ рвет коннекшн по таймауту записи в клиентский сокет?
По дефолту у АМИ стоит таймаут 0,1 сек (100 мс). Попробуйте поставить 5 сек (5000 мс) или 10.
Если разрывов станет меньше, значит где-то там собака порылась.

P.S.
А вообще, лечить по фотографии - дело неблагодарное. Описали бы проблему детальнее. если есть желание
16. oleg.rizvanov 240 01.05.15 01:43 Сейчас в теме
(13) comol,

Параметр называется writetimeout, живет в секции юзера

Вот здесь пример есть

Вот здесь статья которая может пригодиться
17. comol 4170 05.05.15 19:59 Сейчас в теме
(16) Спасибо... только изменение конфигурационных файлов и core restart мы чувствую долго согласовывать будем.. Если вообще согласуем... Прокси это совсем плохо, да?
18. oleg.rizvanov 240 06.05.15 00:12 Сейчас в теме
(17) comol,

Прокси - это прокси, и хорошо, и плохо. Вот например, HTTP-прокси - это хорошо или плохо?

Как по мне, то хз, но глюки будут точно. Ибо вы вносите в схему дополнительную прокладку
19. comol 4170 06.05.15 10:56 Сейчас в теме
(18) Понятно.... А какой лучший прокси если знаете? Или какие вообще в природе существуют...
14. comol 4170 30.04.15 18:30 Сейчас в теме
(12)
разбираться почему они происходят
это Ehtereal или TcpDump имеется ввиду?... Или есть проще варианты?
7. Aspirant 2 30.01.14 18:35 Сейчас в теме
Тонкая настройка фильтров на основе регулярных выражений/
Как я понимаю это настройка выполнится для конкретного соединения?
Тоесть к примеру такой вариант работы:
Работают через терминальные сессии на сервере. Запускают одну и ту же компоненту dll.
При такой фильтрации каждый пользователь устанавливает свой фильтр и только для себя?



8. oleg.rizvanov 240 06.02.14 16:33 Сейчас в теме
(7) Aspirant,
Для каждого экземляра ВК - свой фильтр. Если сеанс пользователя использует 1 экземляр ВК, то соотношение Фильтр:Пользователь как 1:1
9. ovcharenko.di 30.10.14 18:18 Сейчас в теме
У меня такой вопрос:

разбор регулярного выражения

Dial.{1,}?Begin.{1,}?902|Bridge.{1,}?902|Hangup.{1,}?902


происходит в режиме, когда метасимвол '.' соответствует также переносу строки? По умолчанию в PCRE - не соответствует.

Я пробовал без этого режима тестировать ваше выражение с вашим же текстом события на http://regex101.com/
Без модификатора /s совпадения, естественно, нет

Это правильно? Или я где-то ошибаюсь?
10. oleg.rizvanov 240 31.10.14 22:19 Сейчас в теме
Все очень, очень просто - библиотека ROM-Asterisk свободная. Мы очень любим open-source. И мы воспользовались фришной библиотекой PCRE.

ROM-Asterisk умеет все, что умеет PCRE
20. Dmitry_Shelchkov 25.03.16 15:25 Сейчас в теме
Здравствуйте! А подскажите, пожалуйста, можно ли сделать фильтр по двум номерам? т.е. не только по 902, а, например 902 и 903?
21. oleg.rizvanov 240 25.03.16 18:53 Сейчас в теме
22. user986187 19.12.19 13:44 Сейчас в теме
Здравствуйте. интересует интеграция 1с с астериск.
Как с вами связаться?
wrofdt@ya.ru
Оставьте свое сообщение

См. также

Подборка решений для взаимодействия со ФГИС «Меркурий» Промо

С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.

Настройка Рарус: СофтФон с SIP телефонией на примере оператора Телфин

Статья Системный администратор Программист Нет файла v8 1С:CRM Windows Управление взаимоотношениями с клиентами (СRM) Бесплатно (free) Телефония, SIP

Описание настройки Рарус СофтФон для работы с SIP телефонией на примере конфигурации Управление торговлей и взаимоотношениями с клиентами (CRM), редакция 2.0.

26.02.2018    12754    de0nis    0       

Как мы научили 1С генерировать IVR меню для Asterisk

Статья Системный администратор Программист Нет файла v8 1cv8.cf Windows Бесплатно (free) Практика программирования Телефония, SIP

Пример алгоритма интеллектуальной маршрутизации вызовов из 1С для Asterisk. На стороне 1С собирается статистика по касаниям между сотрудниками и клиентами, а на стороне Asterisk генерируется голосовое приветствие с помощью облачного сервиса синтеза речи.

15.12.2015    20188    jorikfon    7       

1C:Предприятие для программистов: Расчетные задачи (зарплата). Онлайн-интенсив с 01 по 17 июня 2020 г. Промо

Данный онлайн-курс предусматривает изучение механизмов платформы “1С:Предприятие”, которые предназначены для автоматизации периодических расчетов, а именно - для расчета зарплаты. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей прикладного решения “1С:Зарплата и управление персоналом” и прочих прикладных решений, в которых реализован функционал расчета зарплаты.

4900 рублей

Что можно получить от интеграции 1С:CRM 8 и телефонии Asterisk

Статья Системный администратор Программист Пользователь Нет файла v8 Бесплатно (free) Телефония, SIP

Мы более года тесно занимаемся разработкой решений по интеграции телефонии на базе Asterisk и программ 1С. В первую очередь мы испытываем решения на себе, и я хочу поделиться опытом о том, что можно получить от такой интеграции. У нас используется терминальная схема работы с 1С:CRM. На столе у каждого сотрудника IP телефон, который подключен по локальной сети к IP ATС Askozia, развернутой вместе с терминальным 1С сервером внутри VMware инфраструктуры в ближайшем ЦОДе.

04.03.2013    37139    jorikfon    19       

Интеграция 1С:CRM и Asterisk с помощью PHP-AGI и веб-сервисов 1C

Статья Программист Нет файла v8 1cv8.cf ИТ-компания Россия Windows Управление взаимоотношениями с клиентами (СRM) Бесплатно (free) Телефония, SIP

Давно зрел вопрос, можно ли встроить в диалплан Asterisk обращение к 1С:CRM системе для выполнения каких-либо управляющих действий и можно ли из 1С управлять IP АТС? Схема работы простейшая — при входящем звонке спросить у 1С что с ним делать, и если 1С ответила, то выполнить команду или продолжить стандартное выполнение маршрута вызова.

08.02.2013    30214    boffart    6       

Готовые переносы данных из различных конфигураций 1C Промо

Рекомендуем готовые решения для переноса данных из различных конфигураций 1C. C техподдержкой от разработчиков и гарантией от Инфостарт.