Новый глагол Queue от Twilio упрощает эту задачу, предоставляя набор функций, которые позволяют легко ставить и снимать вызывающих абонентов из очереди, предлагать пользовательские условия ожидания и получать метрики очереди вызовов, такие как количество вызывающих абонентов, находящихся в очереди в данный момент, и среднее время ожидания в очереди.
В этой статье мы подробно рассмотрим, как использовать возможности Queue в простом приложении ASP.NET MVC для создания простого дашборда, отображающего метрики очереди вызовов.
Прежде чем приступить к созданию дашборда очереди вызовов, мне сначала нужно создать систему, которая помещает вызывающих абонентов в очередь. Для этого я создам новый пустой проект ASP.NET MVC в Visual Studio и добавлю новый класс контроллера под названием *CallController*, к которому я добавлю новый метод действия под названием *QueueCall*.
В методе действия я могу использовать объект TwilioResponse, который является частью библиотеки помощников TwiML от Twilio, для создания ответа TwiML, содержащего глагол Enqueue. Для глагола Enqueue я установлю три атрибута:
— name – имя очереди, в которую будет помещен вызывающий абонент
— waitUrl – URL-адрес, используемый для предоставления TwiML для выполнения после помещения пользователя в очередь
— action – URL-адрес для запроса после того, как пользователь покинет очередь.
Теперь я просто настрою свой телефонный номер Twilio для запроса метода действия QueueCall, когда звонит абонент, и он будет помещен в очередь. Оказавшись в очереди, абонент услышит свое положение в очереди, а затем приятную музыку ожидания.
Когда абонент покидает очередь по любой причине (снятие с очереди, завершение вызова и т. д.), Twilio запросит метод действия *LeaveQueue*. Я использую это позже в примере, но пока он просто возвращает пустой результат.
Первая метрика, которую я хочу показать на дашборде очереди вызовов, — это количество вызывающих абонентов, ожидающих в очереди в данный момент. Я хочу, чтобы мой дашборд автоматически обновлялся по мере входа и выхода пользователей из очереди, поэтому я собираюсь использовать SignalR, сигнальный фреймворк Microsoft, для асинхронной отправки обновлений размера очереди в мой браузер.
Для начала мне нужно добавить SignalR в мое MVC-приложение, что я могу сделать с помощью командной строки NuGet
После добавления SignalR в мой проект мне нужно создать Hub. В SignalR Hub — это то, что обеспечивает постоянное соединение с каждым клиентом. Чтобы создать Hub, я добавлю новый класс под названием QueueHub, который будет наследоваться от базового класса Hub, а затем установлю атрибут HubName для класса:
Далее мне нужно обновить мой View, чтобы включить Javascript SignalR и инициализировать соединение с хабом:
Обратите внимание, что при инициализации соединения я также определяю два клиентских метода, которые SignalR может вызывать, когда Hubу нужно отправить сообщение клиенту.
Наконец, мне нужно обновить методы действия в CallController, чтобы фактически отправлять сообщения о размере очереди клиенту по мере входа и выхода вызывающих абонентов из очереди.
Как вы можете видеть, когда Twilio запрашивает метод действия WaitInQueue, он передает параметр CurrentQueueSize, поэтому все, что мне нужно сделать, когда пользователь входит в очередь, — это отправить его клиенту с помощью SignalR.
Когда пользователь покидает очередь, мне приходится делать немного больше работы. Метод действия LeaveQueue получает только QueueSid, поэтому там мне приходится искать очередь с помощью REST API Queue, чтобы узнать ее текущий размер. Чтобы немного упростить это, я использую библиотеку помощников .NET, чтобы получить очередь:
Когда я покидаю очередь, счетчик вызовов должен вернуться к 0.
Вторая метрика, которую я хочу включить в свой дашборд, — это среднее время ожидания вызывающих абонентов в очереди. Эта метрика отличается от текущего размера очереди тем, что она постоянно меняется, даже если количество вызовов в очереди не меняется. Единственное время, когда она остается постоянной, — это если в очереди нет вызывающих абонентов.
Поскольку время ожидания постоянно меняется, вместо того, чтобы обновлять мой дашборд только при прибытии и уходе вызывающих абонентов из очереди, я хочу просто обновлять дашборд каждые десять секунд. Для этого я собираюсь использовать Azure Worker Role для опроса API Twilio, а затем использовать SignalR для трансляции времени ожидания на мой дашборд. Использование worker role идеально подходит в данном случае, потому что я хочу, чтобы опрос происходил в фоновом режиме с регулярным интервалом.
Для начала мне нужно убедиться, что у меня установлен Windows Azure SDK, а затем добавить новую Windows Azure Worker Role в мое существующее решение Visual Studio:
Когда я добавляю Worker Roll, для меня создается новая библиотека классов, содержащая код-заготовку worker roll, включая метод Run. В методе Run я могу использовать API Twilio для поиска конкретной очереди, для которой я хочу получить время ожидания, а затем начать цикл, который будет опрашивать Twilio каждые 10 секунд на предмет времени ожидания этой очереди.
Каждый раз, когда worker role получает время ожидания, я могу использовать клиентский API SignalR, чтобы отправить это значение из Worker Role в Hub, а затем в Hub транслировать это сообщение на мой дашборд.
Цифры — это хорошо, но ни один дашборд не будет полным без красивых визуализаций данных, поэтому в качестве последней части создания моего дашборда очереди вызовов я использовал виджет диаграмм Javascript HighCharts, чтобы добавить диаграммы, показывающие размер очереди и значения времени ожидания:
Поскольку диаграммы находятся на стороне клиента, я использую массив для хранения значений размера очереди и времени ожидания по мере их отправки через SignalR. Когда новое значение добавляется в массив, я сообщаю соответствующей диаграмме HighChart обновить себя, чтобы отразить новое значение.
Новые функции Call Queue позволяют легко создавать удобные условия как для вызывающих абонентов, так и для менеджеров, управляющих системами очередей вызовов. В этой статье мы рассмотрели, как, используя TwiML и API Twilio, можно быстро создать простой дашборд для мониторинга ваших очередей вызовов.
Чтобы ознакомиться с живым примером из этой статьи, посетите http://twilio-queue.azurewebsites.net. Вы также можете скачать весь исходный код этого примера с GitHub. Как всегда, я буду рад услышать ваше мнение об этой статье. Если у вас есть какие-либо вопросы или комментарии, вы можете написать мне в Твиттере @devinrader или отправить письмо на devin@twilio.com.