وصف الفريق الهندسي في Zalando مؤخرًا تصميم وتنفيذ موازن التحميل من جانب العميل قيد التشغيل لواجهة برمجة تطبيقات عالية الإنتاجية تتعامل مع حوالي مليون طلب في الثانية. وكانت النتيجة زمن وصول أكثر قابلية للتنبؤ به، وانخفاض في تكاليف البنية التحتية، وتحسين الرؤية حول المكان الذي تنشأ فيه الإخفاقات فعليًا.
تم تصميم واجهة برمجة تطبيقات قراءة المنتج الخاصة بـ Zalando لخدمة ملايين الطلبات في الثانية مع زمن وصول يبلغ رقمًا واحدًا بالمللي ثانية عبر 25 سوقًا لأحد أكبر بائعي التجزئة الأوروبيين للأزياء عبر الإنترنت. تعمل نقطة النهاية المجمعة الخاصة بها على توجيه طلب واحد إلى ما يصل إلى 100 استدعاء متوازي لحجيرات المنتج الفردية، كل منها يعبر Skipper، وهو موازن تحميل حافة المجموعة المشترك. نظرًا لأن المجموعة انتظرت أبطأ 100 قفزة عبر البنية التحتية التي لا يمتلكها الفريق، لم يتمكنوا من فصل ارتفاعات زمن استجابة Skipper عن تلك الخاصة بهم. ولمعالجة ذلك، قاموا بنقل التوجيه لحركة المرور الداخلية عالية التوزيع أثناء العملية، مع الاحتفاظ بـ Skipper لحركة مرور الحافة وحركة GET الفردية. يشرح كونور غالاغر، كبير المهندسين الرئيسيين في زالاندو:
لقد قررنا أنه بالنسبة لحركة المرور الداخلية الواسعة، يجب أن يكون قرار التوجيه موجودًا داخل عملية الاتصال نفسها. يجب أن تظل حركة مرور الحافة، حيث يتفوق Skipper، في مكانها بالضبط. لم نكن نستبدل سكيبر. كنا نخرج المسار الداخلي الموسع إلى موازن التحميل من جانب العميل والذي يتم تشغيله داخل العملية.
توجيه مجموعات المنتجات مباشرة إلى كبسولات المنتج. المصدر: مدونة زالاندو
أعاد الفريق تنفيذ خوارزمية Skipper الدقيقة (xxHash64، 100 عقدة افتراضية لكل نقطة نهاية) بحيث يقوم كلا المسارين بتوجيه مفاتيح متطابقة إلى حاويات متطابقة أثناء الترحيل، مع تجنب انقسامات ذاكرة التخزين المؤقت، مع اختبارات الوحدة التي تثبت هذا السلوك. يكتب غالاغر:
وهذا يعني أن إضافة نقطة نهاية أو إزالتها يعيد تعيين حوالي 1/N فقط من المفاتيح، مما يقلل من تعطل ذاكرة التخزين المؤقت. ولأن كلاً من Skipper ومكتبتنا يستخدمان نفس وظيفة التجزئة ونفس العدد من العقد الافتراضية، فإنهما ينتجان حلقات متطابقة لنفس مجموعة القرون.
تتناول المقالة القرارات الهندسية والتحديات المتعلقة بالتوجيه من جانب العميل، بما في ذلك التجزئة المتسقة، وموازنة التحميل المستندة إلى الإشغال، والقياس المدرك لذاكرة التخزين المؤقت، واستراتيجية الطرح، وتحسينات إمكانية المراقبة، والتجارب مع توجيه منطقة التوافر.
استبدل الفريق استطلاعات تعطل طائرة التحكم بمخبر Kubernetes القائم على المراقبة، وأعاد بناء خط الأنابيب الذي استغرق ساعات من عمليات النشر السريعة والقابلة للعكس، ورفع موازن التحميل من 1% إلى 100% خلف عمليات التبديل، مما أدى إلى تقليص أسطول Skipper من أكثر من 50 حاوية إلى 8 وخفض تكلفة النشر اليومية من 450 دولارًا إلى 110 دولارات. وللتخلص من طفرات زمن الوصول المتزايدة، أضافوا تلاشي الحلقة N لأكثر من 30 ثانية على منحنى ^2.5 بحيث تقوم الكبسولات الجديدة بتدفئة المنتجات التي ستخدمها فعليًا فقط. كتب Werner Vogels، المدير التنفيذي للتكنولوجيا في أمازون:
أنا لست من أشد المعجبين بالقيام بهذا من جانب العميل، لعدة أسباب، ولكن هذه هندسة مثيرة للإعجاب من قبل فريق زالاندو. أنا أحب “الدروس المستفادة” التي يختتمون بها.
يعلق أليكسي كوزنتسوف، المهندس الرئيسي في AWS:
كانت موازنة التحميل من جانب العميل بمثابة اكتشاف بالنسبة لي عندما انتقلت من Amazon إلى Google. (…) أعتقد أن هذا التفكير يحتاج إلى مزيد من البروز.
في حين أن محاولة Zalando للتوجيه المدرك لمناطق AZ كانت تهدف إلى خفض التكاليف بين مناطق AZ، فقد أدت إلى تجزئة ذاكرات التخزين المؤقت وتسببت في انفجارات قراءة DynamoDB. باستخدام النهج الجديد، قاموا بتقوية المسار من خلال إعادة محاولة واحدة متوترة، وتخلص من التحميل الزائد FIFO، والتسجيل الأكثر ثراءً الذي كشف عن تجميد قصير على مستوى العقدة، والآن يتحرك الموازن من تلقاء نفسه.
ومن خلال تسليط الضوء على أن Zalando قامت ببناء موازن التحميل الخاص بها من جانب العميل فقط لأنها كانت في حالة حافة متطرفة حقيقية، استنتج Gallagher:
هل يجب أن تبني بنفسك؟ بالنسبة للجميع تقريبا، الجواب هو لا. يمنحك الوكيل الناضج مثل Skipper أو Envoy توجيهًا متسقًا للتجزئة خارج الصندوق، ويحتفظ به شخص آخر ويعززه آلاف المستخدمين الآخرين.
في Hacker News، يشكك المستخدم في اختيار تطوير وحدة LB مستقلة:
الأساليب الموصوفة في المقالة ذكية والنتائج مثيرة للإعجاب، لذا مجد للفريق! ومع ذلك، أثناء القراءة، كان من الغريب أنهم تعاملوا مع Skipper باعتبارها تابعة لجهة خارجية، على الرغم من أنه تم تطويره وتشغيله بواسطة زملائهم. أعني أنه كان من الممكن أن يحاولوا المساهمة ببعض التحديثات والتحسينات في Skipper، وربما إعادة استخدام آلية اكتشاف Skipper.
على الرغم من أن Skipper مفتوح المصدر ومتوفر على GitHub، إلا أنه لم يتم نشر موازن التحميل الجديد من جانب العميل ويظل داخليًا في Zalando.
