02 · Realtime · 2025 · Work

SignalR Backplane with Redis

Keeping real-time updates in sync across a horizontally scaled application, so a message reaches the people it is meant for no matter which instance they landed on.

BEHIND A LOAD BALANCERDispatcherDispatcherDispatcherWEBSOCKETAPI instance 1SIGNALR HUBAPI instance 2SIGNALR HUBAPI instance 3SIGNALR HUBPUBLISHDELIVERDELIVERRedis backplaneSHARED PUB/SUB CHANNELSANY INSTANCE PUBLISHES · EVERY INSTANCE DELIVERS

The problem

The app runs behind a load balancer across multiple server instances, and a SignalR connection is sticky to whichever instance the client first reached. Without a shared backplane an instance only broadcasts to its own local connections, so real-time updates silently failed to reach some users depending on routing - and most visibly during deploys and autoscaling events, when connections move.

What was built

Wired up the SignalR Redis backplane so every instance publishes and subscribes through a shared Redis channel instead of broadcasting only to the connections it happens to hold.

◆Any instance can push a message and have it reach the intended recipients, regardless of which instance they are connected to.
◆Backs the real-time feeds for notifications, the live load grid, the EDI grid, and the order grid.
◆Solves issues with messages being undelivered during deploys and autoscaling events.
◆Result: users no longer miss updates, and the app can scale out without real-time state drifting between instances.

What I'd do differently

I would have built observability into backplane message volume from the start rather than adding it after the fact.