المقدمة

اختيار الـ Format المناسب للـ Data Serialization أصبح موضوع حيوي حاليًا خصوصًا في التعامل مع الأنظمة اللي بتتميز بكونها Large-Scale واللي الأداء فيها حيوي ومهم جدًا. ومن أشهر الـ Formats اللي فضلت موجودة على مر السنين هو الـ JSON وهو اختصار لـ JavaScript Object Notation.

ولكن بسبب احتياج الـ Large-Scale Systems للأداء العالي والـ Bandwidth القليلية ظهر Format تاني ألا وهو الـ ProtoBuf.

طب ايه هو الـ ProtoBuf وايه سبب ظهوره ؟ وايه اللي بيميزه عن الـ JSON وليه بنختاره في الـ Large-Scale Systems ، ده اللي هنعرفه انهاردة فورقة وقلم وتعالوا نتكلم عن الـ ProtoBuf vs JSON 🚀


Protocol Buffer (ProtoBuf)

الـ Protocol Buffer أو الـ ProtoBuf هو طريقة طورتها Google عشان تعمل بيها Serialization للـ Structured Data. بالإضافة لإنه مش معتمد على لغة برمجة بعينها أو Platform بعينه.

وممكن يتم الاعتماد عليه في الـ Communication بين الـ Services وبعضها أو في أي موقف احتجنا فيه إننا نخزن بيانات أو نتبادل بيانات تكون Structured.

بالإضافة لإنه كمان نظام مفتوح المصدر (open-source).


JSON vs. ProtoBuf

الـ JSON معروف عند كتير من المطورين، وبيستخدموه في كتير من التطبيقات عشان ينقلوا البيانات ما بين الـ Client والـ Server. لكن فيه فروق مهمة بينه وبين الـ ProtoBuf واللي في الأساس أدت لظهوره:

  1. الحجم: الـ ProtoBuf بيـ Serialize البيانات بطريقة مدمجة أكتر من الـ JSON، وده معناه إن البيانات اللي معملوها Serialization بالـ ProtoBuf بتاخد مساحة أقل، وده بيفرق جداً لو بتتعامل مع بيانات كبيرة أو بتبعتها على الشبكة فبالتالي بيكون عندك Bandwidth أقل على عكس الـ JSON.
  2. الأداء: الـ ProtoBuf أسرع في قراءة وكتابة البيانات مقارنة بـ JSON. وده لإنه بيخزن البيانات على هيئة Binary مش نصوص Texts زي JSON، وده بيخلي العمليات أسرع بكتير وعشان كده ناس كتير بتفضل الـ JSON عشان الـ Human Readable لإنه Text ممكن يبقى أسهل كتير في الـ Debugging والشغل معاه.
  3. قابلية التوسع أو ما يعرف بالـ Extensibility: الـ ProtoBuf بيتيح ليك تضيف أو تعدل في البيانات اللي بتعملها Serialize بدون ما تتسبب في مشاكل للنسخ القديمة. يعني بيحقق الـ Backward Compatibility على عكس JSON مفيهوش نفس المرونة دي، وأي تغيير ممكن يعمل مشاكل في التعامل مع البيانات القديمة. وبيظهر هنا قوة الـ ProtoBuf من خلال الـ Optional والـ Required اللي من خلالهم تقدر تتحكم في الـ Fields.
  4. سهولة القراءة Human-Readability: الـ JSON بيتميز إنه مقروء للإنسان بشكل مباشر، يعني تقدر تشوف البيانات وتفهمها بسهولة. على العكس، الـ ProtoBuf بيخزن البيانات في هيئة Binary مش مفهومة للبشر، وده ممكن يكون عيب لو بتحتاج تقرأ البيانات بشكل مباشر. ولكن بالطبع فيه Tools بتمكنك انك تـ Parse الـ Binary دي وتقرأهم ولكن الموضوع مش مباشر زي الـ JSON.

How ProtoBuf Works

Protocol Buffer (ProtoBuf)
Protocol Buffer (ProtoBuf)

أول حاجة، بنبدأ إننا نكتب ملف .proto وده ملف بنحدد فيه شكل البيانات اللي عاوزينها. الملف ده هو اللي هيكون المرجع واللي منه هنـ Create الـ Classes اللي هتستخدمها في الكود بتاعنا.

مثال بسيط لملف .proto:

protoCopy codesyntax = "proto3";

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

الملف ده بيقول ان عندي رسالة اسمها Person فيها 3 Fields وهم: name و id و email. لما نيجي نعمل Serialization للبيانات دي بالـ ProtoBuf، هيتم تحويل الرسالة دي لشيء بسيط جدًا سواءًا في التخزين في قاعدة بيانات أو من خلال اننا نبعتها بين الـ Services وبعضهم. وده لإننا زي ماعرفنا أن الـ ProtoBuf بيكون Binary.


ProtoBuf Serialization

لما بنكتب ملف .proto، الخطوة اللي بعد كده هي إننا نعمل Generate للكود اللي هيستخدمه البرنامج بتاعنا. الـ ProtoBuf بيوفر أدوات بتساعدنا اننا نعمل Generate للكود ده بشكل أوتوماتيكي للغات برمجة متعددة زي C++, Java, Python، Go وغيرهم.

العملية دي بتمشي كالتالي:

  1. كتابة الـ .proto file: زي ما وضحنا، بنكتب فيه شكل البيانات اللي عاوزين نعملها Serialize.
  2. بنـ Generate الكود: من خلال اننا بنستعمل الـ ProtoBuf Compiler (اللي اسمه protoc) عشان نـ Generate الكود اللي هيعمل الـ Serialization والـ Deserialization للبيانات.
  3. استخدام الكود: بتستخدم الكود اللي حصله Generate عشان نـ Serialize البيانات ونحولها لـ Binary لما نيجي نخزنها أو نبعتها، ولما نيجي نستقبلها أو نقراها، بنعمل Deserialize ونرجع البيانات لشكلها الطبيعي.

عيوب الـ ProtoBuf

زي أي تكنولوجيا بتظهر، الـ ProtoBuf ليه بعض العيوب:

  • التعقيد في البداية: ممكن يكون معقد شوية للي بيبدأ يتعامل معاه لأول مرة، خصوصًا مع كتابة ملفات الـ .proto.
  • الاعتماد على الـ Generated Code: بعد ما نكتب ملف .proto، بنحتاج نعمل generate للكود اللي هنستخدمه في البرنامج بتاعنا، وده ممكن يخلي عملية التطوير أطول شوية.

في الختام

الـ ProtoBuf ممكن يكون خيار ممتاز لو بندور على حل فعال ومتكامل لعملية الـ Data Serialization في الأنظمة الموزعة أو التطبيقات اللي بتحتاج لأداء عالي. صحيح إنه ممكن يكون فيه شوية تعقيد في البداية، لكن المزايا اللي بيديهالنا بتغطي على العيوب دي.

كمان، زي ما شوفنا في المقارنة بينه وبين JSON، هنلاقي إنه بيوفرلنا أداء وحجم تخزين أفضل، وإن كان بيجي على حساب سهولة القراءة.