من فضلك تسجيل الدخول أو تسجيل لتفعل ذلك.

TL ؛ د

نعكس إجراءات GitHub التي تم تصميمها من خلال التذاكر الداخلية لتوجيه طلبات ذاكرة التخزين المؤقت بشفافية من خلال ذاكرة التخزين المؤقت الأسرع والملل. وقد أدى ذلك إلى أداء ما يصل إلى 10x أداء ذاكرة التخزين المؤقت لبعض عملائنا ، مع عدم وجود تغييرات في التعليمات البرمجية ولا حاجة للحفاظ على شوكات الإجراءات المنبع.

قبل بدء هذا العمل ، كان لدينا بالفعل بديل أسرع لذاكرة التخزين المؤقت لأعمال GitHub. كان نهجنا مختلفًا: لقد تعثرنا كل من الإجراءات الشهيرة في الطرف الأول الذي يعتمد عليها”https://github.com/actions/cache” الهدف=”_blank”> الإجراءات ذاكرة التخزين المؤقت للإشارة إلى ذاكرة التخزين المؤقت الأسرع والمعدنية. لكن بلدي”https://x.com/gabe_guerra_/status/1930351105101443234″ الهدف=”_blank”> زملاء العمل لم يكونوا راضين مع هذا الحل ، لأنه يتطلب من المستخدمين تغيير سطر واحد من التعليمات البرمجية.

بصرف النظر عن تجربة المستخدم ،”https://github.com/orgs/useblacksmith/repositories?type=all&q=fork%3Atrue+archived%3Afalse” الهدف=”_blank”> الحفاظ على هذه الشوكات تحولت بثبات إلى كابوس بالنسبة لنا. واصلنا ذلك لفترة من الوقت ، لكننا وصلنا في النهاية إلى نقطة انعطاف ، وأصبحت التكلفة التشغيلية مرتفعة للغاية.

لذلك ، شرعت في عكس مهندس الإجراءات GitHub Cache نفسها ، بهدف واحد: اجعله سريعًا. حقا سريع. وهذه المرة ، دون الحاجة إلى الحفاظ على الشوك أو مطالبة المستخدم بتغيير سطر واحد من التعليمات البرمجية. ليس واحد.

استنشاق طلبات ذاكرة التخزين المؤقت github

كانت الخطوة الأولى هي فهم الأعمال الداخلية لذاكرة التخزين المؤقت لأعمال GitHub. لقد أثبتت تجربتنا السابقة أن تصرف إجراءات ذاكرة التخزين المؤقت الحالية مفيدة ، لكن في وقت سابق من هذا العام ، ألقى Github لنا منحنى من خلال إهانة أفعال ذاكرة التخزين المؤقت القديمة لصالح أ”https://github.com/actions/toolkit/discussions/1890″ الهدف=”_blank”> خدمة جديدة تستند إلى TWIRP باستخدام Azure Blob Storage SDK. على الرغم من إعادة التصميم الكامل ، إلا أنه كان فوزًا في أعيننا – نحن نحب protobufs. من السهل السبب في ذلك ، وبمجرد أن نتمكن من عكس الواجهة ، يمكننا أن ندوم بديلاً متوافقًا تمامًا ومتساقًا.

أدخل صديقنا الجديد: كلود. (إنه عام 2025 ، بعد كل شيء.) بعد بضع تكرارات للهندسة المذهلة الإبداعية ، استنشقنا الطلبات التي قدمتها Github إلى طائرة التحكم الخاصة بها وتوصلنا إلى تعريف proto لخدمة الإجراءات. إذا كنت تخترق صناديق سوداء مماثلة ، فإنني أوصي بشدة بالثقة في LLM مع هذا.

ولكن ماذا عن تخزين Azure Blob؟ انتقل نظام Github إلى Azure ، لكن الواجهة الخلفية الخاصة بنا تعمل على قمة استضافتها ذاتيًا”https://min.io/” الهدف=”_blank”> minio Cluster ، وهو تخزين blob متوافق مع S3. في عالم مثالي ، ستكون جميع متاجر Blob قابلة للتبديل ، لكننا لا نعيش في عالم مثالي (على الأقل ، ليس بعد). كان علينا معرفة شكل تلك الطلبات. استغرق الأمر المزيد من الجهد لمعرفة ذلك ، ولكن في النهاية ، أدت جميع الطرق إلى وكلاء الشبكة.

وكيل هنا ، وكيل هناك ، وكيل في كل مكان

يتطلب تحقيق تجربة سلسة حقًا مع تغييرات الكود المطلوبة صفر بعض السحر: كل طلب VM لا يزال يظهر للذهاب إلى الوجهة الأصلية (أي طائرة التحكم في Github وتخزين Azure Blob) ، ولكن تحت الغطاء ، نعيد توجيهها بشكل متسلل داخل مكدس الشبكة.

