Protobuf対Avro。選択する方法は?

この記事では、アーキテクトがどちらかを選択するときに考慮する必要がある2つの一般的なシリアル化形式の機能をリストします。

サイズと速度

ネット上では、シリアル化フォーマットの比較テストを見つけることができます。シリアル化/逆シリアル化の速度、および結果のバイナリデータのサイズは、特定のデータスキームとシリアライザーの実装に依存するため、特定の番号を重要視しないでください。このようなテストでは、avroprotobuffが主導的な位置を占めることに注意してください

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 )




All Articles