IP-телефония на базе Asterisk
Введите свой номер телефона
и мы перезвоним вам
Решаем Ваши бизнес-задачи с помощью IT-технологий. Знаем, как сделать лучше, быстрее и дешевле. Наш опыт – на службе Вашего бизнеса.
Не все герои носят плащи. Сотни техических статей, написанных инженерами нашей компании. Делимся опытом и своими знаниями со всем сообществом.
Сотни функций и возможностей Asterisk помогут вывести коммуникации в Вашей компании на принципиально новый уровень. Технические ограничения – фантазия Заказчика.
Вы платите за систему, которая будет полностью соответствовать Вашим ожиданиям, требованиям и будет драйвером роста Вашего бизнеса
Идти в ногу со временем или оставаться на старых технологиях? Такой вопрос не стоит перед нашими клиентами. Решаем самые смелые задачи для Колл-Центров. Строим с нуля или работаем с существующими.
Поместите свой бизнес в эпицентр продаж. Интеграция IP-телефонии и CRM даст новый и мощный импульс Вашему Отделу Продаж и выведет компанию на три шага впереди конкурентов.
Подбираем для клиентов такие тарифы, которые ему редко получится найти на рынке самостоятельно. Работаем с 100+ операторов связи в интересах клиента.
Разработки, созданные нашей командой под запросы клиентов. Не отказывайтесь от инноваций. Мы поможем идти с ногу со временем.
Умные всю жизнь учатся, а остальные всегда все и так знают. Мы проводим обучение более 8 лет и выпустили более 1000 специалистов по Asterisk и Mikrotik. Проводим ежегодную конференцию Asterisk.
Купить наш опыт дешевле, чем набивать свои шишки. Мы реализовали более 800 проектов и накопили экспертизу для того, чтобы идеально выполнить Ваш проект.
Правильный выбор оборудования позволяет сэкономить от 20 до 50% бюджета телефонии. Мы предельно внимательно подойдем к выбору «железа» в Ваш проект.
Наши цены доступны не только для Москвы, но и для регионов. А вложения в нашу экспертизу обычно окупаются за несколько месяцев.
Работаем с 2011 года. Собрали отличную команду реальных фанатов своего дела. Подходим к работе с душой и ответственностью.
Этот доклад я подготовил, чтобы вы могли посмотреть на наши ошибки и, возможно, не допускать их у себя. А может быть, найдёте для себя какие-то интересные архитектурные решения. Будет много схем с архитектурой. Я хотел добавить код, но в итоге не стал, потому что, честно говоря, кому нужен мой «кривой» код на PHP и Python? Поэтому просто схемы.
Изначально у нас был виджет обратного звонка, работавший довольно просто: там был практически статичный диалплан, куда подставлялись переменные. Он их воспроизводил и мог соединить звонок дальше с менеджером. На этом, в принципе, всё. На базе этой идеи мы решили создать новый продукт для автоматизации исходящих и входящих звонков.
В начале у нас был воркер на Python, который соединялся с Asterisk по AMI, передавал туда несколько переменных, а вся логика уже управлялась в диалплане. Процесс звонка выглядел так:
Диалплан был довольно статичным: проигрывал первый файл (по переменной), а дальше было всего три варианта нажатий и номер менеджера, с которым можно соединиться по нажатию «1».
Следующим шагом было ввести скрипты на PHP, чтобы расширить возможности кастомизации диалплана. Инициация звонков всё так же шла на Python по AMI, но теперь с помощью AGI-скриптов на PHP мы могли запрашивать из базы данные сценариев и делать больше действий.
Процесс звонка при этом выглядел так же, но появилась новая часть с обработкой на PHP. Диалплан стал сложнее: сначала воспроизводился ролик (по переменной), потом шёл пользовательский ввод (цифры, слова, распознавание через IVR), а дальше система могла отправить SMS, проиграть другой ролик или соединить с менеджером.
Чтобы решить проблемы с масштабированием, мы добавили новый компонент — роутер (на Python). Он подключался к базе, а с воркерами, которые общались с Asterisk по AMI, держал соединение по сокету. Так появилась возможность создавать несколько воркеров. При этом PHP-скрипты перестали обращаться напрямую к базе: теперь вся информация о звонке подавалась скриптам через переменные от воркера.
Сначала для распознавания речи мы использовали обычные AGI-скрипты. Минус в том, что они не позволяют обрабатывать звук в потоке. Нужно было записывать файл 2–10 секунд, потом отправлять его в службу распознавания (Яндекс, Google и т. д.) и лишь потом реагировать. В итоге взаимодействие получалось «топорным», робот отвечал с задержкой.
Чтобы это исправить, мы перешли на EAGI. Там можно работать со звуком в потоке и сразу реагировать на слова пользователя. Плюс — более «живое» общение. Минус — работа со звуком через файловый дескриптор, что упирается в ограничения по количеству одновременных звонков на Asterisk. Кроме того, не было буферизации на стыке роутера и Asterisk: если что-то ломается, звонки могут копиться и «ронять» всё приложение.
Чтобы решить проблему узких мест, мы добавили RabbitMQ и систему очередей. Теперь, если появляется перегрузка, звонки уходят в очередь, а воркеры их обрабатывают позже. Это не очень приятно для пользователей, которым хочется моментальной связи, но лучше, чем полное падение системы. Параллельно мы добавили DataUpdater — ещё один воркер, который занимается обновлением информации о звонке в базе.
С помощью очередей стало гораздо удобнее масштабироваться. Но при этом сохранялось несколько минусов: по-прежнему EAGI и его ограничения по дескрипторам, два языка в проекте, и каждый звонок обрабатывался отдельным процессом.
Чтобы убрать ограничения EAGI и отказаться от PHP, мы решили переписать логику на ARI (Asterisk REST Interface). Да, проблемы с файловым дескриптором ушли, а PHP мы совсем убрали, оставив один Python. Но при этом пришлось писать гораздо больше кода, потому что в ARI нужно самому управлять каналами, мостами, проигрыванием роликов, записью звонков и т. д. — если раньше в AGI можно было вызвать готовое приложение (Dial, Playback, MixMonitor), то теперь всё реализуется вручную.
Из плюсов — асинхронность, гибкость, один язык разработки. Из минусов — нет готовой библиотеки для ARI под Python 3, и мы писали свою. Плюс к этому у нас пока плохо автоматизирован процесс развёртывания: все сервера (а их уже около 50) мы поднимаем вручную, и это превращается в довольно большую боль.
Мы планируем упаковать Asterisk в Kubernetes, добавить Kamailio, чтобы Asterisk-узлы масштабировались как медиасерверы, а Kamailio служил бы фронтендом, общаясь напрямую с провайдерами. Тут, конечно, много нюансов, связанных и с Docker, и с Kamailio, но мы надеемся, что справимся с этими задачами уже в ближайшее время.
В ходе развития проекта мы прошли путь от простого статического диалплана с минимальной логикой к гибкой, асинхронной и масштабируемой системе на базе ARI, устранив ограничения EAGI и отказавшись от PHP в пользу единого Python-стека; поэтапное введение роутера и RabbitMQ позволило разгрузить узкие места и добавить очереди, но потребовало собственной библиотеки и усложнило развёртывание, а переход к ARI — написания большого объёма кода для управления каналами и мостами; в будущем планируется контейнеризация Asterisk в Kubernetes с фронтендом Kamailio и автоматизацией выпуска через Docker, что должно обеспечить автоматические масштабирование и более простой деплой.
Билеты уже в продаже!
Я - Виталий Шелест, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.