Система облачной телефонии 2600hz KAZOO

image

Введение


Телекоммуникационный проект KAZOO молодой компании под названием 2600hz (США) уже успел собрать несколько отраслевых наград и используется многими крупными операторами связи.

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

KAZOO — быстро развивающаяся открытая (open-source) платформа виртуальной облачной телефонии, на основе которой можно строить сервисы виртуальных АТС, виртуальные мобильные сети и другие масштабные облачные телекоммуникационные решения операторского класса.

Объём и назначение этой статьи не позволяет детально рассказать об устройстве системы с точки зрения разработки ядра и компонент. Этому, возможно, будет посвящены отдельные материалы. Цель статьи — кратко рассказать о функциях и архитектуре замечательной системы 2600hz KAZOO.

Иллюстрации к статье выполнены в формате концепт-карт, содержат много мелких букв и подразумевают вдумчивое разглядывание

Проект (ранее называвшийся Whistle) назван в честь духового инструмента Kazoo [1]. Переименование произошло после того как авторы посчитали что их творение — это уже не просто свисток (whistle, англ.), а нечто большее, пригодное для использования в серьёзных приложениях.

Тема свиста отражена и в названии самой компании (2600hz). 2600hz — знаменитая звуковая частота, с помощью которой молодые Стив Возняк и Стив Джобс, обманывали телефонные коммутаторы [2]. Ранний продукт компании 2600hz, веб-интерфейс к FreeSWITCH и Asterisk, под названием BlueBox (синяя коробка), был назван как раз в честь устройства для обмана тогдашних телекомов.

О проекте


Фактически, KAZOO — это первая открытая (open-source, MPL) масштабная облачная платформа виртуальной телефонии [4]. KAZOO — функционально богатая, распределённая, отказоустойчивая, масштабируемая, высокопроизводительная, управляемая через API платформа виртуальных АТС, предназначенная для операторов связи, которые хотят предоставлять расширенные услуги IP-телефонии и виртуальных офисов, но не хотят платить миллионы долларов за решения «от лидеров рынка».
Ниже я раскрою каждое из вышеперечисленных свойств (функциональность, распределённость, отказоустойчивость, масштабируемость, высокую производительность, управление через API) более подробно.

История


Основатели проекта — американцы Darren Schreiber и Patrick Sullivan, которые решили попробовать создать что-нибудь новое в области телекоммуникаций. Официальная история проекта, размещённая на wiki-сайте [3], гласит что Darren и Patrick встретились в ресторане в Сан-Франциско, где решили основать новый стартап и посмотреть к чему это приведёт. Так и родился проект Whistle.

К концу 2010г. в проекте уже было задействовано 6 человек, в 2011-м — уже около 20. Горячий интерес от компаний из отрасли телекоммуникаций позволил привлечь финансирование и не только продолжить разработку, но и запустить в 2012-м году собственный коммерческий сервис на базе своей же платформы.

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

Следующая конференция пройдёт в октябре 2014 года и автор этой статьи собирается выступить там с докладом об успешном опыте применения платформы и участия в проекте.

Архитектура


KAZOO использует несколько «проверенных временем и дорогами» компонент:

image

  • SIP-прокси сервер Kamailio (с собственным модулем db_kazoo, предназначенным для обращения к данным KAZOO). Серверы Kamailio обеспечивают регистрацию SIP-устройств, передачу данных presence и распределение нагрузки между серверами FreeSWITCH (с помощью стандартного модуля dispatcher). Модуль db_kazoo, специально разработанный авторами системы для kamailio, обеспечивает взаимодействие с KAZOO через AMQP.
  • IP-АТС FreeSWITCH (с собственным модулем mod_kazoo, посредством которого осуществляется интеграция FreeSWITCH в Erlang-окружение). Известная многим IP-АТС FreeSWITCH используется в проекте в качестве обработчика звонков, при этом всё управление звонками ложится на плечи приложений KAZOO, написанных на Erlang. Специальный модуль FreeSWITCH превращает IP-АТС в так называемый Erlang C-Node, напрямую взаимодействующий с узлами Erlang.
  • NoSQL СУБД BigCouch (да, все знают что этот проект умер, рано или поздно произойдёт переход на CouchDB), написанную на Erlang высокопроизводительную, масштабируемую, распределённую СУБД
  • Сервер сообщений AMQP RabbitMQ, также написанный на Erlang высокопроизводительный messaging-сервер
  • Балансировщик нагрузки HAPROXY (используется для распределения доступа к серверам СУБД)
  • Платформу и язык программирования Erlang, на которой написана логика системы: компоненты eCallMgr и приложения Whistle apps

