如何使用CQRS和基于事件采购的微服务将新创建的资源提供给客户

时间:2017-07-05 13:23:43

标签: microservices cqrs event-sourcing

我正在尝试微服务,事件采购和CQRS。但是,我对如何从发出命令到执行查询以返回新状态感到有点困惑,特别是关于与Web API网关的交互。

作为一个例子,我试图编写的简单应用程序(可能实际上并不需要任何这些;它只是帮助我学习的东西)创建一个随机图,然后执行一些长时间运行的计算图表。我将其建模为两个单独的服务:GraphServiceComputationService。想象的流程如下:

  1. 用户请求新的随机图。
  2. API网关构造CreateGraph命令并将其发送给 graph service
  3. GraphService command handler创建图表并发布 GraphCreated事件。
  4. GraphService event handler订阅图形事件的主题, 处理GraphCreated事件并将图存储在持久读取中 存储
  5. 客户端以某种方式获取新创建的图表。
  6. ComputationService event handler订阅图表主题 事件,进程GraphCreated事件并可能开始 长时间运行的计算,例如计算直径。
  7. ComputationService发布DiameterComputed活动。
  8. GraphService事件处理程序订阅主题以进行计算 事件,已​​处理的DiameterComputed事件并更新图表 持久性读存储。
  9. 客户端以某种方式获得更新 - 比获取新图更容易,因为已经有了ID并且可以轮询更改/ websockets / SSE等。
  10. 这似乎相对简单。但是,我的困惑在于如何通知新的图形的API网关,从而通知Web客户端(如上面的粗体突出显示)。在典型的CRUD过程中,POST request创建新图的结果将是返回新资源的URL。但是,对于CQR​​S,命令应该不返回任何内容或异常。

    如何将信息传递回服务的客户端(在本例中为API网关),以获取新图的ID,以便它可以执行查询以获取新资源的表示并将其发送到用户?或者至少获取一个ID,以便Web客户端可以询问API网关等?

    正如我现在所看到的那样,在发出命令之后,每个人都被搁置了。需要某种订阅模型,可以查询图形创建的状态。我考虑过让API网关生成一个嵌入了CreateGraph命令的请求ID,但这会将服务与API结合起来。

    我显然错过了一些东西,但不知道是什么。我看过的所有例子或我读过的讨论都没有解决这个问题,并假设任何资源的ID都是已知的。我在这里找不到任何关于这个问题的讨论,但是如果我错过了它们,请指出我而不是重复问题。任何指针都会受到极大的欢迎。

1 个答案:

答案 0 :(得分:0)

  

如何将信息传递回服务的客户端(在本例中为API网关),以获取新图的ID,以便它可以执行查询以获取新资源的表示并将其发送到用户?或者至少获取一个ID,以便Web客户端可以询问API网关等?

通过听取回声。

至少一次交付背后的基本理念是,我会向您发送消息,并不断发送消息,直到我收到一条消息,证明您已收到至少一份副本我的留言。

因此,我的协议看起来像

  1. 建立一个我可以收集消息的邮箱
  2. 编入邮件说明以便传送到我的邮箱
  3. 将消息发送给您
  4. 检查我的邮箱
    • 如果有答案,我就完成了
    • 否则,我会向您发送另一份消息
  5. 邮箱可以通过多种方式实现 - 它可以是回调;它可能是一个承诺,它可能是correlation identifier。您可以通过命令处理程序调度信号,当它获得记录簿的写入确认时,或者通过"读取模型"当新资源可用时。