我正在尝试微服务,事件采购和CQRS。但是,我对如何从发出命令到执行查询以返回新状态感到有点困惑,特别是关于与Web API网关的交互。
作为一个例子,我试图编写的简单应用程序(可能实际上并不需要任何这些;它只是帮助我学习的东西)创建一个随机图,然后执行一些长时间运行的计算图表。我将其建模为两个单独的服务:GraphService
和ComputationService
。想象的流程如下:
CreateGraph
命令并将其发送给
graph service
。GraphService command handler
创建图表并发布
GraphCreated
事件。GraphService event handler
订阅图形事件的主题,
处理GraphCreated
事件并将图存储在持久读取中
存储ComputationService event handler
订阅图表主题
事件,进程GraphCreated
事件并可能开始
长时间运行的计算,例如计算直径。ComputationService
发布DiameterComputed
活动。GraphService
事件处理程序订阅主题以进行计算
事件,已处理的DiameterComputed
事件并更新图表
持久性读存储。这似乎相对简单。但是,我的困惑在于如何通知新的图形的API网关,从而通知Web客户端(如上面的粗体突出显示)。在典型的CRUD过程中,POST request
创建新图的结果将是返回新资源的URL。但是,对于CQRS,命令应该不返回任何内容或异常。
如何将信息传递回服务的客户端(在本例中为API网关),以获取新图的ID,以便它可以执行查询以获取新资源的表示并将其发送到用户?或者至少获取一个ID,以便Web客户端可以询问API网关等?
正如我现在所看到的那样,在发出命令之后,每个人都被搁置了。需要某种订阅模型,可以查询图形创建的状态。我考虑过让API网关生成一个嵌入了CreateGraph
命令的请求ID,但这会将服务与API结合起来。
我显然错过了一些东西,但不知道是什么。我看过的所有例子或我读过的讨论都没有解决这个问题,并假设任何资源的ID都是已知的。我在这里找不到任何关于这个问题的讨论,但是如果我错过了它们,请指出我而不是重复问题。任何指针都会受到极大的欢迎。
答案 0 :(得分:0)
如何将信息传递回服务的客户端(在本例中为API网关),以获取新图的ID,以便它可以执行查询以获取新资源的表示并将其发送到用户?或者至少获取一个ID,以便Web客户端可以询问API网关等?
通过听取回声。
至少一次交付背后的基本理念是,我会向您发送消息,并不断发送消息,直到我收到一条消息,证明您已收到至少一份副本我的留言。
因此,我的协议看起来像
邮箱可以通过多种方式实现 - 它可以是回调;它可能是一个承诺,它可能是correlation identifier。您可以通过命令处理程序调度信号,当它获得记录簿的写入确认时,或者通过"读取模型"当新资源可用时。