用途
该技能用于在 Spring Boot 3 中实现 Kafka、RabbitMQ、Pulsar 或 JMS 的生产者与消费者时,提供事件驱动消息的设计与实现指导。其核心立场是:除非完整系统能够证明更强的投递语义,否则应按至少一次(at-least-once)投递进行设计。
主要能力
事件契约
- 使用不可变的事件信封,包含 eventId、eventType、occurredAt、schemaVersion 和 payload。
- 将已发布的 schema 视为 API:以兼容方式新增字段,绝不静默改变字段含义。
- 将 correlation 与 causation ID 放入消息头或信封中。
- 不要发布 JPA 实体或框架特定的序列化结构。
生产者规则
- 仅在原始状态变更持久化之后再发布事件。
- 当数据库状态与消息代理发布必须保持一致时,使用事务性发件箱(transactional outbox)。
- 当需要按聚合保证顺序时,使用确定性的分区键。
- 显式配置投递超时与确认机制。
消费者规则
- 通过持久化的已处理事件记录或天然幂等的写入,使处理器具备幂等性。
- 将事务边界围绕状态变更与幂等标记。
- 在配置重试之前,先区分瞬时失败与永久失败。
- 使用退避策略限制重试次数,之后将毒消息路由到死信目的地。
- 保留原始事件、失败原因与尝试次数,以便重放。
测试
- 测试序列化兼容性与处理器幂等性。
- 使用 Testcontainers 进行消息代理集成测试。
- 测试重复、乱序、延迟和毒消息场景。
使用方式
该技能以规则与检查清单的形式给出设计约束,并附带示例文件:examples/good-consumer.java 与 examples/bad-consumer.java,用于对照正确与错误的消费者实现。具体安装命令与调用方式暂未提供。
适用场景
适用于在 Spring Boot 3 项目中集成 Kafka、RabbitMQ、Pulsar 或 JMS,需要设计事件契约、生产者发布逻辑、消费者幂等与重试策略、死信处理以及相关测试的开发者。
限制与注意事项
技能中列出的常见陷阱包括:
- 因消息代理支持事务就假设端到端恰好一次投递——端到端的副作用仍需幂等性。
- 对校验失败进行无限重试——应尽快将永久失败送入死信。
- 在数据库事务内直接发布事件而不使用发件箱——崩溃可能导致状态与事件投递不一致。
- 使用随机分区键——会丢失单个聚合的顺序。
- 直接反序列化为 JPA 实体——应使用带版本的事件契约。
关于该技能的具体收费、价格、支持平台、实际效果或完整使用步骤,资料中暂未提供。