ماذا يحدث بعد النشر: Promote، Hold، Rollback، Roll-Forward، Pause، أو Disable
انتهى النشر للتو. الإصدار الجديد يعمل في الإنتاج ويخدم حركة المرور الحقيقية. خط الأنابيب (Pipeline) يظهر باللون الأخضر، السجلات تتدفق، ولوحات المراقبة تضيء ببيانات جديدة. ماذا الآن؟
هذه اللحظة بين انتهاء النشر وإعلان النجاح هي حيث تعلق معظم الفرق. البعض يسرع لاعتبار المهمة منتهية والانتقال إلى التالي. آخرون يتجمدون، غير متأكدين مما إذا كان ما يرونه تقلبًا طبيعيًا أم بداية كارثة. الحقيقة هي أن النشر المنتهي ليس قرارًا - بل هو بداية قرار.
بمجرد أن تبدأ إشارات المراقبة (Observability signals) في الظهور، لديك ستة مسارات محتملة للمضي قدمًا. كل مسار يناسب موقفًا مختلفًا، وكل واحد يحمل عواقب مختلفة. معرفة أي مسار تختار ومتى يفرق بين الفرق التي تتعامل مع النشر بثقة والفرق التي تأمل فقط في الأفضل.
Promote: الإصدار جيد
Promote يعني أنك تعلن أن الإصدار الجديد هو إصدار الإنتاج الرسمي. تبقى كل حركة المرور عليه، ويمكن أرشفة الإصدار القديم أو إزالته. هذه هي النتيجة التي يريدها الجميع، لكن لا ينبغي أبدًا التسرع فيها لمجرد أن خط الأنابيب اجتاز الاختبارات.
أنت تستخدم Promote عندما تبقى جميع إشارات المراقبة ضمن حدود SLO الخاصة بك. معدلات الأخطاء طبيعية، زمن الاستجابة لم يرتفع، ميزانية الأخطاء (Error budget) لا تزال صحية، واختبارات الدخان (Smoke tests) اجتازت في الإنتاج. البيانات تؤكد ما اقترحه خط الأنابيب: هذا الإصدار آمن.
الفخ هنا هو الترويج مبكرًا جدًا. خط الأنابيب الأخضر يعني أن البناء والاختبارات اجتازت، لكنه لا يعني أن سلوك الإنتاج قد تم التحقق منه. امنح الإصدار الجديد وقتًا كافيًا لتجميع بيانات ذات معنى قبل اعتباره منتهيًا. ما يبدو مستقرًا بعد دقيقتين قد يكشف عن مشاكل بعد عشر دقائق.
Hold: لست واثقًا بعد
Hold يعني أن الإصدار الجديد يستمر في العمل، لكنك لا تعلنه كإصدار رسمي بعد. أنت تنتظر المزيد من البيانات. ربما لا تزال حركة المرور في ازدياد، أو ترى شذوذًا صغيرًا قد يكون ضوضاء أو قد يكون بداية شيء أسوأ.
Hold هو الوسط الآمن. أنت لا تشعر بالذعر، لكنك لا تحتفل أيضًا. يستمر الإصدار في خدمة حركة المرور بينما تراقب الأنماط. النتيجة الرئيسية هي أنه لا يمكنك بدء النشر التالي حتى يتم حل هذا النشر. Hold يمنع خط الأنابيب، وهذا مقصود - إنه يجبر الفريق على التحقيق قبل تكديس المزيد من التغييرات فوق حالة عدم اليقين.
هذا الخيار يعمل بشكل جيد عندما يكون لديك شعور غريزي بأن هناك شيئًا غير صحيح ولكن لا يوجد دليل قوي بعد. ثق بهذا الشعور. إذا كانت البيانات لا تقول بوضوح "Promote"، فلا تجبر الأمر.
Rollback: العودة إلى ما كان يعمل
Rollback يعني العودة إلى الإصدار المستقر السابق. تسحب الإصدار الجديد وتعيد القديم ليتولى المسؤولية. هذا يبدو وكأنه فشل، لكنه ليس كذلك. إنه انسحاب متحكم به من موقف سيء.
أنت تستخدم Rollback عندما تتجاوز معدلات الأخطاء SLO الخاص بك، أو تحترق ميزانية الأخطاء بشكل أسرع من المتوقع، أو يتم اكتشاف فشل حرج. المعايير واضحة وموضوعية. إذا كانت الأرقام تقول أن الإصدار الجديد أسوأ من القديم، فلا تتردد.
المشكلة هي أن Rollback يعمل فقط إذا كنت مستعدًا له. يجب اختبار الآلية قبل الطوارئ، لا تصميمها أثناءها. تغييرات قاعدة البيانات غير المتوافقة مع الإصدارات السابقة يمكن أن تجعل Rollback مستحيلًا، ولهذا يوجد Roll-Forward كبديل.
Roll-Forward: الإصلاح للأمام بدل العودة للخلف
Roll-Forward يعني أنك تبقي الإصدار الحالي قيد التشغيل ولكن تبدأ فورًا في بناء إصدار جديد يصلح المشكلة. بدلًا من العودة، تدفع إصلاحًا فوق الإصدار المعطل.
هذا الخيار منطقي عندما تكون المشكلة صغيرة ويمكن لفريقك إنتاج إصلاح بسرعة. إنه أيضًا الخيار الوحيد عندما لا يكون Rollback ممكنًا - على سبيل المثال، عندما غيّر ترحيل قاعدة البيانات (Migration) المخطط بطريقة لا يستطيع الكود القديم التعامل معها.
Roll-Forward يتطلب ثقة بأن الإصلاح سيعمل فعليًا. إذا كنت تخمن، فقد تجعل الأمور أسوأ. كما أنه يضع ضغطًا على الفريق لتسليم سريع، مما قد يؤدي إلى قرارات متسرعة. استخدم Roll-Forward عندما يكون المسار واضحًا، ليس عندما تأمل في الأفضل.
Pause: التوقف والتحقيق
Pause يعني أنك توقف عملية النشر دون تغيير ما يعمل حاليًا. يبقى الإصدار الجديد في مكانه، لكن لا يمكن المضي قدمًا في أي نشر آخر حتى يكتمل التحقيق.
استخدم Pause عندما ترى شيئًا غريبًا ولكن ليس شديدًا لدرجة تستدعي Rollback. زمن الاستجابة يزيد قليلاً في منطقة واحدة. معدلات الأخطاء ترتفع لكنها تبقى ضمن SLO. نقطة نهاية واحدة تظهر سلوكًا غير معتاد بينما كل شيء آخر يبدو طبيعيًا.
Pause يشتري لك وقتًا لفهم ما يحدث قبل اتخاذ قرار أكبر. يمنع الفريق من اتخاذ Rollback متسرع قد لا يكون ضروريًا، أو Promote متسرع قد يكون سابقًا لأوانه. التكلفة هي أن خط الأنابيب محظور، لكن هذا ثمن صغير مقارنة باتخاذ القرار الخاطئ.
Disable: إيقاف الجزء المعطل
Disable يعني أنك تعطل ميزة أو وظيفة معينة دون العودة بالإصدار بأكمله. هذا يتطلب أعلام الميزات (Feature flags) أو آلية أخرى لتبديل القدرات الفردية بشكل مستقل.
هذا هو أخف تدخل. إذا كانت ميزة واحدة فقط هي التي تسبب المشكلة - خوارزمية بحث جديدة، تدفق دفع معاد تصميمه، نقطة نهاية API تم تغييرها - يمكنك إيقاف تلك الميزة مع إبقاء كل شيء آخر يعمل. يفقد المستخدمون الوصول إلى تلك الميزة الواحدة، لكن باقي التطبيق يستمر بشكل طبيعي.
Disable أسرع وأكثر أمانًا من Rollback عندما تكون المشكلة معزولة. كما أنه يعطي الفريق وقتًا لإصلاح الميزة المحددة دون تعطيل النشر بأكمله. الشرط المسبق هو أن بنيتك التحتية تدعم المفاتيح الدقيقة (Granular toggles)، وهو أمر يستحق الاستثمار فيه إذا كنت تنشر بشكل متكرر.
كيفية الاختيار
القرار الصحيح يعتمد على ثلاثة أشياء: مدى سوء المشكلة، كم ميزانية الأخطاء المتبقية لديك، ومدى سرعة استجابة فريقك. الفرق التي لديها SLOs محددة وتتتبع ميزانية الأخطاء لديها أساس موضوعي لهذه القرارات. إذا كانت ميزانية الأخطاء على وشك النفاد، حتى الشذوذ الصغير قد يبرر Rollback. إذا كانت ميزانية الأخطاء وفيرة، قد تختار Hold أو Pause للتحقيق أكثر.
شجرة القرارات التالية تربط إشارات المراقبة الخاصة بك بالإجراء المناسب:
ما تريد تجنبه هو اتخاذ هذه القرارات بناءً على الشعور الغريزي وحده. عندما تكون البيانات واضحة، يكون المسار واضحًا. عندما تكون البيانات غير واضحة، استخدم Hold أو Pause حتى تصبح واضحة.
قائمة تحقق عملية لقرارات النشر
- هل انتظرت وقتًا كافيًا لتجميع بيانات مراقبة ذات معنى؟
- هل جميع الإشارات ضمن حدود SLO، أم يوجد شذوذ يحتاج تحقيقًا؟
- هل لديك آلية Rollback مختبرة جاهزة، أم أنت محظور بتغييرات قاعدة البيانات؟
- هل المشكلة معزولة لميزة واحدة يمكن تعطيلها بشكل مستقل؟
- هل لدى فريقك القدرة على بناء إصلاح بسرعة إذا اخترت Roll-Forward؟
- هل خط الأنابيب محظور بواسطة Hold أو Pause، وهل الجميع يعرف السبب؟
الخلاصة
النشر لا ينتهي عندما يكون الكود قيد التشغيل. ينتهي عندما يكون لديك بيانات كافية لاتخاذ قرار واثق بشأن ما يجب فعله بعد ذلك. الخيارات الستة - Promote، Hold، Rollback، Roll-Forward، Pause، و Disable - تعطيك مفردات لهذا القرار. استخدمها عن قصد، بناءً على الإشارات، وليس التخمينات. الإصدار الذي تنشره ليس الإجابة النهائية. القرار الذي تتخذه بعد مشاهدته وهو يعمل هو الإجابة.