自动化与脚本
在 Spring Boot 中实现事件驱动架构(领域事件…
当需要在 Spring Boot 3.x 中通过领域事件、@TransactionalEventListener、Kafka 和事务性 Outbox 模式实现可靠的事件驱动微服务时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 Spring Boot 中实现事件驱通用
解决思路
- 设计领域事件:创建不可变的事件类,继承基础 DomainEvent 类,包含 eventId、occurredAt、correlationId 字段。
- 从聚合根发布事件:在聚合根中收集领域事件,保存聚合后通过 ApplicationEventPublisher.publishEvent() 逐个发布,然后调用 clearDomainEvents() 清空。
- 事务性处理事件:在事件处理器上使用 @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT),确保事件在数据库事务提交后才触发;验证处理器执行前数据库状态已提交。
- 配置 Kafka 基础设施:设置 spring.kafka.bootstrap-servers、producer.value-serializer 为 JsonSerializer,使用 KafkaTemplate 发布、@KafkaListener 消费;先发送测试事件确认消费者日志中出现后再进入生产模式。
- 实现 Outbox 模式:创建 OutboxEvent 实体(id、aggregateId、eventType、payload、publishedAt),与业务数据在同一事务中原子写入,由定时处理器扫描并发布待处理事件;验证定时任务运行后 publishedAt 时间戳被正确设置。
- 处理失败场景:使用 @RetryableTopic(attempts = "3") 配合 @KafkaListener 实现重试,配置死信队列,编写幂等的事件处理器;验证重试耗尽后消息进入死信主题。
- 添加可观测性:启用 Spring Cloud Sleuth 进行分布式追踪,监控事件处理指标与延迟。
- 遵循最佳实践:事件命名用过去时(如 ProductCreated),字段全部 final 保持不可变,包含 correlation ID,使用 AFTER_COMMIT 阶段,实现幂等处理器,添加指数退避重试,实现死信队列,记录所有失败及足够上下文,使处理器与顺序无关,高吞吐时批量处理,监控事件延迟并设置告警。
适用边界 · 注意事项
- 事件负载过大时(内存压力和序列化问题)
- 在主事务线程的事件监听器中执行阻塞操作时
- 分布式系统中假设事件有序或消息不重复时