软件架构模式之第五章:事件驱动架构-事件驱动 vs 消息驱动

时间:2024-02-18 16:32:07

事件驱动系统和消息驱动系统之间存在差异吗?实际上确实存在微妙但重要的区别,需要进行了解和理解。事件驱动系统处理事件,而消息驱动系统处理消息。

第一个区别与您向整个系统发送的内容上下文有关。事件通知其他人状态变化或您所做的某些事情,例如我刚刚下了订单我刚刚提交了对某个物品的竞价。另一方面,消息是针对特定服务发出的命令或请求,例如将此付款应用于此订单将该物品运送到此地址给我客户的电子邮件地址。请注意这里的区别-通过触发事件来响应事件的服务不知道哪些服务(或多少个)会作出响应,而消息通常指向已知单个服务(如支付)。

事件和消息之间另一个区别在于对于事件通道所有权问题。在事件中,发送者拥有该事件通道;而在消息中,则接收者拥有该通道。当考虑到时间或信息合同时,所有权变得更加重要。请考虑图5-3Order Placement服务发送Order Placed event并由Payment service回复 的示例 。在这种情况下发送者(Order Placement) 拥有event channel  contract.换句话说, contract 变更将由 Order Placement 服务启动,并且 Payment 服务以及所有其他响应该event service都必须遵守并适应这些变化。

 Figure 5-3. With events, the sender owns the event channel and contract

然而,在消息驱动的系统中,情况正好相反-接收者拥有消息通道。如图5-4所示,订单放置服务以命令的形式告知支付服务应用付款。在这种情况下,支付服务不仅具备消息通道(队列),还具备消息合同。请注意,在基于消息的处理中,订单放置服务需要遵守由支付服务发起的合同更改。

 Figure 5-4. With messages, the receiver owns the message channel and contract

事件通道工件的类型也是区分事件驱动系统和消息驱动系统的一个关键因素。一般情况下,当触发事件时,事件驱动系统采用基于主题或通知服务的发布-订阅式消息传递方式,而消息驱动系统则常使用基于队列或消息服务的点对点消息传递方式。然而,并不意味着事件驱动系统不能使用点对点消息传递——在某些情况下,为了从另一个服务中检索特定信息或控制系统中事件顺序或时间,可能需要采用点对点消息传递。