Перейти к основному содержимому

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 на игрока.

Ссылки

Обратные ссылки

Автоссылки: где используется этот документ.