SignalR
SignalR — это открытая библиотека для платформы ASP.NET Core, предназначенная для добавления функциональности «реального времени» в веб-приложения. Она позволяет серверу мгновенно «проталкивать» (push) данные подключённым клиентам и обеспечивает двустороннюю коммуникацию между браузером, мобильным или настольным приложением и сервером[1].
Общие сведения
| SignalR | |
|---|---|
| англ. SignalR | |
| Область использования | Веб-разработка, ASP.NET Core |
| Автор понятия | Microsoft |
Определение
SignalR реализует логическое постоянное соединение между клиентом и сервером, автоматически выбирая оптимальный транспортный протокол (WebSockets, Server-Sent Events или Long Polling) и управляя событиями подключения, переподключения и отключения[2].
Ключевые возможности библиотеки:
- Двунаправленная передача сообщений «сервер ↔ клиент» в реальном времени
- Вызовы удалённых процедур (RPC) между JavaScript-кодом клиента и серверным кодом .NET
- Групповая рассылка и адресная доставка сообщений отдельным клиентам или группам
- Масштабирование на несколько серверов с помощью backplane (Redis, SQL Server, Azure SignalR Service)[3]
- Интеграция со встроенными механизмами аутентификации и 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 включает несколько последовательных этапов, обеспечивающих установление и поддержание соединения, обмен сообщениями и завершение сессии.
Клиент посылает запрос на эндпоинт «/negotiate», чтобы получить список поддерживаемых транспортных протоколов и, при необходимости, токен доступа (например, для Azure SignalR Service).
Инициируется выбранный транспорт (WebSockets, Server-Sent Events или Long Polling). Сервер подтверждает запуск соединения и присваивает клиенту уникальный идентификатор[8].
Клиент может вызывать серверные методы (например, InvokeAsync), а сервер — клиентские (например, SendAsync). Все передаваемые данные сериализуются в формат JSON или MessagePack[9].
Сервер может отправлять сообщения:
- всем подключённым клиентам
- определённой группе клиентов
- конкретному пользователю[10]
Для обнаружения обрыва канала используются периодические ping-сообщения (по умолчанию каждые 15 секунд). Тайм-аут ожидания ответа со стороны сервера составляет 30 секунд[11].
Соединение может завершиться явно (метод 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-пакеты
- Сервер: входит в состав ASP.NET Core
- Клиент .NET: [Microsoft.AspNetCore.SignalR.Client](https://www.nuget.org/packages/Microsoft.AspNetCore.SignalR.Client)
- 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 приложений.
- Средства диагностики
Примечания
| Правообладателем данного материала является АНО «Интернет-энциклопедия «РУВИКИ». Использование данного материала на других сайтах возможно только с согласия АНО «Интернет-энциклопедия «РУВИКИ». |