这个文档时2015年左右调研capnproto时的记录,在这里做个备份

capnproto是google protobuf的开发人员离开google后创建的一个新的数据序列化项目,优点就是编码解码速度非常块,cloudflare使用它用来做日志消息的打包,因此我们对它进行了测试。使用没有问题,只是由于capnproto打包的消息要比采用纯文本的方式大2~3倍,而我们的格式比较固定,最终还是采用了纯文本消息的形式,没有用capnproto

总结了下安装部署的说明,其它项目中如果遇到需要高效率的数据序列化、反序列化的操作可以考虑使用。

lua-capnproto的编译和安装

先安装lua5.1, luajit v2.1, luarocks

vagrant@precise64:~$ lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
vagrant@precise64:~$ luajit -v
LuaJIT 2.1.0-alpha -- Copyright (C) 2005-2015 Mike Pall. http://luajit.org/
vagrant@precise64:~$ luarocks --version
/usr/local/bin/luarocks 2.2.2
LuaRocks main command-line interface
vagrant@precise64:~$ luarocks|grep "Lua version"
    Lua version: 5.1

注意lua要用5.1版本,luarocks也要用lua 5.1, 确认后,就可以sudo luarocks install lua-capnproto

编译capnproto,依赖如下:

GCC 4.8
Clang 3.3

ubuntu12.04下需要安装 g++-4.8, gcc-4.8, 然后执行:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 20

然后再按照官方的说明即可编译。

capnproto的使用

cat log.capnp

@0xa35a2c23b006974a;

struct AccessLog {
  requestTime @0 :Text;
  remoteAddr @3 :Text;
  host @4 :Text;
  requestUri @5 :Text;
}

运行 capnp compile -olua log.capnp

在nginx配置中增加: init_by_lua_file log.lua

注意: capnp文件定义里需要是驼峰写法,而调用时,需要用下划线方式。

cat log.lua

local cjson = require "cjson"
local log_capnp = require "log_capnp"

local port = ngx.var.server_port
if port == "1111" then
        return
end
local obj = {}
obj['request_time'] = ngx.var.request_time
obj['remote_addr'] = ngx.var.remote_addr
obj['host'] = ngx.var.host
obj['request_uri'] = ngx.var.request_uri

local bin = log_capnp.AccessLog.serialize(obj)
local decoded = log_capnp.AccessLog.parse(bin)

print("***decoded:"..cjson.encode(decoded))

参考: