使用事件存储和 Spring 应用程序事件一致地交付集成事件

Explore practical solutions to optimize last database operations.
Post Reply
suchona.kani.z
Posts: 84
Joined: Sat Dec 21, 2024 6:00 am

使用事件存储和 Spring 应用程序事件一致地交付集成事件

Post by suchona.kani.z »

在微服务架构等分布式应用程序中,服务通常需要相互通知重要的业务事件。例如,如果中央定价服务中商品的价格发生变化,则该变化事件可能与计费服务相关。另一个示例是商店服务中的订单事件:如果计费服务应为其创建发票,则这也与计费服务相关。因此,价格和商店服务应通过消息通知计费服务此类技术相关事件的发生。此类消息通常称为集成事件。

集成事件在技术上可以通过多种方式实现,包括通过消息队列或 HTTP POST 请求。但是,应保证某些一致性属性:仅当发送服务中的业务逻辑处理已成功完成时才应发送集成事件。否则,例如,如果由于数据库 贷款人员电子邮件列表 故障而保存新价格失败,则可能不会发送相应的集成事件(否则可能会发生,例如,订单由于技术原因失败,但仍发送发票)。另一方面,如果业务逻辑处理成功,则集成事件一定不能丢失。

正如Vaughn Vernon在著名的领域驱动设计“红皮书”《实现领域驱动设计》中所描述的,集成事件的一致交付可以通过“事件存储”来实现。在我的博客文章中,我描述了如何使用 Spring 在 Java 中实现这一点。除了 Spring Data JPA 之外,还特别使用了 Spring 应用程序事件 - 尽管如下一节所述,应用程序事件与集成事件不同。

在我们详细讨论之前,先对基于推和拉的通信方法进行分类:当服务根据推原理发送新发生的事件时,始终可以使用此处描述的解决方案。服务是否通过 HTTP 请求将事件直接发送到另一个服务,或者是否将事件发布到消息代理(例如 RabbitMQ),这些事件仅间接到达实际的接收者,这无关紧要。

集成事件和应用程序事件
返回集成事件和应用程序事件。尽管它们有联系,但它们之间有一个根本的区别:

如前所述,集成事件用于不同服务之间的通信。
Spring 的应用程序事件是一种在 Java 应用程序内(即在单个服务内)交换消息的方法。为此,Spring 提供了抽象 Java 类ApplicationEvent、接口ApplicationEventPublisher和注释等构造本文稍后将更详细地描述这些构造。
因此,应用程序事件是具体的编程语言构造,而集成事件更多的是一个抽象概念,可以通过不同的方式实现(至少在本博客文章的上下文中)。
Post Reply