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

Microservices 如何使用CQR和基于事件源的微服务将新创建的资源提供给客户端,microservices,cqrs,event-sourcing,Microservices,Cqrs,Event Sourcing,我正在试验微服务、事件源和CQR。但是,对于如何从发出命令到执行查询以返回新状态,特别是与web API网关的交互,我有点困惑 例如,我正在尝试编写的简单应用程序(可能实际上不需要这些,它只是帮助我学习的东西)创建一个随机图,然后在该图上执行一些长时间运行的计算。我将其建模为两个独立的服务:GraphService和ComputationService。设想的工艺流程如下: 用户请求新的随机图 API网关构造CreateGraph命令并将其发送到 图形服务 GraphService命令处理程序创

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

例如,我正在尝试编写的简单应用程序(可能实际上不需要这些,它只是帮助我学习的东西)创建一个随机图,然后在该图上执行一些长时间运行的计算。我将其建模为两个独立的服务:
GraphService
ComputationService
。设想的工艺流程如下:

  • 用户请求新的随机图
  • API网关构造
    CreateGraph
    命令并将其发送到
    图形服务
  • GraphService命令处理程序
    创建图形并发布
    图形已创建
    事件
  • GraphService事件处理程序
    订阅图形事件的主题, 处理
    GraphCreated
    事件并以持久读取方式存储图形 储藏室
  • 客户端以某种方式获取新创建的图形。
  • 计算服务事件处理程序
    订阅图表主题 事件,处理
    图形创建的
    事件并可能开始
    长时间运行的计算,例如计算直径
  • 计算服务
    发布
    直径计算
    事件
  • GraphService
    事件处理程序订阅主题进行计算 事件,已处理
    直径计算
    事件并更新中的图形 持久读存储器
  • 客户端以某种方式得到更新—比获取新图形更容易,因为它已经有了一个ID,可以轮询更改/websockets/SSE等
  • 这似乎相对简单。然而,我的困惑在于如何通知API网关,从而通知web客户机新图形(如上面粗体突出显示的)。例如,在典型的CRUD过程中,创建新图形的
    POST请求的结果是返回新资源的URL。但是,对于CQR,命令应该不返回任何内容或异常

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

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

    我显然错过了什么,但不知道是什么。我看过的示例或讨论中没有一个解决这个问题,并假设任何资源的ID都是已知的。我在这里找不到任何关于这个问题的讨论,但如果我错过了,请告诉我,而不是重复问题。任何指点都会受到热烈欢迎

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

    通过倾听回声

    至少一次发送的基本思想是,我将向您发送一条消息,并不断重复发送,直到我收到一条消息,证明您至少收到了我的消息的一份副本

    因此,我的协议看起来像

  • 建立一个我可以收集邮件的邮箱
  • 将发送到我的邮箱的说明编码到邮件中
  • 把信息发给你
  • 检查我的邮箱
    • 如果答案在那里,我就完了
    • 否则,我将向您发送另一份邮件副本

  • 邮箱可以通过多种方式实现——可以是回调;这可能是一个承诺,也可能是一个承诺。您可以让命令处理程序在记录簿确认写入时发送信号,或者在新资源可用时通过“读取模型”发送信号。

    生成请求ID是正确的方法。或者,您可以自己生成图形ID,省去中间人。为什么不使用客户机生成的GUID呢?就像在服务和客户机之间的契约中只生成请求/UUID一样?我想那会有用的。在接受命令之前,检查UUID中的冲突可能是验证过程的一部分。这就是你想象的吗?是的,就是这样。谢谢你的信息。我现在决定使用上面评论中讨论的唯一请求ID。