【问题标题】:Cqrs + microservices architecture : how to get data from another serviceCqrs + 微服务架构:如何从另一个服务获取数据
【发布时间】:2017-12-28 13:58:43
【问题描述】:
【问题讨论】:
标签:
java
node.js
microservices
cqrs
【解决方案1】:
如何从其他服务获取数据
这有两个用例。在您的具体情况下,您所描述的内容有点类似于UI Composition;您正在创建一个从两个不同来源提取数据的视图。
关键点#1:您正在撰写的数据已过时——当电子邮件到达目的地时,服务所理解的真相可能已经发生了变化。因此,要求中固有的时间灵活性。
关键点 #2:在发送电子邮件时,您根本不会更改任何一项服务的状态。你只是在复制其中的一部分。读取是 safe 操作。
关键点#3:实际上发送电子邮件改变的是“现实世界”,而不是服务;这是一项可以与服务工作同时进行的活动。
因此,这通常看起来是您的一个读取模型(可能是订单服务的模型)将支持一个查询,该查询列出了将发送电子邮件的订单。一些在服务之外运行的进程将定期查询该服务以获取待处理的电子邮件,查询所需的读取模型以编写消息、发送消息,最后将消息发布到订单服务的输入队列以共享信息消息已成功发送。订单服务会看到这一点,并且读取模型会更新以指示消息已发送。
【解决方案2】:
您正在描述订单完成后向客户发送订单摘要电子邮件的流程。
在 CQRS 中,这是通过 Saga/流程管理器实现的。
这个想法是OrderSummaryEmailSaga订阅OrderWasCompleted事件;当此类事件被触发时,saga 会向 Pickup service 查询它需要的信息(最有可能来自读取模型),然后:
- 它构建+发送完整的
SendOrderSummaryEmail 命令到来自orders service 的相关聚合或
- 它调用一个基础设施服务,该服务拥有所有数据,然后构建一封电子邮件并将其发送给客户
- 或以上几点的组合,具体取决于您希望如何管理此流程
详细信息针对您的情况,例如您需要构建哪些域服务(构建和格式化电子邮件)或基础设施服务(使用sendmail 或postfix 或其他方式实际发送电子邮件)。