Cqrs +微服务架构:如何从其他服务获取数据
我正在为个人项目设置一个微服务/ cqrs体系结构,在“标准”设置中有一点我不明白。
我的意思是标准设置
https://www.ibm.com/developerworks/cloud/library/cl-build-app-using-microservices-and-cqrs-trs/index.html
假设我有一个订单服务和一个提货点服务,而且我有一个像“发送订单汇总电子邮件”的命令。
订单服务应该如何获得发送电子邮件所需的取件点数据(例如开放时间等)? 我看到4种可能性,但肯定有其他的。
-
该命令直接进入订单服务,然后订单服务查询取货点服务以获取数据。
-
该命令转到取件点服务,然后取件点服务发布订单服务的新事件,并附带所需的信息。
-
该命令直接进入订单服务,然后订单服务查询只读的面向客户端的数据库。
-
合并2服务…鉴于他们没有其他共享的上下文,这将是一个可惜…
谢谢 !
如何从另一个服务获取数据
这有两个用例。 在你的具体情况下,你所描述的有点类似于UI构成 ; 您正在创build一个从两个不同来源提取数据的视图。
关键点1:您所撰写的数据是陈旧的 – 在电子邮件到达目的地时,服务所了解的真相可能已经改变。 因此,要求在时间上有一定的灵活性。
关键点2:在发送电子邮件时,根本不会改变任何服务的状态。 你只是把它的一部分的副本。 读取是安全的操作。
要点3:实际上发送电子邮件改变了“真实世界”,而不是服务; 这是一项可以与服务工作同时进行的活动。
那么这通常看起来像是你的一个阅读模型(可能是订单服务)将支持一个查询列出电子邮件将被发送的订单。 一些在服务之外运行的进程将定期查询该服务的未决电子邮件,查询所需的读取模型来撰写邮件,发送邮件,最后将邮件发送到订单服务的input队列以共享信息消息已成功发送。 订单服务将会看到,并且读取的模型被更新以指示消息已经被发送。
您正在描述订单完成后向客户发送订单摘要电子邮件的过程 。
在CQRS中,这是通过一个佐贺/进程pipe理器来实现的 。
这个想法是OrderSummaryEmailSaga
订阅OrderWasCompleted
事件; 当这样的事件被触发时,传奇向Pickup service
查询它所需要的信息(最可能来自阅读模型),然后:
- 它build立+发送一个完整的
SendOrderSummaryEmail
命令到orders service
或相关的聚合 - 它调用一个基础设施服务,拥有所有的数据,它会build立一个电子邮件并发送给客户
- 或前面几点的组合,具体取决于你想如何pipe理这个过程
这些细节是特定于你的情况,比如你需要build立什么域名服务(build立和格式化电子邮件)或基础设施服务(实际发送电子邮件使用sendmail
或postfix
或其他)。