الآن ، هناك القليل من اللون على السياق: الحدادة هي سحابة CI عالية الأداء ، متعددة المستأجرين لإجراءات github. يعمل أسطولنا على الخوادم العارية المجهزة بوحدة وحدات المعالجة المركزية للألعاب ذات الأداء أحادي النواة ومحركات NVME. في وقت كتابة هذا التقرير ، ندير 500+ مضيفًا عبر العديد من مراكز البيانات على مستوى العالم ، ونصبح الدوران سريعًا”https://github.com/firecracker-microvm/firecracker” الهدف=”_blank”> vms الالعاب النارية لوظيفة CI لكل عميل. تعمل كل وظيفة على تشغيل Ubuntu مع أنظمة ملفات الجذر المقدمة من github.

مع مجموعة السياق ، دعنا نتحدث عن التنفيذ.

بروكسي VM

داخل كل VM ، قمنا بتكوين خادم Nginx خفيف الوزن لطلبات الوكيل مرة أخرى إلى الوكيل على مستوى المضيف. لماذا هذه الطبقة الإضافية؟ الأمر بسيط: نحن بحاجة إلى الحفاظ على الحالة لكل تحميل وتنزيل ، والتحكم في الوصول غير قابل للتفاوض. من خلال التعامل مع الكسل داخل VM ، فإننا نلتقط مكافأة لطيفة: يمكن أن يتم اعتراض حركة Docker داخل حاويات Docker وتوجيهها بشكل نظيف وتوجيه من خلال وكيل Nginx الخاص بنا. لا اختراقات خاصة مطلوبة.

خوادم الوكيل هذه ذكية بشأن ما تتقنوا. يتم إعادة توجيه جميع الطلبات المتعلقة بالتخزين المؤقت إلى الوكيل المضيف الخاص بنا ، في حين أن طلبات طائرة التحكم في GitHub الأخرى-مثل تلك التي لا نتعامل معها ، مثل متجر Github Artifact-انتقل مباشرة إلى وجهاتها المعتادة.

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

قتال Azure SDK

في حين أن Nginx يعتني بتوجيه الطلبات لطائرة التحكم في إجراءات Github ، فإن الحصول على الأشياء للعب بشكل جيد مع Azure SDK دعا إلى بعض الجمباز على مستوى النواة.

كنا عدة دورات في أعماق تنفيذنا عندما ظهرت حقيقة مذهلة: كانت خدمة التخزين المؤقت الجديدة لدينا متخلفًا عن نسختنا القديمة ، خاصةً عندما يتعلق الأمر بالتنزيلات. فضولي ، عدنا إلى الكود المصدري لـ”https://github.com/actions/toolkit” الهدف=”_blank”> مجموعة أدوات Github. ما وجدناه كان يقول: إذا لم يتم التعرف على اسم المضيف كتخزين Azure Blob (على سبيل المثال ، blob.core.windows.net) ، تتخطى مجموعة الأدوات بهدوء العديد من تحسينات التزامن. فجأة ، كان عنق الزجاجة منطقيًا.

لمعالجة هذا ، أجرينا بعض الجراحة الدقيقة. قمنا ببناء عناوين URL التي تشبه Azure ، ثم وحدة فك ترميز ومترجم في وكيل المضيف لدينا لتحويلها إلى نقاط نهاية متوافقة مع S3. عندها فقط سقطت القطع في مكانها ، وأصبح الأداء مرة أخرى غير حاضر.

لقد بدأنا مع إعادة تعيين DNS على مستوى VM لرسم خريطة عنوان URL الذي يشبه Azure إلى مضيف Agent VM الخاص بنا. لكن إعادة توجيه هذه الطلبات المحددة إلى الوكيل على مستوى المضيف لدينا يتطلب خطوة إضافية للوصول إلى هناك. انحنى تنفيذنا الأولي في هذه الطبقة المؤسسة على قواعد IPTABLES لتوجيه حركة المرور المناسبة نحو الوكيل المضيف الخاص بنا. لقد نجحت ، على الأقل حتى لم تفعل. من خلال الاختبار ، سرعان ما وصلنا إلى الحدود: كانت IPTABLES تقوم بالفعل برفع ثقيل للأنظمة الفرعية الأخرى داخل بيئتنا ، ومع كل VM إضافة أو إزالة مجموعة قواعدها الخاصة ، أصبحت الأمور سريعة الفوضى ، وخيمة للغاية.

التي دفعتنا إلى”https://wiki.nftables.org/wiki-nftables/index.php/Main_Page” الهدف=”_blank”> nftables، المعيار الجديد لتصفية الحزم على Linux ، وملاءمة مثالية لحالة الاستخدام لدينا:

  1. جداول القواعد المخصصة: أصبحت قواعد تسوية الأسماء لكل VM بسيطة ، مما يجعل من السهل إضافة أو إزالة هذه القواعد.
  2. تغييرات التكوين الذري: على عكس IPTABLES ، يتيح لنا NFTABLES مبادلة كتل التكوين بأكملها. هذا يتجنب النزاعات مع العديد من القراء والكتاب.