Компоненты активно взаимодействуют между собой и формируют цельную облачную VoIP-платформу.

Функциональность


Каждая виртуальная АТС (account) внутри KAZOO «из коробки» поддерживает следующие функции (на самом деле — полный джентльменский набор):
  • вызов устройства
  • вызов пользователя (будут вызваны все его устройства)
  • голосовые меню
  • голосовую почту
  • маршрутизацию по времени
  • перенаправления звонков
  • приём и отправку (через API или e-mail) факсов
  • запись разговоров
  • вызов внешних скриптов (есть режим совместимости с Twilio)
  • группы дозвона
  • перехват вызовов
  • парковку вызовов
  • переадресацию
  • hot-desking (присвоение устройств)
  • интерком
  • DND
  • очереди звонков (простой ACD)
  • управление CallerID
  • конференции meet-me
  • серверы конференций (с вводом номера комнаты)
  • возможность подключения «своих» транков (например, шлюза FXO с горячо любимым «аналоговым» номером)


image

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

Так как управление станцией производится через API (подробнее ниже), система может быть оснащена совершенно произвольным «личным кабинетом», реализующим практически любую логику управления, от «мастера установки» до интерфейса с перетаскиванием пиктограмм (принятым в некоторых современных IP АТС). В состав системы входит демонстрационный интерфейс, увы, слабо подходящий для коммерческого использования.

Распределённость


Компоненты KAZOO могут (и должны) размещаться на разных узлах, а кластеры могут формировать географически распределённые узлы, связанные через WAN. При наличии высокоскоростных каналов связи, элементы кластера могут быть разнесены между различными площадками для дополнительной отказоустойчивости.

Компоненты системы отлично работают в виртуальном окружении и могут размещаться в частных, публичных или гибридных IaaS-облаках, что существенно упрощает развёртывание и эксплуатацию.

KAZOO можно поставить на одном сервере (чтобы «посмотреть»), однако даже лабораторное окружение для разработки лучше иметь в виде минимального кластера из 7 узлов, так как очень большой объём работы в проекте проделан именно с целью обеспечения работы распределённого окружения.

Отказоустойчивость


Практически все (за единственным исключением, в виде не имеющей fallback-пути связи Kamailio-RabbitMQ) компоненты системы могут быть многократно продублированы как с целью повышения производительности, так и с целью обеспечения надёжности и высокой доступности. Несколько прокси-серверов Kamailio балансируют трафик между серверами FreeSWITCH, которые управляются серверами eCallMgr. Множественные серверы приложений Whistle apps взаимодействуют с серверами eCallMgr через AMQP и обмениваются данными с серверами BigCouch, «закрытыми» HAPROXY. Сервисы API предоставляются серверами Whistle apps и могут быть скрыты за балансирующими proxy-серверами.

Всё общение с системами хранения и внешними скриптами происходит по протоколу HTTP, что позволяет добиться отказоустойчивости всего комплекса (используя PaaS-платформы или многоуровневые отказоустойчивые фермы серверов со скриптами).

Масштабируемость


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

Высокая производительность


Высокая производительность системы отчасти реализуется за счёт хорошей масштабируемости, однако все используемые компоненты сами по себе очень быстры:
  • Kamailio издавна известен своей высокой производительностью [5] и широко используется операторами связи пр всему миру
  • FreeSWITCH отлично чувствует себя в виртуальном окружении и, при правильной инсталляции, способен обрабатывать тысячи одновременных звонков на сервер
  • RabbitMQ написан на Erlang, хорошо масштабируется сам по себе и способен показывать очень высокую производительность [6]
  • СУБД BigCouch также написана на Erlang и была выбрана авторами системы, в частности, за показанную производительность [7]
  • «Бизнес-логика» системы, компоненты eCallMgr и Whistle apps, написанные на Erlang, сами по себе работают очень быстро. Авторы очень хорошо думали, прежде чем писать код, и выбор инструмента и структура ядра были не случайны. В результате самое медленное что происходит внутри логического слоя — это запись системных журналов

