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

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

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

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

8 Записаться

Курсы по Mikrotik MTCNA

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

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

1 Записаться

Курс по Zabbix

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

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

8 Записаться
Asterisk и Kafka
64
Доклад
Максим Нестеров
Asterisk и Kafka

Любая работающая установка Asterisk постоянно генерирует огромный поток данных. Эти данные принято называть артефактами телефонии. К ним относятся текстовые логи, записи разговоров, события AMI, события внутри шины Stasis и многое другое. Однако для большинства задач бизнеса и системного администрирования самыми важными являются CDR (Call Detail Record) и CEL (Channel Event Logging). Именно на их основе строится биллинг, отчеты для руководства и глубокая техническая аналитика звонков.

Традиционно в Asterisk предусмотрено множество способов хранения этой информации. Можно записывать всё в простые текстовые CSV-файлы, использовать адаптивные модули вроде CDR Custom или подключаться к реляционным базам данных через ODBC. Раньше была популярна прямая поддержка MySQL, но в последних версиях её убрали, оставив только вариант через прослойку. Тем не менее, когда инфраструктура разрастается, классические методы записи начинают буксовать. Возникают сложности с масштабированием, отказоустойчивостью и скоростью доставки данных до конечного потребителя. В таких ситуациях на помощь приходит Apache Kafka — мощный инструмент, который кардинально меняет подход к работе с событиями телефонии.

Почему стандартных баз данных становится недостаточно

Долгое время связка Asterisk и базы данных (Postgres, MySQL или MS SQL) считалась эталонной. Это просто: звонок завершился, модуль CDR собрал данные и отправил INSERT-запрос в таблицу. Но современная телефония — это уже не один сервер в серверной. Это облака, контейнеры и десятки инстансов.

Основные проблемы классического подхода:

  • Нагрузка на запись: При больших объемах звонков база данных может стать «узким местом». Если запись CDR блокируется, это может косвенно влиять на производительность самой телефонной станции.
  • Сложность доставки нескольким потребителям: Что, если данные о звонке нужны одновременно биллингу, системе CRM и отделу аналитики в ClickHouse? Приходится либо строить сложные системы репликации, либо заставлять каждого потребителя «ходить» в основную базу, что создает лишнюю нагрузку.
  • Отсутствие real-time обработки: Большинство стандартных модулей сбрасывают данные только после завершения звонка или с определенной задержкой. Для систем, требующих мгновенной реакции (например, динамического мониторинга фрода), это критично.
  • Сетевые проблемы: Если база данных находится на другом сервере и связь с ней кратковременно пропадает, Asterisk может потерять часть данных, если не настроены сложные механизмы кэширования и переподключения.

В таких условиях проектирование и настройка сети должны учитывать необходимость промежуточного слоя для хранения событий. Использование брокера сообщений позволяет отвязать процесс генерации данных от процесса их обработки.

Apache Kafka как центральное звено архитектуры

Apache Kafka — это не просто очередь сообщений, а распределенная платформа для потоковой передачи данных. Она идеально подходит для сбора CDR и CEL, так как изначально спроектирована для работы с огромными потоками событий.

В Kafka данные хранятся в топиках, которые делятся на партиции. Это позволяет распределять нагрузку между несколькими серверами (брокерами). Если один сервер выйдет из строя, данные сохранятся на других благодаря репликации. Но главное преимущество для телефонии заключается в модели «издатель-подписчик». Asterisk просто отправляет событие в Kafka, а любые другие системы (консьюмеры) могут забирать эти данные тогда, когда им удобно, и в том темпе, с которым они справляются.

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

Архитектура модуля интеграции: под капотом res_kafka

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

В основе лежит библиотека librdkafka. Это проверенное временем решение на языке C, которое обеспечивает стабильное соединение с кластером Kafka, берет на себя вопросы переподключений, буферизации и партиционирования. Модуль не является патчем к исходному коду Asterisk, он собирается отдельно, что значительно упрощает обновление системы.

Структура решения включает несколько модулей:

  1. res_kafka.so: Главный ресурсный модуль. Он инициализирует библиотеку, устанавливает соединения с брокерами и предоставляет API для других модулей Asterisk.
  2. cdr_kafka.so: Бэкэнд для CDR. Как только звонок заканчивается, этот модуль формирует структуру данных и передает её в res_kafka для отправки.
  3. cel_kafka.so: Аналогичный модуль для CEL, который фиксирует каждое событие в канале (поднятие трубки, перевод, удержание).
  4. app_kafka.so: Приложение для диалплана KafkaProduce. Оно позволяет отправлять в Kafka любые произвольные данные прямо в процессе выполнения сценария звонка.

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

Детальная настройка и конфигурационные файлы

Настройка интеграции разбита на логические блоки, чтобы не сваливать всё в один файл. Каждый модуль имеет свой конфиг, что упрощает администрирование.

Основные настройки соединения (res_kafka.conf)
Здесь указывается адрес кластера Kafka. Важно понимать, что в параметре bootstrap.servers не обязательно перечислять все узлы кластера. Достаточно указать один или два — после подключения библиотека сама запросит метаданные и узнает адреса всех остальных брокеров.

[general]
; Список брокеров через запятую
bootstrap.servers = 192.168.1.10:9092, 192.168.1.11:9092

