Яндекс.Метрика

RealTime в Asterisk: архитектура и конфигурация

RealTime в Asterisk: архитектура и конфигурация с 5 октября по 9 октября

Количество
свободных мест

8 Записаться

Курсы по Mikrotik MTCNA

Курсы по Mikrotik MTCNA с 6 апреля по 10 апреля

Количество
свободных мест

1 Записаться

Курс по Zabbix

Zabbix: мониторинг Asterisk и VoIP с 7 сентября по 11 сентября

Количество
свободных мест

8 Записаться
Распределенная очередь коллцентра с помощью ARI и app_queue
76
Доклад
Андрей Ярин
Распределенная очередь коллцентра с помощью ARI и app_queue

В сфере построения современных систем связи стандартные механизмы обработки вызовов рано или поздно упираются в потолок. Речь идет о ситуациях, когда классическая архитектура Asterisk с её привычными модулями перестает справляться с задачами масштабирования. Одной из самых «больных» тем здесь является организация очередей. Привычная схема, где есть один сервер и встроенный модуль обработки, отлично работает в малом бизнесе, но мгновенно рассыпается, как только проект вырастает в распределенную систему с балансировкой нагрузки.

Проблема не в самом Asterisk, а в том, как устроена логика обработки звонков в условиях высокой доступности. Когда в системе появляется больше одного узла обработки, а регистрация абонентов выносится на внешние прокси-серверы вроде Kamailio, стандартные инструменты управления очередями начинают мешать. Звонок может «гулять» между серверами, данные о состоянии операторов могут быть разрознены, а единой точки контроля просто не существует. В такой ситуации единственный выход — перестать пытаться «натянуть» старые решения на новые реалии и собрать систему очередей заново, используя микросервисный подход и современные инструменты вроде ARI и Redis.
 
 

Почему стандартные очереди больше не тянут

Основной камень преткновения — это монолитность классических решений. Тот же app_queue привык, что он «царь и бог» внутри одного конкретного сервера. Он сам хранит очередь, сам следит за статусами операторов, сам проигрывает музыку в ожидании. Но в реальности крупных инсталляций всё выглядит иначе. Часто приходится использовать схемы с несколькими Stateless Proxy, где звонки распределяются между пулом серверов Asterisk. В такой конфигурации один и тот же вызов может проходить через балансировщик несколько раз, создавая «зигзаги» в трафике.

Когда регистрация уходит на внешний уровень, app_queue теряет понимание того, кто из операторов свободен, а кто — нет. Можно пытаться городить костыли через кастомные экстеншены и проверки статусов, но как только добавляется второй или третий сервер Asterisk, ситуация становится неуправляемой. Нужно собрать одну логическую очередь из нескольких физических серверов, и при этом сделать так, чтобы нагрузка распределялась равномерно, а не по принципу «кто первый схватил». Использование стандартных модулей здесь превращается в бесконечную борьбу с их внутренними ограничениями.

Основные сложности при попытке масштабирования классики:

  • Отсутствие общей памяти: каждый сервер видит только «свои» звонки и своих операторов.
  • Проблемы с регистрацией: когда телефоны висят не на самом Asterisk, а на прокси, модуль очередей не может адекватно мониторить состояние линии.
  • Жесткая логика: невозможно гибко изменить алгоритм выбора оператора или правила уведомлений «на лету» без перезагрузки конфигов.
  • Сложность балансировки: стандартная очередь не умеет эффективно передавать звонок между узлами, если один из них перегружен.

В таких условиях проектирование и настройка сети требует совершенно иного взгляда на телефонию — как на набор независимых сервисов, которые общаются между собой через быстрые шины данных.
 
 

Разбор очереди на «запчасти»

Чтобы построить по-настоящему гибкую систему, нужно сначала понять, из чего на самом деле состоит любая очередь вызовов. Если отбросить всё лишнее и посмотреть на процесс со стороны микросервисов, то мы увидим несколько независимых функциональных блоков. Первый — это само хранилище данных, то есть список звонков, которые ждут ответа. Второй — это база операторов с их текущими статусами. Третий — логика или «мозг» системы (Call Manager), который решает, кого с кем соединить. И четвертый — сервис уведомлений и аудио-сопровождения.

Такая декомпозиция позволяет вынести каждый элемент в отдельный слой. Например, хранение очереди идеально ложится на структуру данных Redis. Это сверхбыстрое хранилище в оперативной памяти, которое поддерживает работу со списками «из коробки». Мы можем просто добавлять идентификатор канала в хвост списка и забирать его из головы. При этом совершенно неважно, на каком сервере физически находится этот канал — информация о нем доступна всей системе мгновенно.

В этот момент установка Asterisk перестает быть установкой «комбайна» всё-в-одном. Сервер превращается в исполнительный механизм, который просто управляет медиа-потоками и каналами через ARI (Asterisk REST Interface), подчиняясь командам извне. Сама же бизнес-логика — кто за кем стоит и кому звонить — живет отдельно, в Call Manager.
 
 

Архитектура на базе ARI и Redis: как это работает на деле

Вся магия распределенной очереди строится на связке Asterisk REST Interface и Redis. Когда звонок прилетает на сервер, он попадает в ARI-приложение. Это приложение не пытается само решить судьбу вызова. Оно просто берет уникальный ID канала, добавляет к нему адрес текущего сервера и кладет эту «метку» в соответствующий список в Redis. Всё, с этого момента звонок встал в очередь.

Основные преимущества использования Redis для этих задач:

  • Скорость: время отклика исчисляется микросекундами, что критично для обработки голоса.
  • Атомарность: операции со списками (LPUSH, RPOP) гарантируют, что один и тот же звонок не будет выдан двум разным обработчикам одновременно.
  • Публикации и подписки (Pub/Sub): система мгновенно узнает о событиях, например, когда абонент повесил трубку, не дождавшись ответа.
  • Прозрачность: в любой момент можно заглянуть в базу и увидеть реальную картину во всех очередях сразу.

