Обеспечение автоматических обновлений в веб-приложении с помощью службы SignalR

Завершено

Веб-приложение на основе механизма опроса.

Затем мы переходим от опроса и к приложению, которое отправляет обновления данных (по мере их возникновения) к подключенным клиентам. Эта новая модель позволяет сократить объем трафика и повысить эффективность пользовательского интерфейса благодаря обновлению только при внесении изменений. Три технологии, которые мы используем для доставки обновленного решения, — Azure Cosmos DB, Функции Azure и SignalR.

  • Azure Cosmos DB. Как изменения данных в базе данных, Azure Cosmos DB предоставляет канал изменений. Канал изменений, поддерживаемый в Azure Cosmos DB, прослушивает изменения в контейнере базы данных. Затем он выводит отсортированный список документов в порядке, в котором они были изменены. Когда приложение прослушивает канал изменений, оно может автоматически реагировать на изменения данных.

  • Функции Azure. Ключевое различие между этой функцией и исходной getStocks функцией заключается в том, что функция теперь активируется на основе изменений данных. В предыдущем упражнении функция инициировалась по запросам от клиента и извлекала все данные посредством входной привязки Azure Cosmos DB. Использование триггера Azure Cosmos DB автоматически повышает эффективность извлечения данных. В Функциях Azure есть привязка, которая выполняет код каждый раз, когда данные обновляются в канале изменений Azure Cosmos DB. Наличие функции, прослушивающей канал изменений, позволяет работать с подмножеством измененных данных, а не со всеми данными.

  • Azure SignalR: эта служба обеспечивает 2-путь связи с подключением SignalR к клиенту, прослушивающим трансляции SignalR из приложения Функции Azure.

SignalR и постоянные подключения

Модель, предполагающая наличие постоянных подключений между клиентом и сервером, предпочтительнее механизма опроса. Установление постоянного подключения позволяет серверу отправлять данные клиенту по мере необходимости. Так как подключение используется по требованию, объем сетевого трафика уменьшается, а нагрузка на сервер снижается. Служба SignalR позволяет легко реализовать такую архитектуру в приложении.

SignalR — это абстракция для ряда технологий, которая обеспечивает двустороннее взаимодействие между клиентом и сервером. SignalR автоматически управляет подключениями и позволяет транслировать сообщения всем подключенным клиентам одновременно, как в комнате чата. Сообщения можно также отправлять отдельным клиентам. Подключение между клиентом и сервером является постоянным в отличие от классического подключения HTTP, которое устанавливается повторно для каждого сеанса связи.

Основное преимущество абстракции, обеспечиваемой службой SignalR, заключается в том, как она поддерживает резервную транспортировку. Транспорт — это метод обмена данными между клиентом и сервером. Сначала по подключению SignalR отправляется стандартный HTTP-запрос. Проанализировав подключение, сервер выбирает наиболее подходящий метод обмена данными (транспортировку). При использовании в сочетании с постоянным подключением к клиенту эта функция может связываться с отдельными клиентами по требованию, что является фундаментом для архитектуры приложения реального времени. Транспорт выбирается в зависимости от API, доступных на клиенте:

  • HTML 5. Для клиентов, поддерживающих HTML 5, транспорт API WebSockets используется по умолчанию.
  • WebSockets: если клиент не поддерживает WebSockets, То SignalR возвращается на сервер отправленные события (также известный как EventSource).
  • Другая технология: для старых клиентов для двустороннего подключения используется длинный опрос Ajax или Forever Frame (только IE).

Уровень абстракции, предоставляемый службой SignalR, дает приложению два преимущества. Первое — это задел на будущее. По мере развития интернет-технологий и появления более эффективных интерфейсов API, чем WebSocket, приложение не потребуется изменять. Вы можете обновить версию SignalR, которая поддерживает любые новые API, и вам не нужно пересмотреть код приложения.

Второе преимущество заключается в том, что служба SignalR позволяет корректно ограничивать функциональность приложения в соответствии с технологиями, поддерживаемыми клиентом. Если он не поддерживает протокол WebSocket, применяется технология SSE. Если не поддерживается и она, используются длительные опросы Ajax и т. д.

Давайте рассмотрим, как использовать SignalR для трансляции информации из функции, которая считывает канал изменений Azure Cosmos DB.