切流当天消费端报 Invalid magic byte,重启后仍然失败,积压了 6000 条。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
kafka-console-consumer.sh --bootstrap-server 10.0.1.7:9092 \ --topic jobs --from-beginning --max-messages 5 | head -c 200
旧消息是 JSON 文本直接写进 RabbitMQ,Kafka 的消费者按 Avro 格式解析,开头几个字节对不上就抛异常。迁移时只换了 broker,没有统一序列化格式。这一点先确认清楚,后面就不用反复试。
「队列迁移消息格式」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
具体做法是,先在消费端做格式探测 按首字节判断是 JSON 还是二进制;迁移期双消费 旧队列和新 topic 各跑一份 结果比对;确认没有旧消息后再关掉旧通道;积压的 6000 条按原始格式回放一遍。
改完照着核一遍,旧消息回放后消费成功率为 100% 消费端日志里不再出现 magic byte 相关异常。
