【发布时间】:2020-10-31 09:46:10
【问题描述】:
当使用 Apollo Gateway 时,Gateway 会直接将变更转发给相关的实现服务。此类请求是同步的。
有没有一种方法可以让 Apollo Gateway 将所有的变更发布到像 rabbitmq 这样的消息代理,这样我们就可以实现网关和实现服务之间的异步通信?
【问题讨论】:
标签: apollo-server graphql-java apollo-federation apollo-gateway
当使用 Apollo Gateway 时,Gateway 会直接将变更转发给相关的实现服务。此类请求是同步的。
有没有一种方法可以让 Apollo Gateway 将所有的变更发布到像 rabbitmq 这样的消息代理,这样我们就可以实现网关和实现服务之间的异步通信?
【问题讨论】:
标签: apollo-server graphql-java apollo-federation apollo-gateway
澄清您的问题:请求不是同步的,而是串行的。
与 GraphQL 规范允许“允许并行化”开放的查询不同,突变必须以一系列方式运行。
6.2.1 查询
...
- 设 data 为正常运行 ExecuteSelectionSet(selectionSet, queryType, initialValue, variableValues) 的结果(允许并行化)。
6.2.2 突变
...
- 令 data 为连续运行 ExecuteSelectionSet(selectionSet, mutationType, initialValue, variableValues) 的结果。
广泛采用的模式是您的突变应该“在完成后返回,并等到它拥有该数据”。然而,理论上,你可以让你的突变开始一些事件,然后回应说它已经发生了。然后,您可以使用Subscription 来确定响应何时准备就绪。同样,这并不是真正的“通常使用 GraphQL 的方式”,但理论上是可以的。
【讨论】:
CachedRemoteGraphQLDataSource 变为自定义事件驱动的答案。