Как говорят кулинары: «из набора хороших продуктов очень сложно приготовить плохое блюдо (конечно, если ты кулинар)». Автор проводил стресс-тестирования системы в различных конфигурациях и может подтвердить: сотни CPS и многие тысячи одновременных звонков в режиме виртуальной АТС (со всеми функциями) на кластере доступного (среднему оператору) ценового диапазона — это имеющая место быть здесь и сейчас реальность.

API


Уникальным качеством платформы KAZOO является её полнофункциональный REST API. Именно посредством этого API клиентские приложения управляют сущностями внутри виртуальных АТС, а администраторы могут изменять системные настройки.

image

Основные сущности, для которых конечным пользователям предоставляются API:
  • Accounts (аккаунты, арендаторы). Собственно, виртуальные АТС. Каждый account идентифицируется своим SIP-realm (доменным именем) и уникальным ID. Аккаунты могут быть вложены друг в друга, что позволяет строить агентские схемы предоставления услуг
  • Users (пользователи). Физические лица, владельцы устройств (devices), используемых для звонков
  • Devices (устройства). Фактические оконечные устройства, на которые могут быть направлены вызовы. Устройства принадлежат пользователям и могут вызываться как отдельно, так и вместе
  • Callflows (сценарии вызовов). Фактически, dialplan-ы. Для callflow назначются номера, любой вызов номера, фактически, приводит к выполнению того или иного callflow-сценария
  • Menus (голосовые меню). IVR-меню, подразумевающие ввод звонящим цифр
  • Media (медиа-ресурсы). Медиа-файлы или TTS
  • Faxboxes (факсовые ящики). Используются для приёма и отправки факсов
  • VMBoxes (ящики голосовой почты). Используются для приёма и хранения голосовой почты (которая может отправляться на e-mail)
  • CDRs (записи CDR). Дают возможность получать информацию о состоявшихся звонках
  • Resources (ресурсы внешних подключений), локальные для account-ов
  • Temporal rules (правила маршрутизации по времени)
  • Lists (списки номеров или регулярных выражений)
  • Metaflows (сценарии DTMF-команд во время разговора)
  • Limits (ограничения количества транков)
  • Click-to-call (инициация вызовов через API)
  • Webhooks (веб-вызовы при инициации, ответе, завершении разговоров)
  • Queues (очереди ACD)
  • Agents (данные операторов ACD)

Администраторам через API, в частности, предоставляется доступ до системных настроек и компонент:
  • System configs (элементы конфигурации системы)
  • Resources (ресурсы внешних подключений), глобальные для системы
  • Hangups (статистика кодов завершения разговоров), предназначен для мониторинга и обнаружения аномалий


Что с этим можно делать?


На основе KAZOO возможно сравнительно быстрое создание сервисов наподобие Grasshopper, RingCentral, SendHub, виртуальных АТС различной сложности и ёмкости. Разумеется, чтобы сделать полноценный сервис одной KAZOO недостаточно, но в качестве основы решения она подходит совершенно замечательно и позволяет заложить в архитектуру весьма приличный рост и получить широкие функциональные возможности.

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

Будущее проекта


Проект очень быстро развивается. Не за горами поддержка SMS, улучшенная документация, интерфейс realtime-sockets и другие очень полезные и удобные функции. Компания 2600hz получает награды и регулярно отчитывается об успешных проектах и интеграциях. Будущее продукта видится светлым и радужным, авторы очень стараются на радость сообществу поддерживать open-source версию, за что им низкий поклон и большое спасибо.

Резюме


Проект KAZOO — уникальная open-source облачная платформа операторской виртуальной телефонии, позволяющая операторам связи предоставлять своим заказчикам современные услуги виртуальных АТС, а также строить другие сложные телекоммуникационные решения (например, виртуальные мобильные сети).

«Большая картина» KAZOO выглядит примерно так:

image

Ссылки:


