内部模块的交互都是使用protobuf,所有有部分数据是存protobuf的bytes到couchbase里面,但是某天发现从coucbase里面取protobuf的binary数据后客户端解析失败:
|
|
使用的couchbase java sdk版本是2.2.6 对应代码如下
|
|
查看couchbase解析response的源代码后发现flags是memcache协议中的一个字段
关于flags
|
|
|
|
文档中没详细解释flags是什么用的,但是根据上面校验代码看,应该是是一个存储类型的校验字段。
所以只能继续看源码,查看源码后发现flags的值在add set replace的时候客户端就已经生成了,但是出错的那些数据都是没有flags字段的,由于这部分数据都是c sdk负责写的,所以怀疑是c sdk写数据的时候没有生成这个flags
c sdk写数据的抓包结果
所以这个问题是各个sdk行为不一致引起的,所以解决方法就是删掉那段校验的代码,重新打包就可以了
备注:关于部分sdk的行为
c sdk的请求flags为0,也就是没有设置,get response也不校验flags的请求,所以无报错
python sdk add请求有设置flags的,get response不校验flags,所以也无报错
java sdk add 请求有设置flags, get response强校验flags,所以解析失败