我正在为个人项目设置微服务/ cqrs架构,在“标准”设置中我有一点我不理解。
按标准设置,我的意思是
假设我有订单服务和取件服务,我有一个像“发送订单摘要电子邮件”这样的命令。
订单服务应如何获取有关发送电子邮件所需的取件点数据(例如营业时间等)?我看到了4种可能性,但肯定有其他可能性。
该命令直接进入订单服务,然后订单服务查询提货点服务以获取数据。
该命令转到接送点服务,然后接送点服务发布订单服务的新事件,并附上所需信息。
该命令直接进入订单服务,然后订单服务查询只读面向客户的数据库。
合并两项服务......鉴于他们没有其他共享背景,这可能会很遗憾...
谢谢!
答案 0 :(得分:3)
如何从其他服务获取数据
这有两个用例。在您的具体情况下,您所描述的内容有点类似于UI Composition;您正在创建一个从两个不同来源提取数据的视图。
关键点#1:您撰写的数据过时 - 当电子邮件到达目的地时,服务所理解的真相可能已经改变。因此,要求中存在一些关于时间的灵活性。
关键点#2:在发送电子邮件时,您根本不会更改任何一项服务的状态。你只是复制了它的某些部分。读取是safe操作。
关键点#3:实际上发送电子邮件会改变“现实世界”,而不是服务;这是一项可以与服务工作同时进行的活动。
所以这通常看起来是你的一个阅读模型(可能是订单服务的模型)将支持一个查询,该查询列出了将要发送电子邮件的订单。在服务之外运行的某个进程将定期查询该服务以查找待处理的电子邮件,查询所需的读取模型以撰写消息,发送它,最后将消息发布到订单服务的输入队列以共享信息。消息已成功发送。订单服务会看到,并且读取模型会更新以指示消息已经发送。
答案 1 :(得分:2)
您正在描述订单完成后向客户发送订单摘要电子邮件的流程 。
在CQRS中,这是通过Saga /流程管理器实现的。
我的想法是OrderSummaryEmailSaga
订阅OrderWasCompleted
事件;当触发此类事件时,saga会向Pickup service
查询所需信息(最有可能来自读取模型),然后:
SendOrderSummaryEmail
或orders service
命令
详细信息特定于您的情况,例如您需要构建的域服务(构建和格式化电子邮件)或基础结构服务(使用sendmail
或postfix
或其他任何方式实际发送电子邮件)