给信封做版本,而不是给 topic
事件信封携带安全消费负载所需的元数据:唯一 id、类型、模式版本和时间戳。topic 可以保持稳定,而负载持续演进。消费者按 version 分支,并用 upcaster 生成当前内部形状。
{
"id": "evt-42",
"type": "OrderCreated",
"version": 2,
"occurredAt": "2026-10-20T10:00:00Z",
"payload": { "orderId": "o-1", "total": 4200, "currency": "USD" }
}
兼容性是部署顺序
新消费者应在生产者发出新版本前理解旧版本;新生产者不应发出旧消费者无法安全忽略的版本。增量可选字段最简单;必填字段、重命名和类型变更需要过渡期或新事件类型。
测试历史事件
保留真实旧负载语料,通过当前消费者重放。断言业务结果,而不只是反序列化。重放测试能发现用构造负载的单元测试漏掉的 upcaster 错误。
验证版本升级
预期结果:v1 和 v2 事件都能被当前消费者处理,业务结果一致,未知可选字段被忽略。用真实历史语料重放并检查输出;发布新版本前先部署能处理它的消费者。