Asterisk, ARI. Коммутируем как боги
Все записи

IT · 21 декабря 2021 · 2 мин чтения

Asterisk, ARI. Коммутируем как боги

В этой небольшой статье не будет ничего про dialplan Asterisk. Речь пойдёт про ARI - гибкий интерфейс для управления Asterisk.

Как только Asterisk получает INVITE и вызов уходит в наше приложение (Stasis), у нас появляется возможность собирать звонок на низком уровне.

Работа с ARI строится так: получаем события от Asterisk по WebSocket, обрабатываем их и создаём новые через HTTP REST API в сторону ARI.

StasisStart

Событие, которое получает наша программа, когда канал попадает в контекст Stasis, - StasisStart. Оно может сигнализировать, например, о начале исходящего или входящего вызова, и в ответ мы запускаем низкоуровневую логику: создаём канал в сторону другого абонента, добавляем его в бридж с каналом инициатора и делаем вызов.

Упрощённый сценарий обычного звонка

  1. Получили от ARI событие StasisStart о том, что создан канал A.
  2. Создали канал B с эндпоинтом в сторону SIP-пира или локального прокси (пример: SIP/MY_PEER/331234567890).
  3. Объединили канал A из шага 1 и канал B из шага 2 в бридж.
  4. Запустили dial в канал B.
  5. Дождались от ARI события ChannelStateChange по каналу B. Если состояние ‘Up’, делаем answer в канале A, и начинается разговор.
  6. При получении события ChannelHangupRequest по каналу A или B завершаем звонок.

Сессия звонка

Может понадобиться хранить данные о ходе звонка, включая CDR, по каждому каналу.

В качестве хранилища я бы рекомендовал Redis: при высоком CPS интенсивные запросы в базу могут сильно нагрузить диски и просадить производительность.

Оптимизация

Чтобы ARI-приложение нормально работало при высоком CPS, я бы советовал свести к минимуму запросы в реляционную базу. У меня на практике запросы шли только для небольшой логики лимитов при инициализации звонка и для записи CDR после его завершения. Всё остальное - в Redis.

Ещё рекомендую с точки зрения инфраструктуры держать ARI-приложение на одном хосте с Asterisk, чтобы снизить задержки.

Нагрузочный тест

Для теста я взял консольную утилиту baresip и bash-скриптом запустил 200 звонков на пул тестовых номеров, которые отвечают asterisk-овскими tt-monkeys.

200 параллельных звонков в сумме съели около 5% CPU. Все звонки завершились успешно, CDR записались.

Отладка stasis-приложения, которое сигнализирует об отвеченных звонках.
SIP-сигнализация

Читайте также