Apollo GraphQL服务端事件最佳实践及subscriptions/SSE配置相关问题
Apollo Server 3 subscriptions/SSE配置及相关问题解答
1. 公认配置最佳实践
Apollo 3起官方将订阅相关能力从核心包中拆分出来,不再默认内置,根据使用场景可分为两类方案:
- WebSocket方案(需要双工通信场景)
优先选用仍在维护的graphql-ws库,弃用已经停止迭代的subscription-transport-ws:- 安装必要依赖:
graphql-subscriptions(官方拆分出的PubSub实现)、graphql-ws、ws、@graphql-tools/schema - 先用
makeExecutableSchema拼接好你的typeDefs和resolvers - 启动Express服务时单独启动WebSocket服务,监听HTTP服务的upgrade事件,绑定拼接好的schema即可完成接入
- 生产环境不要用默认的内存版PubSub,仅适合单实例调试,多实例部署需替换为Redis、RabbitMQ等分布式消息中间件对应的PubSub实现
- 安装必要依赖:
- SSE方案(仅服务端单向推送场景,适配你的打印需求)
Apollo 3+原生支持SSE订阅,无需额外安装WebSocket相关依赖,仅需要在初始化ApolloServer时添加配置项subscriptions: { path: '/graphql/stream' }即可启用,SSE方案没有WebSocket的跨域、反向代理适配问题,配置复杂度更低,更匹配你单向推送打印请求的业务场景。
2. 原有HTTP接口兼容性
接入订阅功能完全不会影响原有基于HTTP的query和mutation接口,两种能力走完全独立的请求链路,仅会复用你定义的schema、resolver和上下文逻辑,原有接口不需要做任何改造即可正常使用。
3. Playground调试支持
目前Apollo官方的Playground(新版叫Apollo Sandbox)已经原生支持两种订阅模式的调试:
- WebSocket订阅:只要服务端配置的WebSocket路径和端口与HTTP服务一致,Sandbox会自动检测到订阅能力,编写subscription查询后点击运行即可自动建立WebSocket连接接收数据
- SSE订阅:v3.9及以上版本的Sandbox已经原生支持SSE流调试,服务端开启SSE订阅路径后会自动识别,直接运行查询即可接收推送
- 若使用旧版Playground,仅需要在设置项中手动填写
subscriptionEndpoint为你的订阅服务地址即可正常调试。
内容的提问来源于stack exchange,提问作者Magnus Brusletto Berntsen
相关产品推荐
相关产品推荐

