订单调整字段从只传正数放开到允许负数后,同样的请求体从 80 字节涨到 300 字节。抓包看每个负数都占了 10 个字节,正数只占 1 个。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,int32 的负数按 64 位补码做 varint,高位全是 1,要十个字节才能表示。sint32 用的是 zigzag,-1 只占一个字节。

「Protobuf int32 负数编码」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

message Order {
  sint32 adjust = 7;  // -1 编码为 1 个字节
}

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,确认字段会出现负数 有负数就换成 sint32 或 sint64;换类型前先确认编号不变 只改类型会影响老数据解析;改完对比同一条报文的字节数;对历史数据做一次全量重写 避免新旧混存。

最后用这个标准收尾,同一条带 -1 的报文从 10 字节降到 1 字节 整体包体回到 80 字节左右。

作者 9823189