已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】
我们订单履约链路用 Kafka 3.5(3 节点)传事件,topic order-fulfill 16 分区,消息体是裸 JSON(没有 Avro/Schema Registry),生产端是 3 个微服务版本不一致地灰度发布,消费端 8 实例。最近一次迭代在消息体里新增了字段 refundAmount 和 couponId,同时删掉了旧字段 legacyFlag。
【现象 / 卡点】
refundAmount 的新消息时,反序列化直接忽略未知字段,没问题;但生产端旧版本还在发不带这两个字段的消息,消费端新版本取 refundAmount 拿到 null,下游 NPE 兜底逻辑没写全,灰度期出现 3 次空指针告警;legacyFlag:老生产端还在发这个字段,新消费端已经不再读它,但审计日志里有一段代码 if (msg.get("legacyFlag") != null) 直接取 Map,删字段后这段代码取到 null,触发了一段「兜底回写」的脏逻辑,写脏了 200 多条记录;refundAmount 到底单位是「分」还是「元」,两个团队理解不一致,已经对不上账一次(差 100 倍)。【已尝试的排查】
v,但不知道新旧消息混跑期怎么判定该走哪套解析逻辑。【期望得到的答案形态】 希望有踩过「JSON 裸传、无 schema 管理、生产消费版本不一致」坑的同学给工程可落地的方案,最好带具体规则:
refundAmountCents),避免靠口头约定;v 版本号或 schemaVersion?加了之后新旧混跑期消费端如何路由到对应解析逻辑,会不会反而更乱?我接受渐进式改造,不追求一步到位上 Avro,重点是灰度混跑期不 NPE、不写脏数据、单位不跑偏。