ADR-0043: SignalR Realtime и Redis Backplane
Статус
Принято.
Контекст
Pin User Platform требует push-уведомлений в реальном времени: обновление баланса после депозита/вывода, смена статуса вывода, активация бонуса, турнирные обновления. В k8s при нескольких репликах сервиса WebSocket-соединение игрока существует только на одном pod-е. Уведомления из background workers или других сервисов могут прийти на любую реплику.
Решение
SignalR как websocket framework для user-api и admin-api.
Redis PubSub backplane — все реплики подписываются на Redis channels. Публикация на любой реплике доставляется всем. Используется Microsoft.AspNetCore.SignalR.StackExchangeRedis.
Разделение producer/consumer: фоновые workers и другие сервисы используют IRealtimeProducer из Talent.Common.Realtime.Client (только Redis PubSub publish, без SignalR). User-api подписывается на Redis через RealtimeNotificationRelay (BackgroundService) и доставляет через IHubContext.
Три пакета: Realtime.Core (contracts, нет ASP.NET), Realtime.Hub (только сервисы с Hub), Realtime.Client (только сервисы-producers).
Последствия
- Уведомление из accounting-worker всегда доходит до игрока независимо от количества реплик.
- Realtime не является source of truth — клиент при reconnect перезапрашивает REST API.
IRealtimeProducerв бизнес-коде — прямое использованиеIHubContextзапрещено.- Rate limit: не более 10 push/s на игрока.
Ссылки
Обратные ссылки
Автоссылки: где используется этот документ.
- API (1): SignalR Hub /hubs/messenger — MessengerHub (realtime-контракт)
- Фоновые задачи (1): Background Job: RealtimeDispatchJob
- index.md (1): Messenger Service
- 10-signalr-realtime.md (1): SignalR Realtime — Архитектура и Практическое Руководство