概述GraphQL Subscriptions用于事件推送与实时更新。使用`graphql-ws`协议与WebSocket连接,可在订阅的字段发生变化时向客户端推送消息,并配合心跳与重连提升稳定性。关键实践与参数协议:`graphql-ws`(推荐)心跳与重连:客户端定时`ping/pong`与指数退避重连授权:连接参数携带令牌并在服务端校验可扩展:多实例下通过消息队列或发布订阅广播事件示例/配置/实现// 服务端(Apollo + graphql-ws)
import { makeExecutableSchema } from '@graphql-tools/schema'
import { createServer } from 'http'
import { WebSocketServer } from 'ws'
import { useServer } from 'graphql-ws/lib/use/ws'
const typeDefs = `type Message { id: ID!, text: String! } type Query { _noop: Boolean } type Subscription { message: Message }`
const resolvers = { Subscription: { message: { subscribe: async function* () { while (true) { yield { message: { id: Date.now(), text: 'hi' } }; await new Promise(r => setTimeout(r, 1000)) } } } } }
const schema = makeExecutableSchema({ typeDefs, resolvers })
const server = createServer()
const wss = new WebSocketServer({ server })
useServer({ schema }, wss)
server.listen(4000)
// 客户端(graphql-ws)
import { createClient } from 'graphql-ws'
const client = createClient({ url: 'ws://localhost:4000' })
client.subscribe({ query: 'subscription { message { id text } }' }, { next: (data) => console.log(data) })
验证连接稳定:心跳与重连策略在网络抖动下保持订阅授权校验:无效令牌拒绝连接,可审计可扩展广播:多实例下事件一致广播,无丢失性能:订阅数与推送延迟在目标阈值内注意事项对热点订阅使用限速与分片在浏览器与Node环境分别测试与缓存与离线策略结合提升体验记录订阅事件与错误用于告警

发表评论 取消回复