SignalR

SignalR — это открытая библиотека для платформы ASP.NET Core, предназначенная для добавления функциональности «реального времени» в веб-приложения. Она позволяет серверу мгновенно «проталкивать» (push) данные подключённым клиентам и обеспечивает двустороннюю коммуникацию между браузером, мобильным или настольным приложением и сервером[1].

Общие сведения
SignalR
англ. SignalR
Область использования Веб-разработка, ASP.NET Core
Автор понятия Microsoft

Определение

SignalR реализует логическое постоянное соединение между клиентом и сервером, автоматически выбирая оптимальный транспортный протокол (WebSockets, Server-Sent Events или Long Polling) и управляя событиями подключения, переподключения и отключения[2].

Ключевые возможности библиотеки:

  1. Двунаправленная передача сообщений «сервер ↔ клиент» в реальном времени
  2. Вызовы удалённых процедур (RPC) между JavaScript-кодом клиента и серверным кодом .NET
  3. Групповая рассылка и адресная доставка сообщений отдельным клиентам или группам
  4. Масштабирование на несколько серверов с помощью backplane (Redis, SQL Server, Azure SignalR Service)[3]
  5. Интеграция со встроенными механизмами аутентификации и DI-контейнером ASP.NET Core

Структурные элементы SignalR

  • Hubs (хабы) — высокоуровневый канал, через который клиенты и сервер вызывают методы друг друга. Хаб автоматически сериализует параметры (JSON или MessagePack) и маршрутизирует сообщения адресатам[4]
  • PersistentConnection — низкоуровневый API, предоставляющий полный контроль над форматом и обработкой сообщений. На основе этого класса реализованы хабы[5]
  • Транспортные механизмы
    • WebSockets — предпочтительный полно-дуплексный транспорт с наименьшей задержкой
    • Server-Sent Events — односторонняя передача данных от сервера к клиенту
    • Long Polling — механизм резервного опроса, совместимый с устаревшими браузерами[6]
  • Backplane — внешняя шина сообщений (Redis, Azure SignalR Service и др.), синхронизирующая публикацию сообщений между экземплярами приложения при горизонтальном масштабировании[7]

Этапы работы

Работа SignalR включает несколько последовательных этапов, обеспечивающих установление и поддержание соединения, обмен сообщениями и завершение сессии.

1. Negotiate

Клиент посылает запрос на эндпоинт «/negotiate», чтобы получить список поддерживаемых транспортных протоколов и, при необходимости, токен доступа (например, для Azure SignalR Service).

2. Установление соединения

Инициируется выбранный транспорт (WebSockets, Server-Sent Events или Long Polling). Сервер подтверждает запуск соединения и присваивает клиенту уникальный идентификатор[8].

3. Вызовы хаба

Клиент может вызывать серверные методы (например, InvokeAsync), а сервер — клиентские (например, SendAsync). Все передаваемые данные сериализуются в формат JSON или MessagePack[9].

4. Передача сообщений

Сервер может отправлять сообщения:

  • всем подключённым клиентам
  • определённой группе клиентов
  • конкретному пользователю[10]

5. Keep-Alive

Для обнаружения обрыва канала используются периодические ping-сообщения (по умолчанию каждые 15 секунд). Тайм-аут ожидания ответа со стороны сервера составляет 30 секунд[11].

6. Отключение

Соединение может завершиться явно (метод Stop()) или по истечении тайм-аута. На сервере событие OnDisconnected сигнализирует о завершении сессии[12].

Преимущества и недостатки

Преимущества

  • Высокоуровневый API, скрывающий детали WebSockets и других транспортов[13]
  • Автоматический выбор транспорта и поддержка переподключения
  • Масштабирование через Redis или Azure SignalR Service без sticky-sessions[14]
  • Кроссплатформенные клиенты (.NET, JavaScript, Java)
  • Полная интеграция с экосистемой ASP.NET Core

Недостатки

  • Поддержание тысяч постоянных соединений требует дополнительных ресурсов сервера[15]
  • При откате на Long Polling увеличивается задержка
  • Жёсткая зависимость от платформы .NET — для иных стеков могут понадобиться альтернативы
  • Масштабирование без backplane затруднительно
  • Ограниченная поддержка офлайн-режима и возможные сетевые блокировки WebSockets

Сферы применения

  • Чат-сервисы и мессенджеры
  • Совместное редактирование документов и онлайн-доски
  • Панели мониторинга (биржевые котировки, IoT-метрики)
  • Многопользовательские игры и викторины в реальном времени
  • Системы уведомлений и push-оповещений
  • Онлайн-аукционы и платформы голосований[16]

Инструменты для использования в SignalR

  • NuGet-пакеты
  • JavaScript / TypeScript SDK — npm-пакет [@microsoft/signalr](https://www.npmjs.com/package/@microsoft/signalr)
  • Azure SignalR Service — управляемый облачный backplane, автоматически масштабирующий соединения и сообщения[17]
  • Redis backplane — пакет [Microsoft.AspNetCore.SignalR.StackExchangeRedis](https://codeopinion.com/practical-asp-net-core-signalr-scaling/) для вертикального и горизонтального масштабирования on-prem приложений.
  • Средства диагностики
    • Логирование ASP.NET Core (категории Microsoft.AspNetCore.SignalR)
    • dotnet-counters и EventCounter для метрик
    • Распределённая трассировка через DiagnosticSource[18]
    • Сторонний «SignalR Web Client» для отладки хабов[19]

Примечания

Категории

© Правообладателем данного материала является АНО «Интернет-энциклопедия «РУВИКИ».
Использование данного материала на других сайтах возможно только с согласия АНО «Интернет-энциклопедия «РУВИКИ».