Asynchronous 如何处理GraphQL Apollo客户端中的异步突变 结构

Asynchronous 如何处理GraphQL Apollo客户端中的异步突变 结构,asynchronous,rabbitmq,graphql,apollo,apollo-client,Asynchronous,Rabbitmq,Graphql,Apollo,Apollo Client,这是一个如何在我们当前的基础架构中最好地使用Apollo Client 2的问题。我们有一个Graphql服务器(Apollo服务器2),它连接到多个其他端点。突变通过RabbitMQ发送,我们的Graphql还侦听RabbitMQ,然后通过订阅将其推送到客户端 实施 我们有一个阿波罗服务器,我们发送变异,它们总是给出一个null,因为它们是异步的。结果将通过订阅发送回。 我现在已经这样实现了它 发送变异 创建一个优化响应 通过Update功能中的writeQuery优化更新状态 当实际响应出

这是一个如何在我们当前的基础架构中最好地使用Apollo Client 2的问题。我们有一个Graphql服务器(Apollo服务器2),它连接到多个其他端点。突变通过RabbitMQ发送,我们的Graphql还侦听RabbitMQ,然后通过订阅将其推送到客户端

实施 我们有一个阿波罗服务器,我们发送变异,它们总是给出一个
null
,因为它们是异步的。结果将通过订阅发送回。 我现在已经这样实现了它

  • 发送变异
  • 创建一个
    优化响应
  • 通过
    Update
    功能中的
    writeQuery
    优化更新状态
  • 当实际响应出现(为空)时,再次使用
    更新
    方法中的
    优化响应
  • 等待订阅返回响应
  • 然后用实际数据刷新状态/组件
如你所见。。这不是最理想的方式,而且客户端非常复杂

希望尽可能让客户保持沉默,减少复杂性。 阿波罗似乎主要是为同步突变而设计的(这是合乎逻辑的)


您对更好的实现方法有何想法?

突变可以是异步的

Apollo客户端中的突变通常不同步。客户可以根据需要等待突变结果。您可能不希望您的GraphQL服务在这段时间内保持HTTP连接打开,这似乎就是您在这里要处理的问题。您对突变的响应方式与GraphQL的设计方式背道而驰,这就开始产生复杂性——在我看来——这是您不希望的

在实现级别而不是API级别解决问题

我的想法是:遵循GraphQL规范和教条式方法。让突变返回突变结果。这将创建一个任何开发人员都熟悉的API。相反,将这些结果的交付视为您想要解决的实际问题。GraphQL未指定客户端-服务器通信的传输协议。如果您在服务器和客户端之间运行WebSocket,那么就已经抛弃HTTP,完全在套接字级别上运行

利用阿波罗客户的灵活链接系统

这就是阿波罗2号客户机的用武之地。Apollo Client 2允许您编写自己的网络链接来处理客户机-服务器通信。如果您在链路级别上解决通信问题,开发人员就可以像往常一样使用客户端,而不需要了解任何网络通信细节


我希望这会有所帮助,你仍然有机会朝着这个方向前进。我知道这可能需要在服务器端进行更改,但当您的应用程序前端很重时(就像现在大多数应用程序一样),这完全是值得的。

突变可以是异步的

Apollo客户端中的突变通常不同步。客户可以根据需要等待突变结果。您可能不希望您的GraphQL服务在这段时间内保持HTTP连接打开,这似乎就是您在这里要处理的问题。您对突变的响应方式与GraphQL的设计方式背道而驰,这就开始产生复杂性——在我看来——这是您不希望的

在实现级别而不是API级别解决问题

我的想法是:遵循GraphQL规范和教条式方法。让突变返回突变结果。这将创建一个任何开发人员都熟悉的API。相反,将这些结果的交付视为您想要解决的实际问题。GraphQL未指定客户端-服务器通信的传输协议。如果您在服务器和客户端之间运行WebSocket,那么就已经抛弃HTTP,完全在套接字级别上运行

利用阿波罗客户的灵活链接系统

这就是阿波罗2号客户机的用武之地。Apollo Client 2允许您编写自己的网络链接来处理客户机-服务器通信。如果您在链路级别上解决通信问题,开发人员就可以像往常一样使用客户端,而不需要了解任何网络通信细节

我希望这会有所帮助,你仍然有机会朝着这个方向前进。我知道这可能需要在服务器端进行更改,但当您的应用程序前端比较繁重时(就像现在大多数应用程序一样),这是完全值得的