بروتوبوف مقابل أفرو. كيف تختار؟

تسرد هذه المقالة ميزات تنسيقين شائعين للتسلسل يجب أن يأخذهما المهندس المعماري في الاعتبار عند اختيار أحدهما.

الحجم والسرعة

يمكنك العثور على الشبكة على اختبارات مقارنة لتنسيقات التسلسل. يجب ألا تعلق أهمية على أرقام محددة ، لأن سرعة التسلسل / إلغاء التسلسل ، وكذلك حجم البيانات الثنائية الناتجة ، تعتمد على مخطط البيانات المعين وعلى تنفيذ المسلسل. نلاحظ فقط أن avro و protobuff يحتلان المراكز الرائدة في مثل هذه الاختبارات.

ميزة اليورو هي حفظ حقول التسجيل واحدة تلو الأخرى ، بدون فواصل. ولكن عند التعامل مع avro ، تحتاج إلى تخزين مخطط البيانات المسجلة في مكان ما. يمكن إرفاقها بالبيانات المتسلسلة ، أو يمكن تخزينها بشكل منفصل (ثم يتم إضافة معرف المخطط إلى البيانات الموجودة في وحدة التخزين الخارجية).

الحيلة في protobuff هي أنه عند تسلسل الأعداد الصحيحة ، بشكل افتراضي ، يتم استخدام تنسيق الطول المتغير ( varint ) ، والذي يشغل مساحة أقل للأرقام الموجبة الصغيرة. يضيف Protobuff رقم الحقل والنوع إلى التدفق الثنائي ، مما يزيد من الحجم الإجمالي. أيضًا ، إذا كانت الرسالة تتضمن حقولًا من نوع السجل ( رسالة متداخلة في مصطلحات بروتوبوف ) ، فأنت بحاجة أولاً إلى حساب حجم السجل النهائي ، مما يعقد خوارزمية التسلسل ويستغرق وقتًا إضافيًا.

UPD: يستخدم Avro أيضًا تنسيقًا متغير الطول لكتابة الأعداد الصحيحة ، مع تبديل القيم الموجبة والسالبة ( تشفير متعرج ). يطابق Avrow's int sint32 الخاص بـ Protobuff والمطابقات الطويلة sint64.

بشكل عام ، يمكنك القول أنك ستكون راضيًا عن حجم وسرعة كلا التنسيقين. في معظم الحالات ، ليس هذا هو العامل الذي سيحدد اختيارك.

محدث: قد يكون النظام عالي التحميل أو معالجة البيانات في الوقت الفعلي هو الحال عندما يستحق الأمر النظر في برامج الترميز الأكثر تخصصًا ( سلسلة المناقشة ).

أنواع البيانات

, : 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