如何使用 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 和联合服务之间添加缓存?