用Server-Sent Events实现GraphQL Subscription
不依赖WebSocket,利用Django的StreamingHttpResponse与Server-Sent Events (SSE)协议,为GraphQL Subscription提供轻量级实时推送,兼容CDN与普通HTTP代理。 · 难度:入门 · +10XP
SSE+GraphQL的优雅组合
GraphQL Subscription通常依赖WebSocket,但WebSocket在CDN和一层负载均衡后面临复杂配置。SSE是一种纯HTTP服务器推送技术,只需一个长连接。本教程展示如何用Django的StreamingHttpResponse配合asyncio队列,监听数据库变动或Redis Pub/Sub,当有事件发生时将GraphQL响应格式化为SSE事件流。客户端使用EventSource即可接收。同时解决SSE连接数与Django同步/异步模式的兼容问题。
# subscriptions/stream.py
from django.http import StreamingHttpResponse
import asyncio
def subscription_stream(request, channel):
async def event_stream():
queue = asyncio.Queue()
# register listener
async for message in listen(channel):
await queue.put(f"data: {message}
")
yield await queue.get()
response = StreamingHttpResponse(event_stream(), content_type='text/event-stream')
response['Cache-Control'] = 'no-cache'
return response