这个文档时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))
参考: