一直听说avro不同于thrift,在hadoop,hbase广泛使用,逐渐替代了原来thrift的使用,就很好奇它有什么好处.
今天抽时间玩了一下,和大家分享下.
目前版本是1.7.6,其schema使用JSON,在RPC中客户端与服务器端在handshake时交换schema信息,而其rpc可以是http方式,也可以是netty2方式.
与thrift,protocol buffer区别在几方面:
1.Dynamic typing: 不必需生成代码(生成代码只是优化选项)
2.Untagged data: 因为schema已经有了,所以数据中只需较少类型信息.
3.No mannually-assigned field ids:因为schema是按field name描述的,不是按field id描述
logo挺有意思的,
这么看的确比thrift和proto buffer更好用哈.
查看github上的avro rpc quickstart项目,可以看到使用比较简单,avro rpc的描述文件是这样的:
{"namespace": "example.proto",
"protocol": "Mail",
"types": [
{"name": "Message", "type": "record",
"fields": [
{"name": "to", "type": "string"},
{"name": "from", "type": "string"},
{"name": "body", "type": "string"}
]
}
],
"messages": {
"send": {
"request": [{"name": "message", "type": "Message"}],
"response": "string"
}
}
}
这里java的例子用的是生成代码的方式,需要使用maven的avro-maven-plugin插件.在Main.java中同时启动了server和client,可以看出rpc使用的是netty2.
python的例子使用的是http方式进行rpc,并且不生成代码,直接parse mail.avro文件.
参考:
http://avro.apache.org/docs/current/
https://github.com/phunt/avro-rpc-quickstart