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