本文列出了两种流行的序列化格式的功能,架构师在选择其中一种时应考虑。
大小和速度
在网上可以找到序列化格式的比较测试。您不应该重视特定的数字,因为序列化/反序列化的速度以及生成的二进制数据的大小取决于特定的数据方案和序列化程序的实现。我们只注意,Avro公司和protobuff占据此类测试中处于领先地位。
Euro的优点是记录字段是一个接一个地存储的,没有分隔符。但是在处理auro时,您需要将记录的数据的模式存储在某个地方。它可以附加到序列化的数据上,也可以单独存储(然后将模式标识符添加到外部存储中的数据中)。
所述的特技protobuff是序列化整数时,默认情况下,可变长度格式(varint)被使用,其占用了为小的正数较少的空间。Protobuff将字段号和类型添加到二进制流中,从而增加了总大小。另外,如果消息包含记录类型的字段(prob的术语中为嵌套消息),则首先需要计算最终记录大小,这会使序列化算法复杂化并花费更多时间。
UPD:Avro还使用可变长度格式来写入整数,具有正负交替的值(之字形编码)。Avro的int匹配 Protobuff的sint32,而long则匹配sint64。
总体而言,您可以说您会对这两种格式的大小和速度都感到满意。在大多数情况下,这不是决定您选择的因素。
UPD:值得关注更专业的编解码器(讨论线程)时,可能是高负载的系统或实时数据处理。
资料类型
, : bool, string, int32(int), int64(long), float, double, byte[]. uint32, uint64.
, -, varint, . , : sint32, sint64, fixed32, fixed64, sfixed32, sixed64.
(map). ( ).
(enumerations).
(records , message ) (union , oneof ).
, (nullable) , , union , null, - oneof .
UPD: nullable message . optional, , oneof. stackoverflow.
(logical types well known types ). (timestamp) (duration).
, decimal UUID. fixed - .
, decimal - , , .
(backward compatibility) -. , , , (0, , false). (aliases) (record, enum, fixed). , .
, ( int long, float double, ). , C++. bool , enum .
, , , , . (forward compatibility).
.
enum, -, , - .
(case) (union) unknown. , , .
. (ADT), , , , .
Json
, , Json. , , (, MongoDB).
, , ( , , json_name ). (aliases) .
, ( bytes, fixed) UTF16 . (, .), Json , UTF16. base64.
Json , , , , , UTF16.
, , . , (, ), (, Schema Registry). , (statefullness), “” .
(, python), , , . , , , “ ”, . , Any, , , .
RPC
.
(one-way). (handshake), .
, (streaming) .
RPC - gRPC. , gRPC, -, , , . , , , , , , gRPC , , , , .
, , RPC, .
Kafka
. .
Hadoop
gRPC. , Hadoop - , elephant-bird .
.
https://github.com/apache/avro (1.7K , 1.1 )
https://github.com/protocolbuffers/protobuf (45K , 12.1 )