[1] ru.wikipedia.org/wiki/Blue_box
[2] en.wikipedia.org/wiki/Kazoo
[3] wiki.2600hz.com
[4] github.com/2600hz/kazoo
[5] www.kamailio.org/docs/openser-performance-tests
[6] blog.pivotal.io/pivotal/products/rabbitmq-hits-one-million-messages-per-second-on-google-compute-engine
[7] blog.2600hz.com/post/22783650775/couchdb-bigcouch-bulk-insert-update
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 15

    +1
    Был у нас опыт (попытка) построения проекта на данной платформе: при наличии платной поддержки и прямой работы с разработчиками — результаты были нулевые.
    Не стоит вестись на красивые слова о чудо-языке Эрланг, распределенной системе и маштабируемости.

    Во-первых, документация к программному интерфейсу никакая, сам интерфейс достаточно путанный.
    Во-вторых, при попытке разнести звонки по разным физическим нодам, они (разработчики) не смогли решить проблем с voice path.
    В-третьих, проект никак не развивается — улучшения документации, и прочая «лапша» лишь для рекламы. За год он был пропатчен лишь нашими силами, в нашей приватной ветке.

    По поводу эрланга — про него много красиво «поют», на деле же только пару компаний смогли его адаптировать под свои нужды, хотя успешно это могли сделать на другом языке.
      0
      Вы знаете, наш опыт совершенно противоположный, как ни странно… И проект развивается весьма быстро (https://github.com/2600hz/kazoo/commits/master просто не может врать, ему это не нужно), и наши внедрения работают на большом количестве физических (и виртуальных) узлов…

      Возможно, ваша информация относится к совсем ранним версиям, в начале он был действительно очень «сырой», но начиная с третьей версии — всё очень хорошо.

      Про оценку Эрланга ничего говорить не буду — по моему мнению здесь он по прямому назначению используется.

      В общем — мы, как специалисты по внедрению, поддержке, и как разработчики под эту платформу, очень довольны. И не мы одни.
        0
        Вот именно, как специалисты по внедрению, а не разработки вообще — что надо, то и внедрили =) А мы разработчики, у нас задача, не просто под ТЗ подогнать программный продукт, а сделать на его базе свой.

        Версия прошлогодняя.

        + вы скорей всего хотите свои услуги тут прорекламировать.
          0
          Ну, количество кода, который мы в проект отправили, уже весьма прилично, так что не стал бы так однобоко оценивать (внедрение KAZOO без разработки просто невозможно). Про год, в течение которого только вы его и развивали, это, пожалуй, всё-таки преувеличение было, согласитесь. Повторюсь — журналы с github врать не могут.

          Что я хочу — так это чтобы в этой стране про этот продукт узнали. Да, безусловно, так как моя компания состоит из специалистов по KAZOO, хочу продавать свои услуги. И пусть тот кто не хочет зарабатывать деньги первым бросит в меня камень.

          Однако, продавать высокотехнологичные услуги по сложному продукту возможно только на рынке где есть спрос. А пока про продукт никто ничего не знает — спроса нет и быть не может.
            0
            интересно узнать про тех кому вы уже внедрили это. В списке ваших клиентов не видно операторов связи.
              0
              Там где вы смотрели, этого нет. Направление интеграции KAZOO мы пока никак не продвигали.
              За прошедший год мы сделали два относительно больших внедрения (там где в решении присутствуют десятки узлов), одно в России, одно за рубежом. Увы, назвать клиентов запрещают условия договоров… В России это был довольно крупный оператор связи, платформа встала на замену Communigate. За рубежом — это крупный отраслевой SaaS-провайдер, телефония является частью интегрированного предложения. Больше ничего сказать не могу.
            0
            Я понял о каком проекте вы говорите (сложил 2 и 2). Акценты разработчиков системы находятся в области обычных ВАТС и мобильности, это да. Как, собственно, и интересы большинства потребителей платформы. Ваш случай действительно особенный. Представляю, с чем вы столкнулись… Очень интересно, на самом деле.
            0
            Каков порядок цен на внедрение и поддержку? Пока виртуальных АТС немного (меньше 10, до 100 пользователей).
          +1
          Коллеги, рекомендую обратить внимание на VoxImplant, в России уже рядом компаний используется, есть уже вся необходимая интеграция с телефонной инфраструктурой, и писать на Javascript большинству проще чем на Erlang :)
            0
            VoxImplant — красивый сервис. Однако, в данной статье описано решение, позволяющее оператору сделать «свой VoxImplant» (ну, почти, плюс-минус). При этом конечным пользователям (клиентам) полученного сервиса не нужно вообще ничего знать про Erlang. Никогда.
              0
              Оператору необязательно делать свой VoxImplant, это ему не особенно и нужно на самом деле, можно подключить к VoxImplant SIP-транки свои и делать все что необходимо.
            0
            У меня опыт отрицательный, я его рассматривал как вариант для оператора в европе, но к сожалению всё сошло на нет из за проблем с документацией и сложности с адаптацией под европейский рынок.
              0
              Да, там до недавнего времени было довольно много жёстких заточек под США. Сейчас (последние месяцы) всё стало существенно проще. А документацию реально пишут (и складывают в git), что не отменяет чтения кода «от корки до корки» для тех, кто хочет действительно понимать и делать что-то серьёзное самостоятельно (в плане разработки или интеграции). Но зато результаты получаются отличные. API весьма неплохо документирован.
                0
                Еще до выхода monster-ui пробовали поднять Kazoo на CloudZZ, как дополнительный сервис для клиентов, с приватной виртуальной АТС каждому подписчику на их собственном домене. До сих пор считаю что для всевозможных интернет магазинов это супер-функция (multi-tenant pbx). Но увы заставить все это работать не удалось — основным препятствием была таки заточка под USA (П.4 конспекта к примеру)
                На тот момент родился вот такой конспект, по вещам не описанным в их инструкции по установке (о них забыли упомянуть):
                Конспект установки
                1. Kazoo Config
                Поменять пути в
                /var/www/html/kazoo-ui/config/config.js
                на ip сервера с api или его url. Для субаккаунтов эти настроки меняются в меню whitelabel, и они не зависят от этой настройки. Без этого первый логин не возможно сделать.

                2. Включить https для ui
                /etc/https/conf/httpd.conf
                /etc/https/conf.d/ssl.conf
                https включается только для интерфейса, сам api как работал по чистому http так и будет работать без шифрования. Увы.

                3. number_manager
                pbx.tehpostach.com:5984/_utils/document.html?system_config/number_manager
                Необходимо задать reconcile_regex — выражние согласно которому будет происходить добавление DID номера. Я использовал отсюда регулярное выражение: github.com/yumminova/kazoo/blob/master/applications/crossbar/doc/internationalization/EU%20reconsile%20regex%20and%20e164%20converter.txt
                Помимо этого тут можно задать регулярки для определения разных направлений — «classifiers»:
                Они красиво мигрируют в web-ui.

                4. Подключение к sip gate. Kazoo не умеет аутентифицироваться по логину и паролю. Только аутентификация по IP. Используем костыль в виде freeswitch конфига для поддержки соединения. Концептуальный минус — после любой правки нужно рестартовать freeswitch, отключая всех от kazoo.

                /etc/freeswitch/gateways/*.xml
                File: intertelecom.xml

                <?xml version="1.0"?>
                <include>
                <gateway name="intertelecom">
                <param name="proxy" value="sip.intertelecom.ua"/>
                <param name="username" value="xxxx"/>
                <param name="password" value="xxxxx"/>
                </gateway>
                


                5. Настройка прав доступа ecallmgr

                pbx.tehpostach.com:5984/_utils/document.html?system_config/ecallmgr
                Для того чтобы принимать звонки нужно внести ip шлюзов в лист trusted
                "sip.intertelecom.ua": {
                "type": "allow",
                "network-list-name": "trusted",
                "cidr": "195.128.xxx.xx/32"
                },
                


                6. UI
                В Number Manager добавляем номер
                +3809466xxxxxx
                В VoIP Services — Callflow
                создаем новый callflow для этого номера.
              0
              Если есть возможность написать статьи о настройке\эксплуатации — буду премного благодарен.
              Архитектура же Kazoo меня при первом столкновении с ней привела в восторг, и я часто привожу ее как пример грамотно и качественно построенного решения.

              P.S. возможно хаб voip был бы уместнее.

              Only users with full accounts can post comments. Log in, please.