Статьи

Предсказуемые подводные камни масштабирования VoIP к кластеру

Избегайте этих ловушек масштабирования VoIP к кластеру.

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

Вам также может понравиться: Масштабируемость приложений — Как сделать эффективное масштабирование

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

Введение в VoIP сервер

Если такие имена, как FreeSWITCH, Asterisk, SIP, RTP, WebRTC , не являются для вас просто пустяком, смело пропускайте эту часть.

Мир VoIP стоит на двух основных столпах: SIP и RTP. Это два протокола, которые были разработаны в конце прошлого века и пришли к нам из мира телефонии. SIP  (Session Initiation Protocol) — это командный протокол, который отвечает за выбор кодеков, начало / конец вызова, управление вызовом (удержание / передача / и т. Д.) И имеет огромное количество расширений, включая отправку текстовых сообщений, уведомление левых голосовых сообщений и т. д.

IP-телефоны различных производителей могут поддерживать собственный набор расширений. Например, BLF (Busy Lamp Field) очень распространено — поле светодиодов на настольном телефоне, которое можно настроить так, чтобы они отображали состояние телефона другого сотрудника. 

RTP ( транспортный протокол реального времени ) — это медиапроток, который отвечает за передачу аудио- и видеоданных. Он использует различные кодеки для кодирования медиа-данных.

Оба протокола реализованы по умолчанию через UDP. Почти у каждого есть TCP в качестве опции, но UDP лучше по нескольким причинам. Шифрование доступно для обоих протоколов.

Архитектура VoIP основана на идее, что серверы SIP и RTP — это два разных сервера, поэтому существуют реализации серверов, которые поддерживают только SIP или только RTP. Тем не менее, FreeSWITCH  и Asterisk  являются серверами с открытым исходным кодом, которые поддерживают оба этих протокола, а также некоторые другие. Выбор между ними во многом зависит от личных предпочтений, требований и задач интеграции, но оба они позволяют вам получить офисную АТС из коробки.

И последнее , но не в последнюю очередь WebRTC  (Web Real-Time Communication) . Это де-факто стандарт для голосовых вызовов в Интернете. WebRTC использует SRTP (безопасный RTP), оставляя реализацию командного уровня во власти кода JS. Для вызова p2p все, что вам нужно сделать, это передать свой адрес и параметры вызова другой стороне, что можно сделать на основе любого протокола. Если вам требуется интеграция с SIP-сервером, обычно используется протокол « SIP over WebSocket ». Реализация — sipjs.com.

FreeSWITCH поддерживает как SIP over WebSocket, так и его альтернативный протокол, реализованный модулем mod_vertoo, разработанный специально для интеграции с WebRTC, который устраняет любые возможные неприятности, возникающие из-за несовместимости WebRTC и SIP, которые в противном случае привели бы к задержке в 1-5 секунд перед вызовом , Существует несколько способов решения этих проблем на стороне JS, но это тема отдельной статьи.

Как и при обычных аналоговых вызовах, для VoIP требуется УАТС, чтобы пользователи могли найти друг друга по определенному номеру телефона и преодолеть проблему, вызванную отсутствием белого IP-адреса клиента. После того, как клиенты нашли друг друга и согласовали кодеки, необходимо установить соединение для медиапотока. В зависимости от требований проекта и конфигурации сети поток данных может идти либо напрямую от клиента к клиенту, либо через сервер.

Мир VoIP обычно стремится пересылать трафик через сервер. Это решает проблему отсутствия белого IP-адреса для клиентов и позволяет централизованно записывать любой разговор.

По умолчанию WebRTC предлагает прямое соединение между клиентами, но это не работает в случае асимметричных межсетевых экранов, когда оба клиента не имеют белого IP-адреса. В этих случаях требуется медиа-прокси-сервер STUN / TURN. Для коммерческих проектов вам придется установить и оплатить прокси-сервер, чтобы ваше приложение на основе WebRTC работало. Браузеры предоставляют только услуги сервера STUN бесплатно (распознавание внешнего IP-клиента), но прокси-сервер трафика (TURN) является платной функцией.

Примечание . Существует технология, которая, по крайней мере на бумаге, позволяет подключиться к двум клиентам без белых IP-адресов с небольшой помощью сервера, но, по нашему опыту, этого не произошло. Если вам интересно, попробуйте поискать «симметричный NAT».

Балансировка нагрузки SIP с помощью OpenSIP

FreeSWITCH и Asterisk позволяют обрабатывать огромное количество одновременных вызовов на одной и той же машине, от 500 до 1000. Но что, если нам нужно больше? Или, если есть необходимость в балансировке нагрузки на основе облака?

Вот тут-то и приходит на помощь балансировщик нагрузки SIP и вот как это работает. Один компьютер обозначен как балансировщик, который на уровне SIP выбирает конечный узел и перенаправляет на него всю обработку мультимедийного трафика. Медиапоток RTP не проходит через балансировщик, освобождая балансировщик, который теперь способен выдерживать значительно большее количество одновременных вызовов. Как только вызов создан, загрузка фактически исчезает.

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

Многие уже имели некоторый опыт работы с FreeSWITCH и / или Asterisk, в Интернете достаточно примеров с практическими рекомендациями, но настройка балансировки SIP в OpenSIP или Kamailio совершенно другая.

FreeSWITCH и Asterisk требуют только списка пользователей и довольно простых правил маршрутизации вызовов. Кроме того, есть бесплатные админ-панели, которые позволяют настроить все в веб-интерфейсе.

Напротив, OpenSIP и Kamailio требуют, чтобы пользователь понимал протокол SIP хотя бы на начальном уровне и вручную прописывал, что делать с каждым сообщением SIP.

Конфигурация OpenSIPs — это программа на высокоуровневом псевдо-языке, которая должна объединить более 10 различных модулей в одну систему. Список модулей намного больше, но его части дублируют друг друга, и, возможно, не все они нужны.

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

Если вы хотите добавить много пользовательской логики, в какой-то момент может быть проще перенести бизнес-логику на FreeSWITCH (Asterisk) и / или на отдельный сервер, который будет управлять маршрутизацией вызовов, очередей и т. Д.

Простейший скрипт балансировки нагрузки выглядит следующим образом:

  1. Если входящее SIP-сообщение не первое и уже понятно, куда его направить, вы можете передать управление диалоговому модулю.
  2. В противном случае вызовите модуль балансировки, чтобы найти узел с более низкой нагрузкой, но его адрес в цели и передать управление диалоговому модулю.
  3. Обработка ошибок:

    1. Выбранный узел может вернуть код ошибки (аналогично HTTP-коду), и вам необходимо указать, что делать в каждом случае — отбросить вызов или попытаться выбрать другой узел.
    2. Модуль балансировки может вернуть ошибку и сказать, что свободных узлов нет.

Примечание. Когда вы пишете программы обработки для OpenSIP, помните, что вы должны обрабатывать как сообщения, поступающие извне в облако, так и сообщения, поступающие из облака извне. Вот почему программа часто делится на 2 или 3 огромных блока If в зависимости от направления пакета SIP.

пример

Для краткости мы исключаем всю обработку ошибок. Полную версию можно найти здесь .


Джава