我们一直使用 google protocol buffer 协议做客户端服务器通讯,为此,我还编写了 pbc 库

经过近三年的使用,我发现其实我们用不着那么复杂的协议,里面很多东西都可以简化。而另一方面,我们总需要再其上再封装一层 RPC 协议。当我们做这层 RPC 协议封装的时候,这个封装层的复杂度足以比全新设计一套更合乎我们使用的全部协议更复杂了。

由于我们几乎一直在 lua 下使用它,所以可以按需定制,但也不局限于 lua 使用。这两天,我便构思了下面的东西:

我们只需要提供 boolean integer (32bit signed int) string id (64bit unsigned int) 四种基础类型,和 array 以及 struct 两种用户定义的复合类型即可。

  • 为什么没有 float ? 因为在我们这几年的项目中,使用 float 的地方少之又少,即使有,也完全可以用 string 传输。
  • 为什么没有 enum ? 因为在业务层完全可以自己做 int 到 enum 的互转,没必要把复杂度放在通讯协议中。
  • 为什么不需要 union ? 因为按 protocol buffer 的做法,结构中的每个域都可以用一个数字 tag 来标识,而不是用数据布局来指示。不需要传递的域不需要打包到传输包中。
  • 为什么不需要 default value ? 我们的项目中,依赖 default value 的地方少之又少,反而从我维护 pbc 的大量反馈看,最容易被误用的用法就是通讯协议依赖一个字段有没有最终被打包。所以干脆让(不打包)等价于 default value 就好了。明确这个(在 google protocol buffer 中是错误的)用法。

>> 阅读全文

2 收藏


直接登录

推荐关注