Java Cqrs+;微服务体系结构:如何从其他服务获取数据

Java Cqrs+;微服务体系结构:如何从其他服务获取数据,java,node.js,microservices,cqrs,Java,Node.js,Microservices,Cqrs,我正在为一个个人项目设置微服务/cqrs体系结构,在“标准”设置中有一点我不理解 我指的是标准设置 假设我有一个订单服务和一个取货点服务,我有一个类似“发送订单摘要电子邮件”的命令 订单服务应如何获取发送电子邮件所需的收货点数据(如营业时间等)?我认为有4种可能性,但肯定还有其他的 该命令直接发送到orders服务,然后orders服务查询取货点服务以获取数据 该命令转到“收货点”服务,然后“收货点”服务为“订单”服务发布一个新事件,并附加所需信息 该命令直接发送到orders服务,然后ord

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

我指的是标准设置

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

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

  • 该命令直接发送到orders服务,然后orders服务查询取货点服务以获取数据

  • 该命令转到“收货点”服务,然后“收货点”服务为“订单”服务发布一个新事件,并附加所需信息

  • 该命令直接发送到orders服务,然后orders服务查询只读的面向客户机的数据库

  • 合并2个服务。。。鉴于他们没有其他共同的背景,这将是一个遗憾

  • 谢谢

    如何从其他服务获取数据

    这有两个用例。在你的具体案例中,你所描述的有点类似于;您正在创建一个从两个不同来源提取数据的视图

    关键点#1:您正在编写的数据已经过时——当电子邮件到达目的地时,服务所理解的真相可能已经改变了。因此,在时间方面,要求具有一定的灵活性

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

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

    因此,这通常看起来是这样的,您的一个read模型(可能是order服务的模型)将支持一个查询,该查询列出将发送电子邮件的订单。在服务外部运行的某些进程将定期查询该服务以查找挂起的电子邮件,查询撰写消息所需的读取模型,发送消息,最后将消息发布到订单服务的输入队列以共享消息成功发送的信息。订单服务将看到这一点,读取模型将得到更新,以指示消息已发送。

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

    在CQRS中,这是通过Saga/Process manager实现的

    其思想是
    OrderSummaryEmailSaga
    订阅
    orderswasscompleted
    事件;当触发此类事件时,saga向拾取服务查询所需信息(很可能来自读取模型),然后:

  • 它生成并从订单服务向相关聚合发送完整的
    sendordersumaryemail
    命令,或
  • 它调用一个基础设施服务,在拥有所有数据的情况下,它生成一封电子邮件并将其发送给客户
  • 或者前面几点的组合,具体取决于您希望如何管理此过程
  • 详细信息针对您的具体情况,例如您需要构建哪些域服务(构建和格式化电子邮件)或基础设施服务(使用
    sendmail
    postfix
    或其他方式实际发送电子邮件)