模式就是契约
事件会被投影、服务和分析消费。如果生产者把 customer_id 改成 customerId,所有读取旧字段的消费者都会坏掉。注册表保存每个模式版本,并拒绝违反所选兼容模式的变更。
{
"subject": "orders-value",
"version": 3,
"schema": "{\"type\":\"record\",\"name\":\"Order\",\"fields\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"total\",\"type\":\"long\"}]}",
"compatibility": "BACKWARD"
}
具体负载取决于注册表和序列化格式。核心思想是使用有版本、可寻址的模式,而不是藏在每个生产者内部的隐式结构。
兼容模式
向后兼容意味着新消费者能读旧数据;向前兼容意味着旧消费者能读新数据;完全兼容要求两者。增量可选字段通常向后兼容;删除必填字段或改变类型则不行。按 subject 和部署时序选择模式,并用真实消费者测试生产者升级。
让 subject 有意义
一个 subject 应代表一种事件类型或一个 topic 的 value 模式。把无关事件混进同一 subject 会让兼容检查失去意义,并迫使消费者按结构分支。只有真正的新契约才需要新事件名;否则应在注册表规则下演进模式。
何时使用
当多个生产者和消费者独立演进,而事件破坏会导致静默数据丢失或停机时,使用注册表。优点是可强制、可发现的契约;代价是多一个服务、序列化开销和兼容评审纪律。与带模式示例的 wiki 页面相比,注册表在发布路径中执行契约。