我在为一个个人项目设置一个microservices/cqrs架构,有一点我在“标准”设置中不明白。
我是说,按标准设置
https://www.ibm.com/developerworks/cloud/library/cl-build-app-using-microservices-and-cqrs-trs/index.html
假设我有一个订单服务和一个取货点服务,我有一个类似“发送订单摘要电子邮件”的命令。
订单服务应该如何获取需要发送电子邮件的取货点(如营业时间等)的数据?我看到了4种可能性,但肯定还有其他可能性。
该命令直接转到orders服务,然后orders服务查询pickup points服务以获取数据。
该命令转到pickup points服务,然后pickup points服务发布带有所需信息的orders服务的新事件。
该命令直接进入orders服务,然后orders服务查询面向只读客户机的数据库。
合并2个服务…鉴于他们没有其他共同的背景,这将是一个遗憾…
谢谢!

最佳答案

如何从其他服务获取数据
这有两个用例。在您的具体案例中,您所描述的有点类似于UI Composition;您正在创建一个视图,该视图从两个不同的源中提取数据。
关键点1:你正在编写的数据已经过时了——当电子邮件到达目的地时,服务理解的事实可能已经改变了。因此,在需求中存在一些关于时间的灵活性。
要点2:在发送电子邮件时,您根本不会更改任何一个服务的状态。你只是在复制它的一部分。读取是一个safe操作。
要点3:实际发送电子邮件改变的是“真实世界”,而不是服务;这是一项可以与服务工作同时执行的活动。
所以这通常看起来像是您的一个read模型(可能是order服务的模型)将支持一个查询,列出将要发送电子邮件的订单。在服务外部运行的某个进程将定期查询该服务以查找挂起的电子邮件,查询所需的读取模型以编写邮件,发送邮件,最后将邮件发送到订单服务的输入队列以共享成功发送邮件的信息。订单服务将看到这一点,并且读取模型将得到更新,以指示消息已经发送。

07-24 09:38
查看更多