𝗣𝗿𝗼𝘁𝗼𝗯𝘂𝗳 کے ساتھ مختصر ویڈیو میٹا ڈیٹا
ہمارا ingest worker ہر دو گھنٹے بعد ہزاروں ٹرینڈنگ ویڈیوز حاصل کرتا ہے۔ ہم یہ ڈیٹا تین سروسز کو بھیجتے ہیں: ایک ranking service، ایک cache warmer، اور ایک analytics job۔
ایک طویل عرصے تک، ہم اس ڈیٹا کو منتقل کرنے کے لیے JSON کا استعمال کرتے رہے۔ یہ تب تک ٹھیک کام کرتا رہا جب تک کہ یہ ناکام نہیں ہو گیا۔
JSON میں ایک ویڈیو کا ریکارڈ 2.4 KB کا تھا۔ 40,000 ریکارڈز کو تین مختلف سروسز تک پہنچانے کا مطلب ہر دو گھنٹے میں 280 MB کا غیر ضروری ٹیکسٹ منتقل کرنا تھا۔ اس سے بینڈوتھ (bandwidth) ضائع ہوتی تھی اور ہمارے PHP workers کی رفتار سست ہو جاتی تھی۔
ہم نے Protocol Buffers (Protobuf) پر منتقل ہونے کا فیصلہ کیا۔ یہاں بتایا گیا ہے کہ ایسا کیوں کیا گیا اور اس نے ہمارے سسٹم کو کیسے بدلا۔
JSON کے ساتھ تین اہم مسائل:
- سائز (Size): JSON ہر ریکارڈ میں فیلڈ کے ناموں کو دہراتا ہے۔ "viral_score_24h" جیسا فیلڈ نام محض 8-بائٹ کے نمبر کو لے جانے کے لیے 15 بائٹس استعمال کرتا ہے۔
- پارسنگ کی لاگت (Parse Cost): PHP کو پورے JSON بلاگ (blob) کو پارس کرنا پڑتا ہے، چاہے کسی سروس کو صرف دو فیلڈز کی ضرورت ہو۔
- اسکیمہ ڈرفٹ (Schema Drift): JSON میں کوئی معاہدہ (contract) نہیں ہوتا۔ اگر ایک سروس کسی فیلڈ کو تبدیل کرتی ہے، تو دوسری سروسز runtime پر خاموشی سے خراب ہو جاتی ہیں۔
Protobuf نے اسے کیسے حل کیا:
Protobuf ناموں کے بجائے فیلڈ نمبرز کا استعمال کرتا ہے۔ یہ ایک .proto فائل کو 'سنگل سورس آف ٹروتھ' (single source of truth) کے طور پر استعمال کرتا ہے۔ یہ فائل PHP، Python، اور Go کے لیے کوڈ جنریٹ کرتی ہے۔ اگر آپ اسکیمہ تبدیل کرتے ہیں، تو کوڈ کمپائل نہیں ہو پاتا۔ اس طرح runtime کے بگ (bugs) compile-time کی غلطیوں میں بدل جاتے ہیں۔
نتائج:
ہم نے ایک ہفتے کے دوران ان تبدیلیوں کا جائزہ لیا:
- پے لوڈ سائز (Payload size): 2.4 KB سے کم ہو کر 720 bytes رہ گیا (70% کمی)۔
- PHP Encode کا وقت: 310 ms سے کم ہو کر 95 ms رہ گیا۔
- Go Decode کا وقت: 140 ms سے کم ہو کر 38 ms رہ گیا۔
- بینڈوتھ (Bandwidth): ہر سائیکل میں 280 MB سے کم ہو کر 84 MB رہ گئی۔
Protobuf کب استعمال کریں:
اسے ہر چیز کے لیے استعمال نہ کریں۔ اگر آپ کے پے لوڈز چھوٹے ہیں یا آپ چاہتے ہیں کہ انسان انہیں آسانی سے پڑھ سکیں، تو JSON ہی استعمال کریں۔ Protobuf کو زیادہ حجم والے انٹرنل ٹریفک (internal traffic) کے لیے استعمال کریں جہاں رفتار اور سخت معاہدے (strict contracts) سب سے زیادہ اہمیت رکھتے ہوں۔
ہماری عوامی APIs اب بھی JSON استعمال کرتی ہیں۔ ہماری اندرونی سروسز Protobuf استعمال کرتی ہیں۔