この記事では、アーキテクトがどちらかを選択するときに考慮する必要がある2つの一般的なシリアル化形式の機能をリストします。
サイズと速度
ネット上では、シリアル化フォーマットの比較テストを見つけることができます。シリアル化/逆シリアル化の速度、および結果のバイナリデータのサイズは、特定のデータスキームとシリアライザーの実装に依存するため、特定の番号を重要視しないでください。このようなテストでは、avroとprotobuffが主導的な位置を占めることに注意してください。
Euroの利点は、レコードフィールドが区切り文字なしで次々に保存されることです。ただし、avroを扱う場合は、記録されたデータのスキーマをどこかに保存する必要があります。シリアル化されたデータに添付することも、個別に保存することもできます(その後、スキーマ識別子が外部ストレージのデータに追加されます)。
トリックprotobuffは整数をシリアライズする際、デフォルトでは、可変長形式(つまりvarintが)小さい正の数にはあまりスペースを占めている、使用されています。Protobuffは、フィールド番号とタイプをバイナリストリームに追加します。これにより、合計サイズが増加します。また、メッセージにレコードタイプのフィールド(プロトバフ用語ではネストされたメッセージ)が含まれている場合は、最初に最終的なレコードサイズを計算する必要があります。これにより、シリアル化アルゴリズムが複雑になり、追加の時間がかかります。
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 )