Axon框架下如何实现非共享存储持久化事件同时跨服务分发事件
优先采用发件箱模式(Outbox Pattern) 搭配Axon原生
EventPublicationInterceptor扩展实现
你可以在服务私有事件存储之外,新增一张独立的outbox_events发件箱表,事件写入私有事件存储的操作,和发件箱表写入操作在同一个本地事务中执行,保证两份数据的一致性。再通过Axon内置的调度组件,定期轮询发件箱表中的未推送事件,将其投递给Kafka/RabbitMQ等消息代理的对应Topic,推送成功后标记发件箱记录为已处理即可。该方案下事件的持久化完全在服务私有存储完成,不需要共享数据库,也不依赖消息代理的持久化能力,就算消息代理临时故障,待推送事件也会保存在本地发件箱中,恢复后可继续推送不会丢失。配置Axon多EventBus绑定实现
你可以给Axon同时绑定两套EventBus实现:本地使用EmbeddedEventStore将事件持久化到私有数据库,额外绑定KafkaMessageSource/SpringAMQPMessageSource类型的分布式EventBus,本地事件提交成功后自动触发分布式EventBus的投递逻辑。你只需要将投递规则配置为至少一次投递,下游服务消费时做好幂等校验即可,整个流程中消息代理只负责传输,不需要承担持久化责任,私有事件存储作为唯一可信源不对外暴露,符合微服务边界隔离要求。
注意不要直接在业务事务中调用消息代理的发送接口,避免出现事务提交成功但消息发送失败、或消息发送成功但事务回滚的一致性问题,发件箱模式是目前该场景下最成熟的一致性解决方案。
内容的提问来源于stack exchange,提问作者Tomás Juárez

