Apollo-Server GraphQL如何在外部WebSocket服务器上进行订阅。

3

我有一个问题,因为我很难理解它。目前我创建了一个使用Apollo-Server创建的GraphQL API服务器,并使用本地sqlite数据库进行持久化。我的查询和变异工作正常。

我还有一个外部WebSocket服务器,不断产生匹配我的GraphQL/Database架构的消息,例如ws://localhost:8000/websocket。是否可以让我的GraphQL服务器订阅该websocket地址,并不断解析这些消息并使用适当的变异插入到后端数据库中?

然后我将具有Vue前端,通过Vue Apollo Clients WS订阅不断显示结果。


我可以从WebSocket技术上解析那个不断流动的数据,并不断调用会插入到数据库中的变异。然后,我可以为Apollo Server和Apollo Client添加PubSub,但这最终会成为另一个WebSocket服务器。原始服务器具有传入数据流,而另一个WebSocket服务器用于订阅以监视更改?一定有更好的方法来实现我所想象的吧? - animusdx
2个回答

0
让我的GraphQL服务器订阅那个WebSocket地址并不断解析那些消息。
通常不是这样的,而是你可以使ws服务器调用graphql服务器来执行变更。如果你想使用WS作为所有内容-查询、变更和订阅的主要传输层的话,就这么做。
但通常架构会将查询和变更与订阅分开处理,因为它们更具有无状态性和关键性,而订阅则更具有有状态性(持久连接)。
client -> queries & mutations -> graphql server --> redis pubsub -+
                                                                  |
client <--> subscriptions <-- graphql subscription server <-------+

在简单的情况下,如果您不需要高负载,可以将两个服务器组合起来使用内存发布订阅

但是,如果您非常想要,当然可以编写自定义代码来连接GraphQL服务器 -> 后台侦听WS服务器。例如,请参见https://github.com/enisdenjo/graphql-ws#node-client 如果您有一些用户上下文,则可能会出现问题。 您需要拥有所有用户更改发生的自定义连接。 或为每个用户提供专用连接


谢谢。阿波罗文档有点让人困惑。他们提供了一个内存示例,然后链接到graphql-ws。我无法弄清楚它们之间的联系。正如你所说,使用websocket与GQL服务器通信是有意义的。 - user2157850

0

是的,这可以很容易地完成,只需编写一个服务工作者或工作线程,不断检查新消息即可。 可以使用 Node.js 中的 worker_threads 完成。

如果您需要实时实现它, 请确保您的工作线程启动套接字连接,并始终连接到您发布消息的端口。

您可以使用 socket.io 库完成此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接