Artikel ini mencantumkan fitur dari dua format serialisasi populer yang harus dipertimbangkan seorang arsitek ketika memilih salah satunya.
Ukuran dan kecepatan
Di internet Anda dapat menemukan tes komparatif format serialisasi. Anda tidak boleh mementingkan nomor tertentu, karena kecepatan serialisasi / deserialisasi, serta ukuran data biner yang dihasilkan, bergantung pada skema data tertentu dan implementasi serializer. Kami hanya mencatat bahwa avro dan protobuff menempati posisi terdepan dalam pengujian tersebut.
Keuntungan dari Euro adalah bahwa bidang rekaman disimpan satu demi satu, tanpa pemisah. Tetapi ketika berurusan dengan auro , Anda perlu menyimpan skema data yang direkam di suatu tempat. Ini dapat dilampirkan ke data serial, atau dapat disimpan secara terpisah (kemudian pengidentifikasi skema ditambahkan ke data di penyimpanan eksternal).
Trik protobuff adalah bahwa ketika membuat serial bilangan bulat, secara default, format panjang variabel ( varint ) digunakan, yang membutuhkan lebih sedikit ruang untuk bilangan positif kecil. Protobuff menambahkan nomor dan jenis bidang ke aliran biner, yang meningkatkan ukuran total. Selain itu, jika pesan tersebut menyertakan kolom jenis record ( pesan bertingkat dalam terminologi protobuff ), Anda harus menghitung ukuran record total terlebih dahulu, yang memperumit algoritme serialisasi dan membutuhkan waktu tambahan.
UPD: Avro juga menggunakan format panjang variabel untuk menulis bilangan bulat, dengan nilai positif dan negatif bergantian ( pengkodean zigzag ). Int Avro cocok dengan sint32 Protobuff, sedangkan panjang cocok dengan sint64.
Secara keseluruhan, Anda dapat mengatakan bahwa Anda akan puas dengan ukuran dan kecepatan kedua format tersebut. Dalam kebanyakan kasus, ini bukanlah faktor yang akan menentukan pilihan Anda.
UPD: Sistem yang sangat dimuat atau pemrosesan data waktu-nyata mungkin terjadi ketika Anda perlu melihat codec yang lebih khusus ( utas diskusi ).
Tipe data
, : 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 )