我们不能失去信仰

我们在这个世界上不停地奔跑...

0%

Python解析Protobuf

测试之 Protobuf

目前一般的web服务测试中,是使用 Json 对服务器进行请求,服务器也是通过 json 进行返回,Json 很容易读懂,这就对测试带来了极大的方便, 但是 Json 是纯字符,如果数据量较大,加上网络的延迟,就会使请求变得慢。 大家都知道,计算机 IO 的速度是很慢的,而 CPU 的速度是巨快的,就是因为要缩小 IO 和 CPU 之间的速度不协调问题,有了内存、一级缓存、二级缓存、三级缓存等等。

网络延迟我们无法控制,但是缩小传输数据的体积我们是可以做的,既然 CPU 快,那么我们就让它多干点活。

Protobuf 是Google旗下的一种数据传输格式,类似于 Json,但不同于json之处在于,它使用的是二进制进行传输,因为数据结构不一样,所以它的体积一般是比 Json 小的。在某些对延迟要求较高的系统上比较常用,如实时竞价系统。但是它的缺点就是人类无法看懂,需要进行解析成 Json 才可以方便我们查阅。

Protobuf 之 Python 解析

每次对接新的 adx 时,如果对方使用了 protobuf 来包装数据,即使我们手中拿到了原始的 json 数据,也不太容易在本地调试进行测试,因为我们的 rtb 服务器接收的是包装后的数据,所以我们需要手动将 json 转换为 protobuf 在进行发送。

我本身从事程序化广告这部分业务,我们这里有使用 Json 的,也有使用 Protobuf 进行传输的,这个系统较为复杂,每次测试的时候,要么自己在本地伪造投放数据,要么直接在测试服测试,而我本人倾向于直接在测试服测试,因为这样就不需要弄一些投放信息,就不需要牵扯 DMP 那块的业务,因为测试服上面都有。

每当使用 Json 测试的时候,很方便,基本一个 curl 或者 postman 就解决了,然后进行调试。但是遇到 Protobuf 数据,而我现在也没有发现有什么好的工具来进行转换,所以就自己写了一个解析的脚本,然后使用它来在测试的时候,统一化发 Json 进行测试。

其实写脚本并不难,也就是一个轻量的 Flask web 服务,提供一些数据接收的 API 而已。其实我挺喜欢倒腾部署的。

如果直接常规部署,走 Json 的请求,直接发,走 Protobuf 请求我的服务器,由我的服务器转发。这样的话,显然需要区分一下,而我想要的是统一处理。

通过HTTP 的headers 来判断是 Json 还是 Protobuf ,或者自己定义配置文件。

可以在 Docker 里部署,然后进行转发,也可以通过 Nginx 反向代理进行转发,总之哪个方便用哪个。

最近发现了另外一款工具 mitmproxy ,这是一款抓包工具,和 tcpdump 、 charles、fiddler、wirshark 属于同一类的,但是 mitmproxy 强大之处在于,可以自己写代码来修改请求或者响应。

如果,所以最近想 基于这个工具来进行 protobuf 的请求响应转换,因为这个工具,它本身并不是一个 web 服务,所以,在这里就应该通过代理服务器来使用它。

源码稍后奉上。