REST Polling to GraphQL Subscriptions Blueprint
Replace wasteful REST polling with real-time GraphQL subscriptions over WebSockets, fanned out via a Redis or Kafka backplane. Clients migrate screen by screen with polling as a fallback while connection limits and throttling control scale.
What and Why
Clients that poll REST endpoints for fresh data waste requests and still lag behind changes. GraphQL subscriptions push updates to clients over a persistent transport (WebSockets), so the UI updates the moment data changes and polling traffic disappears. This suits dashboards, notifications, live status, and collaborative features.
This blueprint adds a subscription path beside existing queries and migrates polling clients to push.
Phases
Assessment. Identify polled endpoints, their poll interval, and the events that actually change the data. High-frequency polling with rare changes is the prime target.
Schema design. Define subscription fields and the events that trigger them. Decide payloads (full object vs delta). Reuse existing GraphQL types so queries and subscriptions stay consistent.
Transport setup. Implement subscriptions over WebSockets (graphql-ws protocol). Back the event source with a pub/sub layer (Redis or Kafka) so updates fan out across server instances. Authenticate the socket on connect with OAuth/OIDC tokens.
Client migration. Move clients from polling to subscribing, screen by screen, behind a flag. Keep polling as a fallback for networks that block WebSockets.
Hardening. Add per-connection limits, backpressure, reconnection with resume, and monitoring of connection counts and message rates.
Key Risks and Mitigations
- Connection scaling: persistent sockets consume server resources. Use a horizontally scalable pub/sub backplane (Redis/Kafka), cap connections, and load-test concurrency.
- Auth on the socket: WebSocket auth differs from HTTP. Validate tokens on connect and periodically re-check, and authorize each subscription.
- Message storms: a hot entity can flood clients. Throttle/coalesce updates, send deltas, and apply per-subscription rate limits.
Recommended Tooling
A GraphQL server supporting subscriptions (Apollo Server with graphql-ws), Redis or Kafka as the pub/sub backplane, OAuth/OIDC for socket auth, and metrics on connection count and message throughput. Keep REST/polling as a documented fallback.
Success Metrics
Measure update latency (poll interval to near-instant), request-volume reduction from removed polling, server load per connected client, and reconnection reliability.
Prerequisites
An existing GraphQL or API layer, a pub/sub backplane for multi-instance fan-out, WebSocket-capable infrastructure, and token-based auth that works on socket connect.