
ستون حاوية على خادم واحد
صندوق معادن عارية واحد يشغل عشرات إلى مئات حاويات Hoody. يجعل KSM و BTRFS dedup التكلفة الإضافية قريبة من الصفر.
مصفوفة الـ CI تتفرّع عبر ثلاثين مُشغِّل اختبار. كل واحد يحتاج نفس الصورة بحجم 800 ميجابايت. بثّ ملف tar إلى مسار أنبوب واحد بـ ?n=30. كل الثلاثين عاملاً يطلبون نفس الرابط بـ curl. البايتات تمرّ مرّة واحدة، الخادم لا يحتفظ بشيء، ولا تُدوَّر بيانات اعتماد سجلّ.
# بث الصورة مرة واحدةtar c ./image.tar | curl -T - https://pipe.hoody.com/build-12af?n=30مرسِل واحد على اليسار. ثلاثون مستقبِل GET على اليمين. الأنبوب ينتظر حتى يُصغي الجميع، ثم تمرّ البايتات مرّة واحدة.
الأنبوب موجِّه فان-آوت بدون قرص. POST من المرسِل إلى /api/v1/pipe/[path]?n=30 يبقى محصوراً حتى يتّصل ثلاثون مستقبِلاً بنفس الرابط ونفس قيمة n. ثم تتدفّق البايتات من حاوية البناء مباشرةً إلى كل مُشغِّل، في الوقت ذاته، بسرعة أبطأ مستقبِل.
tar c | curl -T - https://pipe/.../build?n=30حاوية البناء تُمرِّر ملف tar مباشرة إلى curl. لا ملف يُكتب، لا سجلّ يُدفع إليه.
POST /api/v1/pipe/[path]?n=30الخادم يحتفظ بالمرسِل حتى يتّصل الثلاثون مستقبِلاً. عدم تطابق n يُرجع 400. المستقبِلون المتّصلون مسبقاً مقبولون.
curl https://pipe/.../build?n=30 | tar xكل مُشغِّل يستقبل بايتات متطابقة. الضغط العكسي يأتي من أبطأ مستقبِل، لا من عرض نطاق المرسِل.
لا شيء يثبت. لا شيء يُخزَّن. الأنبوب يوسّط الاتّصال، ثم يتنحّى جانباً. حين ينتهي أبطأ مُشغِّل، ينتهي النقل — والرابط يختفي.
بسذاجة: ثلاثون سحبة من السجلّ لنفس ملف tar بحجم 800 ميجابايت، ثلاثون ذاكرة مؤقّتة باردة، ثلاثون رحلة شبكة. مع Pipe: خروج واحد، نقل واحد، أبطأ مستقبِل يضبط الإيقاع.
12 ثانية
خروج واحد بسرعة الخط. أبطأ مستقبِل يضبط الإيقاع، لكن لا أحد يُعيد التنزيل.
1× / بناء
البايتات تغادر البنّاء مرّة واحدة، تتفرّع عند الأنبوب. لا رسوم S3 GET، لا سحبات Docker Hub.
0 بايت
الأنبوب لا يحتفظ بشيء على القرص. لا سجلّ يجب تنظيفه، لا مفتاح ذاكرة مؤقّتة يجب إبطاله.
رقم زمن الجدار يفترض مصفوفة من 30 على نفس الشبكة الإقليميّة لحاوية البناء؛ النقل عبر المناطق محدود بعرض النطاق بين المناطق، لا بالأنبوب.
حين يصبح البناء رابطاً واحداً وثلاثين طلب curl، تختفي حزمة من سقّالات CI. لا تخزين قطع أثرية يجب تجاوز عمره. لا بيانات اعتماد سجلّ يجب تدويرها. لا cache action يجب تنقيحه.
الضغط العكسي مدمج في الأنبوب. العمّال السريعون لا يُهدرون رحلة سجلّ بانتظار البطيء — ينتظرون عند الأنبوب، ثم يشربون بنفس الإيقاع. لا أحد يُعيد التنزيل.
لا شيء يُدفع إلى سجلّ، إذاً لا شيء يحتاج المصادقة عليه. الرابط نفسه هو الاعتماد — قصير العمر، محدود بنقلٍ واحد، يُلغى حين ينتهي البناء.
البايتات تغادر البنّاء مرّة واحدة. الأنبوب يبثّ. تدفع خروجاً واحداً لكل بناء بدلاً من ثلاثين سحبة سجلّ لكل تشغيل مصفوفة.
الأنبوب لكل بناء، لا لكل مفتاح. لا توجد ذاكرة GitHub Actions يمكن أن تخطئ، لا لغز طبقة buildx، لا ملف tar قديم من بناء main الأسبوع الماضي.
النمط نفسه يُعالج node_modules، و.pnpm-store، وtarget/، وذاكرة wheel، وشريحة بيانات. إن كان يُبثّ، فإنّه يتفرّع.
مرسِل واحد. ثلاثون مستقبِلاً. صفر فواتير S3.
دفعة من 30 جهة استغرقت تسعين ثانية وضربةً على S3 صارت تستغرق اثنتي عشرة ثانية وخروجاً واحداً. لا أحد يُعيد التنزيل. لا تُدوَّر بيانات اعتماد سجلّ. الرابط يُلغي نفسه حين تنتهي المصفوفة.
القطع التي يجب أن يجمعها تدفّق CI مصفوفي عادةً — سجلّ، cache action، مرآة، خطوة رفع مخصّصة. الأنبوب يطويها كلّها في رابط واحد.
توقّف عن دفع نفس ملف tar ثلاثين مرّة. ادفعه مرّة واحدة. دع ثلاثين طلب curl يتقاسمون البثّ.