بمجرد أن يكون لدينا كل طلب ذي صلة يتدفق من خلال وكيلنا على مستوى المضيف ، قمنا ببناء SDK الداخلي الخاص بنا للتعامل مع Proxying في اتجاهين بين Azure Blob Storage و AWS S3. الإنتاجية-للتحميل والتنزيلات-هي صفقة كبيرة بالنسبة لنا ، لذلك كان الحفاظ على الوزن الخفيف قدر الإمكان غير قابل للتفاوض. لقد اعتمدنا على بعض بدائل GO المفيدة لتحقيق ذلك: مكتبة IO القياسية تجعل المخازن المؤقتة المتدفقة غير مؤلمة ، مما يتيح لنا اجتياز io.Reader نظيفًا من طلب إلى آخر وتخطي أي تخزين غير ضروري للبيانات. لعميل HTTP ، ذهبنا مع”https://github.com/go-resty/resty” الهدف=”_blank”> RESTYالتي تتفوق في تجميع الاتصال. يثبت هذا مفيدًا لأن جميع الطلبات من المضيف يتم توجيهها إلى Minio. وعندما يكون لديك العديد من VMs في اللعب ، كل تحميل وتنزيل عشرات تدفقات البيانات المتزامنة إلى متجر الكائن ، يصبح هذا أمرًا بالغ الأهمية.

في بعض الأحيان ، يكون الفشل هو الخيار الأسرع

يعتبر التخزين المؤقت مفهومًا هندسيًا مثيرًا للاهتمام حيث يكون الفشل في استرداد ذاكرة التخزين المؤقت أفضل من محاولة القيام بذلك في بيئة شبكة متدهورة حيث تبطئ الأمور على الزحف. في نظام موزع مثل نظيرنا ، فإن فرص تدهور الشبكة المتقطعة غير صفرية وأفضل شيء في هذه الحالات هو ببساطة أن يكون هناك تفويت ذاكرة التخزين المؤقت-إعادة بناء الأجسام المخبأة أفضل من أخذ 10 دقائق لاستردادها.

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

كان هذا النظام مثالًا مثاليًا على هذا الدرس. بمجرد أن أطلقنا الإصدار التجريبي ، بدأنا نرى بعض الإجراءات التي تعتمد على دلالات التخزين المؤقت المختلفة قليلاً عن Github’s. بعض protobufs التسلسلية المتوقع. أراد آخرون أن هذه البروتوبوفس قد تحولت إلى JSON. كان كل غير متطابق مهمًا ، والطريقة الوحيدة للكشف عنهم جميعًا هي الحصول على فشل في العالم الحقيقي على نطاق واسع خلال الإصدار التجريبي-لم يكن هناك بديل.

ذاكرة التخزين المؤقت Colocated هي ملك

ما هي نتيجة كل هذا الجهد؟ ببساطة ، لقد رأينا سير عمل عملاء في العالم الحقيقي يعمل على حداد الآن يتمتع بسرعات ذاكرة التخزين المؤقت حتى 10x أسرع وتضاعف أعلى من تلك الموجودة في إجراءات github ، مع تغييرات رمز صفري المطلوبة في ملفات سير العمل نفسها.

قبل:

2025-06-04T19:06:33.0291949Z Cache hit for: node-cache-Linux-x64-npm-209c07512dcf821c36be17e1dae8f429dfa41454d777fa0fd1004d1b6bd393a82025-06-04T18:26:33.3930117Z Received 37748736 of 119159702 (31.7%), 35.9 MBs/sec2025-06-04T18:26:34.3935922Z Received 114965398 of 119159702 (96.5%), 54.7 MBs/sec2025-06-04T18:26:34.6696155Z Received 119159702 of 119159702 (100.0%), 49.8 MBs/sec2025-06-04T18:26:34.6697118Z Cache Size: ~114 MB (119159702 B)

بعد:

2025-06-04T19:06:33.0291949Z Cache hit for: node-cache-Linux-x64-npm-209c07512dcf821c36be17e1dae8f429dfa41454d777fa0fd1004d1b6bd393a82025-06-04T19:06:33.4272115Z Received 119151940 of 119151940 (100.0%), 327.5 MBs/sec2025-06-04T19:06:33.4272612Z Cache Size: ~114 MB (119151940 B)

في هذه الحالة ، كان بسرعة كبيرة لدرجة أنه لم يستهلك سوى سطر سجل واحد لإظهار أنه قد أكمل على الفور!

اقرأ المزيد

المنزل الذكي ، المشكلات الغبية: تخصيص Google Home حقيقي
يبدو أن Microsoft تؤكد المتسللين الصينيين وراء هجمات Server SharePoint

Reactions

0
0
0
0
0
0
بالفعل كان رد فعل لهذا المنصب.

ردود الفعل