GraphQL 订阅和 WebSocket 协议有啥区别?

Posted

技术标签:

【中文标题】GraphQL 订阅和 WebSocket 协议有啥区别?【英文标题】:What are differences between GraphQL Subscription and WebSocket protocol?GraphQL 订阅和 WebSocket 协议有什么区别? 【发布时间】:2021-08-12 01:01:27 【问题描述】:

我有两个方面。

一方面,我通过使用库/包(如 ws(Node.js WebSocket 库)或 Socket.io)直接使用 WebSocket 协议。在这里,我可以使用测试工具订阅和以wswss 开头的地址,如ws://localhost:8080 并接收更新。

另一方面,我通过使用 ApolloGraphQL 之类的组件来使用 GraphQL 订阅。看来这样我应该使用嵌入在 GraphQL 中的东西。以这种方式开发的项目无法通过ws://wss://地址访问,或者至少我不知道。

我的问题是两者之间有什么区别? GraphQL 订阅是否建立在 WebSocket 之上?如果是,如何?如何通过 ws://wss:// url 访问 GraphQL 订阅?

更新: 我以前读过this 和this 的问题,但它们并没有多大帮助。

【问题讨论】:

【参考方案1】:

GraphQL 是一种规范,通常通过 HTTP 看到 GraphQL 用于查询和突变,但是对于 GraphQL 订阅,我们需要从 API 接收持续更新。这就是 WebSockets 的用武之地。

WebSockets 通常用作 GraphQL 订阅的传输协议。因此,为了回答您的问题,GraphQL 订阅不受任何协议的约束。事实上,GraphQL 查询和突变也不限于 HTTP。因此,基于 WebSocket 的 GraphQL 订阅库实现了一个小型协议,它们通过该协议发送 GraphQL 订阅操作和结果。

两个值得注意的实现是:

subscriptions-transport-ws 由 Apollo 团队制作(因此在 Apollo Server 中得到了大力支持),但不再积极维护 graphql-ws 这是一个后续项目(有轻微的不兼容性)。它的自述文件确实解释了如何将其添加到 Apollo 服务器。

这些只是具有服务器端和客户端实现的协议库,以促进 GraphQL 操作和结果通过 WebSockets 发送。因此,它们使您不必想出自己的协议或在 WebSockets 以外的其他东西上实现一个协议,从而减少了很多工作。

【讨论】:

工具呢?如何查看 GraphQL Subscription 的流量?

以上是关于GraphQL 订阅和 WebSocket 协议有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

graphql 订阅无法连接到弹性 beantalk 的 websocket 端点

外部 WebSocket 服务器上的 Apollo-Server GraphQL 订阅

GraphQL 订阅、websocket、nodejs、Express 会话

使用 WebSocket 的原始 javascript GraphQL 订阅不起作用

迁移到纯 websocket 后,我​​在 AWS Appsync 上收到 GraphQL 订阅错误

如何在 graphql-playground 中更改 websocket url(订阅)