ستون حاوية على خادم واحد
صندوق معدن عارٍ واحد يشغّل عشرات إلى مئات حاويات Hoody. تجعل KSM وإزالة التكرار في BTRFS التكلفة الهامشية قريبة من الصفر.
تُشغّل هجرة من ثماني ساعات. خمسة أشخاص يريدون حالةً دون استهلاك خانة مستقبِل أو مقاطعة البثّ. أضف ?progress إلى رابط الأنبوب. كل من يفتحه يحصل على لوحة HTML مباشرة — البايتات المنقولة، السرعة الحاليّة، الزمن المتبقّي، انتقالات الحالة. الهجرة تعمل بأقصى سرعة بصرف النظر عن عدد العيون التي تشاهد.
?progress قراءة منفصلة على مسار الأنبوب تُصغي إلى حالة النقل دون المطالبة بخانة مستقبِل. الهجرة لا تلاحظها. المتصفّح يرى لوحة HTML؛ curl يرى تغذية SSE نظيفة.
تلصق رابط الـ pipe مع ?progress في متصفح هاتفها. تظهر لوحة HTML فوراً — state: waiting، 0% — بلا تثبيت، بلا تسجيل دخول، دون استهلاك أي receiver slot.
يدفع SSE حدث state: streaming. يقفز شريط التقدم إلى 22%، تتصاعد الـ bytes، ويستقر معدل MB/s عند 118. تحدّث اللوحة نفسها كل 250 ms دون أي إعادة تحميل للصفحة.
تغلق التبويب. ينقطع اتصالها كمشاهِدة. الـ migration لا يلاحظ — لم يكن يوماً في مسار البيانات. يواصل الـ sender ومستقبله الحقيقي الوحيد العمل.
تعيد فتح الـ URL عند الفجر. تعرض اللوحة حدث done: 7.6 GB منقولة، 8h 2m، بلا أخطاء. الحالة على الخادم تنجو من إعادة التحميل — المتأخرون يرون دائماً السطر الأخير.
تعيد توجيه الـ URL إلى Slack الفريق. يفتحه ثلاثة مهندسين فيرون نفس حالة done. لا thread حالة لإغلاقه، لا لوحة Grafana لإلغاء تمييزها. URL واحد، خمسة شهود، صفر مقاطعات.
# 1. المرسل — ترحيل ثماني ساعات. نفس الحال دائماً.
tar czf - /var/lib/postgres | curl -T - "$PIPE/api/v1/pipe/migration"
# 2. المتلقي — العميل الوحيد الذي يهم للضغط العكسي.
curl "$PIPE/api/v1/pipe/migration" | tar xzf - -C /restore
# 3. الرئيسة تفتح الرابط على هاتفها. لوحة معلومات HTML. بلا إعداد.
# => https://pipe.hoody.com/api/v1/pipe/migration?progress
# 4. تريد SSE لروبوت Slack؟ نفس الرابط، قبول مختلف.
curl -N -H "Accept: text/event-stream" \
"$PIPE/api/v1/pipe/migration?progress" \
| grep -E '^event: (progress|state|done)'
# event: state \n data: ["state":"streaming","receivers":1]
# event: progress \n data: ["bytes":5046464512,"mbps":118,"etaSec":840]
# event: done \n data: ["bytes":8160000000,"durationSec":28800]ثلاثة أنواع أحداث SSE. state للانتقالات (idle → waiting → streaming → complete)، progress كل 250 ms أثناء تدفّق البايتات (bytesTransferred، السرعة، الزمن المتبقّي)، done مرّة واحدة في النهاية بإحصاءات نهائيّة. حتى خمسون متفرّجاً لكل مسار، TTL الاتّصال ثلاثون دقيقة، بقاء ثلاثين ثانية بعد النقل ليرى المتأخّرون سطر النجاح.
نفس نقطة نهاية ?progress تخدم تبويب متصفّح وأنبوب curl وصفحة حالة تستطلع في الخلفيّة. لا أحد منهم يُبطئ النقل.
تحفظ الـ URL على هاتفها. تتفقّده مرتين يومياً.
لوحة HTML، بلا تسجيل دخولمرّر SSE عبر curl إلى webhook في Slack. bot حالة من سطر واحد.
text/event-stream, same URLمضمّن في صفحة حالة عامة. يستعلم كل 30 s.
0 receiver slots، حالة حية كاملةموصول بـ PagerDuty عبر حدث done. ينبّه عند الانتهاء.
event: done، مُشغّل لمرة واحدةمشاهدة الهجرة هي رابطها الخاصّ. الهجرة لا تلاحظ.
كل فريق لديه طريقة للإجابة عن «إلى أين وصلت؟». معظم تلك الطرق تُكلّف خدمةً تشغّلها أو لوحة توصلها أو قناة محادثة تتفقّدها. مُعامل استعلام على رابط الأنبوب لا يُكلّف شيئاً من ذلك.
أرسل الرابط. توقّف عن إرسال التحديثات.