Пока абонент висит в ожидании, ARI-приложение просто проигрывает ему музыку. Но как сделать так, чтобы человек не чувствовал себя брошенным? Здесь на сцену выходят уведомления. Вместо того чтобы встраивать таймеры внутрь приложения (что делает его «тяжелым» и зависимым от состояния), используется механизм TTL (Time To Live) в Redis. Мы создаем ключ с определенным временем жизни. Как только время истекает, Redis генерирует событие, Call Manager его ловит и дает команду Asterisk: «Проиграй этому каналу его позицию в очереди». Это позволяет сделать систему полностью Stateless — если ARI-модуль перезагрузится, он просто подхватит данные из Redis и продолжит работу как ни в чем не бывало.
 
 

Роль Call Manager и управление операторами

Call Manager — это сердце системы, отдельный процесс (написанный, например, на PHP или Go), который в бесконечном цикле опрашивает очереди в Redis. Его логика проста, но эффективна: он смотрит, есть ли в очереди свободные абоненты, и есть ли для них свободные операторы. Если пара найдена, он инициирует звонок. Важно, что Call Manager не «висит» на канале Asterisk. Он лишь отдает высокоуровневые команды через API.

Данные об операторах также хранятся в Redis. Это позволяет Kamailio или любому другому внешнему прокси-серверу обновлять статусы агентов независимо от Asterisk. Если оператор залогинился, отошел на перерыв или начал разговор — эта информация тут же попадает в общую базу. Call Manager видит эти изменения и моментально корректирует стратегию обзвона.

Для хранения настроек очередей (время ожидания, музыка, лимиты) разумно использовать классическую базу MySQL. Это дает удобный интерфейс для администраторов и клиентов. Такая модернизация АТС позволяет превратить телефонию в гибкий продукт, где любые параметры можно менять через веб-панель без вмешательства в код или конфиги серверов. Каждая очередь может иметь свои уникальные настройки, которые Call Manager считывает при инициализации.
 
 

Масштабирование и работа в облачных средах

Поскольку описанная архитектура основана на разделении логики и данных, она идеально вписывается в концепцию облачного развертывания и контейнеризации. Все компоненты системы могут работать внутри Kubernetes. Если нагрузка растет, мы просто добавляем новые поды с Asterisk. Каждый новый узел подключается к общему Redis и API, мгновенно включаясь в работу.

В распределенной системе критически важна стабильность медиа-серверов. Использование ARI позволяет сделать эти сервера максимально простыми. Их задача — выполнять команды: «создай мост», «проиграй файл», «соедини каналы». Вся сложная аналитика и принятие решений вынесены наружу. Это значительно снижает вероятность падения Asterisk из-за перегрузки логическими операциями. В такой конфигурации защита IP-ATC становится проще, так как периметр безопасности можно выстроить вокруг API-шлюза и балансировщиков.

Интересная особенность такого подхода — универсальность. Очередь — это всего лишь список в Redis. Если нам нужно организовать звонок на группу (Group Call), мы используем ту же самую логику, просто ограничиваем количество элементов в списке одним вызовом. Call Manager обрабатывает группы и очереди одинаково, что упрощает кодовую базу и снижает количество ошибок.
 
 

API как связующее звено

Для того чтобы всё это многообразие модулей работало как единое целое, используется слой API. Это критически важная деталь. Call Manager не должен знать специфику команд конкретной версии Asterisk или нюансы работы с каналами во FreeSwitch. Он общается с высокоуровневым API. Например, вместо того чтобы вручную управлять медиа-файлами для информирования абонента, Call Manager отправляет запрос: notify_position(channel_id, position).

Этот слой абстракции дает колоссальную свободу:

  1. Смена платформы: можно заменить Asterisk на любой другой движок телефонии, просто переписав адаптер для API.
  2. Безопасность: Call Manager не имеет прямого доступа к критическим узлам АТС.
  3. Упрощение отладки: всегда можно посмотреть логи API и понять, на каком этапе произошел сбой — в логике принятия решений или в исполнении команды на сервере.
  4. Отказоустойчивость: если один сервер Asterisk недоступен, API-слой может автоматически перенаправить команду на резервный узел.

Такой подход позволяет строить системы, которые практически невозможно «уронить» целиком. Даже если упадет сам Call Manager, звонки останутся в очередях Redis, а ARI-приложения на серверах продолжат играть музыку абонентам, пока менеджер не поднимется и не возобновит распределение.
 
 

 

Заключение

Микросервисный подход к очередям в Asterisk — это не просто дань моде, а производственная необходимость для крупных проектов. Вынос логики в Call Manager, использование Redis для хранения состояний и управление через ARI позволяют забыть о проблемах масштабирования и ограничениях стандартных модулей. Мы получаем систему, которая легко переживает рост нагрузки, просто расширяясь добавлением новых узлов.

Для бизнеса такая архитектура означает прежде всего надежность и гибкость. Возможность моментально менять сценарии обслуживания, добавлять новые функции без остановки системы и прозрачно мониторить каждый звонок в реальном времени — это то, что отличает современную телефонию от устаревших решений. Конечно, такая система требует качественного наполнения, и здесь часто помогает профессиональная запись IVR, чтобы голос системы звучал так же безупречно, как работает её внутренняя логика. В конечном счете, разделение ответственности между компонентами делает систему прозрачной, управляемой и готовой к любым вызовам современного рынка связи.

Ежегодная конференция по Asterisk 2026!

Билеты уже в продаже!

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

Наши
клиенты

Посмотреть все