Настройка CDR (cdr_kafka.conf)
В этом файле определяется, в какой топик будут улетать данные о звонках. Также здесь можно настроить формат даты. По умолчанию Asterisk может выдавать время в разных форматах, но для аналитики удобнее всего использовать ISO 8601 или обычный Timestamp.

[general]
enabled = yes
topic = asterisk-cdr
; Можно указать часовой пояс, если он отличается от системного
timezone = UTC

Настройка CEL (cel_kafka.conf)
Для CEL настроек чуть больше, так как событий может быть очень много. Можно фильтровать типы событий, которые не нужны, чтобы не засорять очередь лишней информацией. Это важно, так как CEL создает на порядок больше записей, чем CDR.

Формат данных: JSON как стандарт

Один из ключевых вопросов при передаче данных — это их формат. Модуль отправляет данные в формате JSON. Это наиболее универсальный вариант, который «понимают» практически все современные системы обработки данных.

Почему это удобно:

  • Сохранение типов данных: Если поле в Asterisk является числом (например, длительность звонка или статус disposition), оно и в JSON придет как число, а не как строка. Это избавляет от лишних преобразований на стороне приемника.
  • Имена полей: Используются стандартные имена полей из структур Asterisk. Это позволяет избежать путаницы, когда в разных бэкэндах (CSV, MySQL, ODBC) одни и те же данные называются по-разному.
  • Легкость расширения: В JSON легко добавить новые поля, не ломая логику работы существующих консьюмеров.

В планах развития модуля — поддержка более строгих форматов, таких как Avro или Protobuf. Они позволяют еще сильнее сжать данные и добавить проверку схем, что полезно в очень крупных инсталляциях. Но для большинства задач обычного JSON более чем достаточно.

Использование данных в ClickHouse

Самая частая связка сегодня — это Asterisk -> Kafka -> ClickHouse. ClickHouse — это колоночная база данных, которая идеально подходит для аналитики. Она позволяет выполнять запросы по миллионам звонков за доли секунды.

Процесс интеграции с ClickHouse выглядит следующим образом:

  1. Kafka Engine: В ClickHouse создается специальная таблица с движком Kafka. Она выступает в роли «пылесоса», который вычитывает сообщения из топика.
  2. Target Table: Создается обычная таблица (например, с движком MergeTree), где данные будут храниться постоянно.
  3. Materialized View: Это связующее звено. Материализованное представление автоматически забирает данные из таблицы-пылесоса, при необходимости трансформирует их и записывает в целевую таблицу.

Такая цепочка работает в реальном времени. Как только звонок завершился в Asterisk, через секунду его данные уже доступны для аналитического запроса в ClickHouse. Это позволяет строить онлайн-дашборды, на которых видно нагрузку на колл-центр «здесь и сейчас».

Надежность и обработка сбоев

Вопрос надежности всегда стоит на первом месте. Что произойдет, если сеть между Asterisk и Kafka «моргнет»?

Библиотека librdkafka имеет встроенные очереди. Если связь пропадает, сообщения накапливаются в памяти. Как только коннект восстанавливается, модуль «выстреливает» накопленные данные в брокер. Однако объем этой очереди не бесконечен и ограничен настройками памяти. Если Kafka будет недоступна слишком долго, данные начнут теряться.

Для минимизации рисков стоит уделить внимание разделу защита IP-ATC. Это касается не только безопасности от взлома, но и обеспечения живучести всех компонентов системы. В консоли Asterisk предусмотрены команды для мониторинга состояния Kafka: можно посмотреть количество отправленных сообщений, объем накопленной очереди и статус подключения к каждому брокеру. Если что-то идет не так, администратор сразу увидит это в логах.

Работа с распределенными системами

Когда у вас не один сервер Asterisk, а целый кластер, возникает проблема идентификации источников. Unique ID звонка на разных серверах может совпасть (хотя это и маловероятно), а главное — сложно понять, какой именно сервер обработал вызов.

Для решения этой задачи в модуле используется параметр SystemName из основного конфига asterisk.conf. Если он задан, то к каждому сообщению в Kafka добавляется идентификатор системы. Это позволяет консьюмеру легко фильтровать данные по конкретным узлам или регионам.

Также стоит упомянуть о приложении KafkaProduce. Оно открывает интересные возможности для кастомизации. Например, можно отправлять в Kafka информацию о том, какой пункт меню IVR выбрал пользователь, или фиксировать оценку качества обслуживания, которую поставил клиент. Эти данные не входят в стандартный CDR, но крайне полезны для бизнеса.

 

Заключение

Переход на использование брокера сообщений для сбора CDR и CEL — это шаг к созданию современной, масштабируемой и гибкой системы телефонии.

Кому это нужно в первую очередь:

  • Компаниям с высокой нагрузкой (от нескольких сотен одновременных звонков).
  • Проектам, где данные о звонках нужны нескольким независимым системам.
  • Тем, кто строит сложную аналитику на базе ClickHouse или ELK-стека.
  • Разработчикам, которым нужна real-time реакция на события в телефонии.

Использование Kafka позволяет забыть о проблемах с блокировками базы данных и сложностях доставки событий. Это решение делает Asterisk частью большого мира Big Data, позволяя эффективно обрабатывать информацию и получать от неё максимум пользы для бизнеса.

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

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

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

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

Наши
клиенты

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