Real-Time GraphQL Subscriptions
Stream live updates to clients over WebSocket-backed GraphQL subscriptions with backpressure awareness.
Why Subscriptions Exist
GraphQL gives you three root operation types: query (read), mutation (write), and subscription (live stream). A subscription is the only one that keeps a long-lived connection open and pushes multiple results to the client over time.
- Query/Mutation: one request, one response, connection closes.
- Subscription: one request, a stream of responses, until either side closes it.
In Strawberry, a subscription resolver is an async generator: every yield becomes one payload delivered to the client. Under the hood, FastAPI carries this over a WebSocket, because plain HTTP cannot push server-initiated frames cleanly.
An Async Generator Is the Core Idea
Before wiring GraphQL, understand the engine: Python async generators. Each yield hands one value to the consumer and then suspends until the consumer asks for the next one. This natural pull-based flow is what gives subscriptions backpressure for free: the producer only advances when the consumer is ready.
This snippet runs anywhere — it is the exact shape a Strawberry subscription resolver takes, minus the decorator.
import asyncio
async def counter(limit: int):
for i in range(limit):
await asyncio.sleep(0.1) # simulate work / waiting for an event
yield i
async def main():
async for value in counter(5):
print(f"received: {value}")
asyncio.run(main())All lessons in this course
- Defining Types, Queries and Mutations
- Solving N+1 Queries with DataLoaders
- Real-Time GraphQL Subscriptions
- Query Cost Analysis and Depth Limiting