04 · Realtime UI · 2022-now · Work

Dispatch Live Grid

The operations grid dispatchers work out of, streaming live status changes into a Kendo Grid over the SignalR backplane so they see a load move the moment it moves.

UPDATEDSignalR hubGROUPS BY ACCESSOther tenantYour tenantOther tenantUNDER 100 ROWS ON SCREEN · SCOPED PUSH, NOT REFRESH

The problem

Dispatchers originally worked off data that only updated on a manual page refresh, which meant time-sensitive decisions could be made on stale information. Moving to SignalR fixed the staleness but introduced two problems of its own. Every connected user received every update, whether or not it belonged to a tenant they were authorized to see. Then the app scaled to multiple server instances, and updates published from one instance never reached clients connected to another - so a dispatcher could silently fall out of sync depending on where they landed.

What was built

Took over an existing SignalR live grid and closed both gaps: tenant-scoped delivery so an update only reaches dispatchers entitled to it, and a Redis-backed backplane so instance boundaries stop breaking real-time.

◆Angular and Kendo Grid rendering under 100 rows at a time, drawn from a table in the millions, under near-constant updates across tenants.
◆Row-level pulse animation marks exactly which load just changed, so nobody has to re-scan the grid to find the row that moved.
◆Delivery scoped so dispatchers only receive updates for data they are authorized to see.
◆Backplane wired in so updates reach every connected client regardless of which instance holds their connection.
◆Result: dispatchers act on live data instead of refresh-dependent guesses, correctly scoped per tenant and consistent no matter which instance they are on.

What I'd do differently

I would move the row-update logic to deltas instead of full row replacement, so a message only carries what actually changed rather than the whole row.