Cqrs +微服务架构:如何从其他服务获取数据

我正在为个人项目设置一个微服务/ cqrs体系结构,在“标准”设置中有一点我不明白。

我的意思是标准设置

https://www.ibm.com/developerworks/cloud/library/cl-build-app-using-microservices-and-cqrs-trs/index.html

假设我有一个订单服务和一个提货点服务,而且我有一个像“发送订单汇总电子邮件”的命令。

订单服务应该如何获得发送电子邮件所需的取件点数据(例如开放时间等)? 我看到4种可能性,但肯定有其他的。

  1. 该命令直接进入订单服务,然后订单服务查询取货点服务以获取数据。

  2. 该命令转到取件点服务,然后取件点服务发布订单服务的新事件,并附带所需的信息。

  3. 该命令直接进入订单服务,然后订单服务查询只读的面向客户端的数据库。

  4. 合并2服务…鉴于他们没有其他共享的上下文,这将是一个可惜…

谢谢 !

如何从另一个服务获取数据

这有两个用例。 在你的具体情况下,你所描述的有点类似于UI构成 ; 您正在创build一个从两个不同来源提取数据的视图。

关键点1:您所撰写的数据是陈旧的 – 在电子邮件到达目的地时,服务所了解的真相可能已经改变。 因此,要求在时间上有一定的灵活性。

关键点2:在发送电子邮件时,根本不会改变任何服务的状态。 你只是把它的一部分的副本。 读取是安全的操作。

要点3:实际上发送电子邮件改变了“真实世界”,而不是服务; 这是一项可以与服务工作同时进行的活动。

那么这通常看起来像是你的一个阅读模型(可能是订单服务)将支持一个查询列出电子邮件将被发送的订单。 一些在服务之外运行的进程将定期查询该服务的未决电子邮件,查询所需的读取模型来撰写邮件,发送邮件,最后将邮件发送到订单服务的input队列以共享信息消息已成功发送。 订单服务将会看到,并且读取的模型被更新以指示消息已经被发​​送。

您正在描述订单完成后向客户发送订单摘要电子邮件过程

在CQRS中,这是通过一个佐贺/进程pipe理器来实现的

这个想法是OrderSummaryEmailSaga订阅OrderWasCompleted事件; 当这样的事件被触发时,传奇向Pickup service查询它所需要的信息(最可能来自阅读模型),然后:

  1. 它build立+发送一个完整的SendOrderSummaryEmail命令到orders service或相关的聚合
  2. 它调用一个基础设施服务,拥有所有的数据,它会build立一个电子邮件并发送给客户
  3. 或前面几点的组合,具体取决于你想如何pipe理这个过程

这些细节是特定于你的情况,比如你需要build立什么域名服务(build立和格式化电子邮件)或基础设施服务(实际发送电子邮件使用sendmailpostfix或其他)。