【问题标题】:Cqrs + microservices architecture : how to get data from another serviceCqrs + 微服务架构:如何从另一个服务获取数据
【发布时间】:2017-12-28 13:58:43
【问题描述】:

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

按照标准设置,我的意思是

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

假设我有一个订单服务和一个取货点服务,并且我有一个类似“发送订单摘要电子邮件”的命令。

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

  1. 命令直接到orders服务,然后orders服务查询提货点服务获取数据。

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

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

  4. 合并 2 个服务...鉴于它们没有其他共享上下文,这将是一个遗憾...

谢谢!

【问题讨论】:

    标签: java node.js microservices cqrs


    【解决方案1】:

    如何从其他服务获取数据

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

    关键点#1:您正在撰写的数据已过时——当电子邮件到达目的地时,服务所理解的真相可能已经发生了变化。因此,要求中固有的时间灵活性。

    关键点 #2:在发送电子邮件时,您根本不会更改任何一项服务的状态。你只是在复制其中的一部分。读取是 safe 操作。

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

    因此,这通常看起来是您的一个读取模型(可能是订单服务的模型)将支持一个查询,该查询列出了将发送电子邮件的订单。一些在服务之外运行的进程将定期查询该服务以获取待处理的电子邮件,查询所需的读取模型以编写消息、发送消息,最后将消息发布到订单服务的输入队列以共享信息消息已成功发送。订单服务会看到这一点,并且读取模型会更新以指示消息已发送。

    【讨论】:

      【解决方案2】:

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

      在 CQRS 中,这是通过 Saga/流程管理器实现的

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

      1. 它构建+发送完整的SendOrderSummaryEmail 命令到来自orders service 的相关聚合或
      2. 它调用一个基础设施服务,该服务拥有所有数据,然后构建一封电子邮件并将其发送给客户
      3. 或以上几点的组合,具体取决于您希望如何管理此流程

      详细信息针对您的情况,例如您需要构建哪些域服务(构建和格式化电子邮件)或基础设施服务(使用sendmailpostfix 或其他方式实际发送电子邮件)。

      【讨论】:

        猜你喜欢
        • 2019-05-17
        • 2020-11-24
        • 1970-01-01
        • 2021-08-06
        • 2019-11-11
        • 2014-01-08
        • 1970-01-01
        • 2020-04-27
        • 2015-06-10
        相关资源
        最近更新 更多