一、背景
之前和同事定义一个pb数据格式问题,他那边负责生产数据源,然后转pb再存到redis,然后我来消费这个pb,进行解开。这个过程不涉及到数据压缩如snappy。首先我消费线程代码写好了,来和他联调这份数据。但是我这边代码解析失败了。
消费者线程使用的是C 程序,对于c 解析pb格式的数据,无非就是两种api接口ParseFromString()和ParseFromArray。这两个接口对应于json的“{}”和“[]”格式,但是都失败了。
二、redis-cli工具查数据
那么我先使用排查是我消费者线程写的有问题。我使用了redis-cli工具,直接从数据库拿出来写到文件。
代码语言:javascript复制redis-cli -h [域名] -p [端口] get [redis key] > /tmp/1650.pb
然后呢因为这个域名是redis集群的其中一个ip,所以有时候会取不到数据,第一次查询可能会重定向到真实数据的那台机器ip。
三、protobuf工具
然后我就取到了pb数据,然后怎么验证这个pb是否正确呢,我找到了两个工具。
第一个是简单验证是否是protobuf格式的工具。这个工具使用过程我感觉有点漏报,就是该是pb,可能会被误认为非pb格式。
第二个工具是更推荐,他会根据proto定义文件,然后从原始pb转成json,也支持json转成pb。
3.1 第一个是fq工具
他其实是用于识别二进制文件的工具,识别protobuf只是它的一部分功能。
fq读取二进制数据。结果是一个 JSON结构,其中每项都有二进制位范围、符号备注,并以直观的方式呈现。github仓库: https://github.com/wader/fq
检查1650.pb这个文件是不是合法的proto文件,这样用
代码语言:javascript复制fq -d protobuf . 1650.pb
3.2 pb和json互转的简易命令行工具
第二个工具,是我在github找的一个用c 写的,pb和json互转的简易命令行工具
github仓库是这个https://github.com/hq6/ProtobufJson.git
编译完使用命令,就可以类似这样使用。
他这个仓库,我修改了Makefile才能编译成功,一个是加上-pthread,另一个是加上protobuf的头文件include路径和lib路径。