如何使用 Apollo Gateway 实现异步突变

Posted

技术标签:

【中文标题】如何使用 Apollo Gateway 实现异步突变【英文标题】:How to achieve Asynchronous mutations using Apollo Gateway 【发布时间】:2020-10-31 09:46:10 【问题描述】:

当使用 Apollo Gateway 时,Gateway 会直接将变更转发给相关的实现服务。此类请求是同步的。

有没有一种方法可以让 Apollo Gateway 将所有的变更发布到像 rabbitmq 这样的消息代理,这样我们就可以实现网关和实现服务之间的异步通信?

【问题讨论】:

【参考方案1】:

澄清您的问题:请求不是同步的,而是串行的。

与 GraphQL 规范允许“允许并行化”开放的查询不同,突变必须以一系列方式运行。

(链接到Query 和Mutation 规范

6.2.1 查询

...

    设 data 为正常运行 ExecuteSelectionSet(selectionSet, queryType, initialValue, variableValues) 的结果(允许并行化)。

6.2.2 突变

...

    令 data 为连续运行 ExecuteSelectionSet(selectionSet, mutationType, initialValue, variableValues) 的结果。

广泛采用的模式是您的突变应该“在完成后返回,并等到它拥有该数据”。然而,理论上,你可以让你的突变开始一些事件,然后回应说它已经发生了。然后,您可以使用Subscription 来确定响应何时准备就绪。同样,这并不是真正的“通常使用 GraphQL 的方式”,但理论上是可以的。

【讨论】:

我想我不确定您是在询问运行多个突变,还是特别询问不使用 HTTP。如果是前者,这就是答案。如果是后者,我有一个不同的答案,从 CachedRemoteGraphQLDataSource 变为自定义事件驱动的答案。 我试图不在网关和其他实现服务之间使用 HTTP。 (仅适用于突变)。网关应该将突变发布到消息代理,而不是通过 HTTP 将突变直接发送到实现服务。这些服务将依次侦听消息代理中的任何消息。这样即使一个服务宕机了,mutation也不会丢失,服务一上线就可以消费。如何使用 Apollo Gateway 实现这一目标

以上是关于如何使用 Apollo Gateway 实现异步突变的主要内容,如果未能解决你的问题,请参考以下文章

Apollo 8 — ConfigService 异步轮询接口的实现

如何将 Apollo Server 异步附加到 Lambda 处理程序?

有没有办法在 Apollo Gateway 和联合服务之间添加缓存?

如何在 GraphQL Apollo 客户端中处理异步突变

使用Gateway-Worker实现多人分组实时聊天 结合第三方tp

React Apollo - nodejs graphql后端返回异步响应后如何重新获取(更新)数据