在多模块单体应用中使用 Outbox/Inbox 模式实现可靠的事件处理
💡
原文中文,约7000字,阅读约需17分钟。
📝
内容提要
本文以ModularCRM项目为例,介绍了如何在模块化单体应用中通过Outbox/Inbox模式实现可靠的事件处理。该项目整合多个数据库模块,确保下单与事件发布的一致性,使用Outbox模式保存事件,Inbox模式处理接收事件,从而实现事务性消息处理和多数据库环境下的可靠事件处理。
🎯
关键要点
- 本文以ModularCRM项目为例,介绍如何在模块化单体应用中通过Outbox/Inbox模式实现可靠的事件处理。
- ModularCRM集成了多个ABP框架开源模块,包括账户、权限和设置管理等。
- 项目包含三个业务模块:订单模块(使用MongoDB)、产品模块(使用MongoDB)和支付模块(使用SQL Server)。
- 各模块通过ABP框架的DistributedEventBus进行通信,确保下单与事件发布的一致性。
- Outbox模式将分布式事件与数据库操作在同一事务中保存,确保数据更新与事件发布的一致性。
- Inbox模式先将接收到的分布式事件保存到数据库,通过事务性方式处理事件,确保消息只被处理一次。
- 每个模块需要配置独立的Outbox/Inbox,避免消息重复处理。
- ModularCRM主应用配置会发送和接收所有ABP框架开源模块的消息。
- 订单模块只发送OrderPlacedEto事件,并接收PaymentCompletedEto事件。
- 产品模块只接收EntityCreatedEto和OrderPlacedEto事件,暂时不发送任何事件。
- 支付模块只发送PaymentCompletedEto事件,并接收OrderPlacedEto事件。
- 通过引入Outbox/Inbox模式,实现了事务性的消息发送和接收,可靠的消息处理机制。
- ModularCRM项目展示了如何在单体应用中优雅地处理多数据库场景。
➡️