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

إطلاق كود جديد محفوف بالمخاطر لسبب بسيط: لا يمكنك معرفة كيف يتصرف حقًا حتى يتعرض له مستخدمون حقيقيون. تُعد طريقتا Blue/Green وCanary طريقتين شائعتين لتقليل هذا الخطر مع الحفاظ على زمن توقف قريب من الصفر.
يستخدم "نشر أزرق/أخضر" بيئتين منفصلتين لكنه تشبهان بعضهما:
تُحضّر بيئة الأخضر في الخلفية—تُنشَر البناية الجديدة، تُجرى فحوص، تُدفّأ الكاش—ثم تُحوّل الحركة من الأزرق إلى الأخضر عندما تكون واثقًا. إذا حدث خطأ، يمكنك العودة بسرعة.
الفكرة الأساسية ليست "الألوان"، بل قَطع نظيف قابل للرجوع.
الإصدار الكناري هو نشر تدريجي. بدلًا من تحويل الجميع دفعة واحدة، ترسل النسخة الجديدة إلى شريحة صغيرة من المستخدمين أولًا (مثلًا 1–5%). إذا بدا كل شيء صحيًا، توسّع النشر خطوة بخطوة حتى يصل إلى 100% من الحركة.
الفكرة الأساسية هي التعلّم من حركة المرور الحقيقية قبل الالتزام بالكامل.
النهجان تهدفان إلى:
يفعلان ذلك بطرق مختلفة: يركز أزرق/أخضر على تبديل سريع بين البيئتين، بينما يركز الكناري على التعريض المتحكم به عبر تحويل الحركة.
لا يُعد أي منهما متفوقًا تلقائيًا. الاختيار الصحيح يعتمد على كيفية استخدام المنتج لديك، مستوى ثقتك في الاختبارات، مدى حاجتك إلى تغذية راجعة سريعة، ونوع الأخطاء التي تحاول تجنبها.
تخلط العديد من الفرق بينهما—باستخدام أزرق/أخضر لبساطة البنية وطرق كناري للتعرّض التدريجي للمستخدمين.
في الأقسام التالية سنقارن بينهما مباشرة ونوضح متى ينجح كل منهما عادةً.
كلا الطريقتين وسيلتان لإصدار تغييرات دون مقاطعة المستخدمين—لكن تختلفان في كيفية انتقال الحركة إلى النسخة الجديدة.
أزرق/أخضر يُشغّل بيئتين كاملتين: "أزرق" (الحالي) و"أخضر" (الجديد). تتحقق من صحة الأخضر، ثم تبدّل كل الحركة دفعة واحدة—مثل قلب مفتاح واحد مُتحكم.
كناري يوفّر النسخة الجديدة لشريحة صغيرة من المستخدمين أولًا (مثلاً 1–5%)، ثم يحوّل الحركة تدريجيًا أثناء مراقبة الأداء في العالم الحقيقي.
| العامل | أزرق/أخضر | كناري |
|---|---|---|
| السرعة | تبديل سريع جدًا بعد التحقق | أبطأ بطبيعته (نشر تدريجي) |
| المخاطرة | متوسطة: إذا فشل الإصدار، يؤثر على الجميع بعد التبديل | أقل: المشاكل تظهر غالبًا قبل التغطية الكاملة |
| التعقيد | معتدل (بيئتان، تبديل نظيف) | أعلى (تقسيم الحركة، التحليل، خطوات تدريجية) |
| التكلفة | أعلى (تقضي فعليًا على مضاعفة السعة أثناء النشر) | غالبًا أقل (يمكنك التصعيد باستخدام السعة الحالية) |
| الأنسب لـ | تغييرات كبيرة ومنسقة | تحسينات صغيرة ومتكررة |
اختر أزرق/أخضر عندما تريد لحظة قطع نظيفة ومتوقعة—خاصة للتغييرات الكبيرة أو الترقيات أو الإصدارات التي تتطلب فصلًا واضحًا "قديم مقابل جديد".
اختر كناري عندما تنشر كثيرًا، تريد التعلم من الاستخدام الحقيقي بأمان، وتفضل تقليل نطاق الضرر بأن تدع المقاييس توجه كل خطوة.
إذا لم تكن متأكدًا، ابدأ بأزرق/أخضر لبساطة التشغيل، ثم أضف تقنيات كناري للخدمات الأعلى مخاطرة بعد أن تتحسّن المراقبة وعادات التراجع.
أزرق/أخضر خيار قوي عندما تريد أن يشعر الإطلاق كـ "قلب لمفتاح". تُشغّل بيئتين شبيهة بالإنتاج: أزرق (الحالي) وأخضر (الجديد). عندما تُتحقق من الأخضر، توجه المستخدمين إليه.
إذا كان منتجك لا يتحمّل نوافذ صيانة مرئية—مثل تدفقات الدفع، أنظمة الحجز، لوحات المستخدمين—فأزرق/أخضر يساعد لأن النسخة الجديدة تعمل وتُفحَص قبل إرسال المستخدمين إليها. معظم وقت النشر يحدث بعيدًا عن العملاء.
التراجع غالبًا مجرد إعادة توجيه الحركة إلى الأزرق. هذا مفيد عندما:
الفائدة الأساسية هي أن التراجع لا يتطلب إعادة بناء أو نشر—إنه تبديل حركة.
أزرق/أخضر أسهل عندما تكون ترابطات قاعدة البيانات متوافقة للخلف، لأن الأزرق والأخضر قد يتواجدان معًا لفترة قصيرة (وقد يقرآن/يكتبان اعتمادًا على التوجيه وإعدادات الوظائف). تناسب جيدًا:
ما قد يكون محفوفًا بالمخاطر: حذف أعمدة، إعادة تسمية حقول، أو تغيير المعاني داخل المكان—هذه قد تكسر وعد "العودة" ما لم تخطط له هجرات متعددة المراحل.
أزرق/أخضر يتطلب سعة إضافية (مكدسين) وطريقة لتوجيه الحركة (موازن تحميل، إنترانس، أو سجلات منصة). إذا كان لديك أتمتة لتوفير البيئات وذراع توجيه نظيف، يصبح أزرق/أخضر الافتراضية العملية لإصدارات عالية الثقة وقليلة الدراما.
الإصدار الكناري هو استراتيجية تنشر التغيير إلى شريحة صغيرة من المستخدمين أولًا، تتعلم مما يحدث، ثم توسع. هو الخيار الصحيح عندما تريد تقليل المخاطر دون إيقاف العالم لإصدار كبير "لكل المستخدمين".
يعمل الكناري أفضل للتطبيقات عالية الحركة لأن حتى 1–5% من الحركة يمكن أن تُنتج بيانات ذات مغزى بسرعة. إذا كنت تتتبع مقاييس واضحة (معدل الخطأ، الكمون، التحويل، إتمام الدفع، مهلة واجهة برمجة التطبيقات)، يمكنك التحقق من الإصدار اعتمادًا على الاستخدام الحقيقي بدلًا من الاعتماد فقط على بيئات الاختبار.
بعض المشاكل تظهر فقط تحت الحمل الحقيقي: استعلامات قاعدة بيانات بطيئة، فقدان الكاش، تأخّر مناطق جغرافية، أجهزة غير عادية، أو تدفقات مستخدمين نادرة. مع الكناري يمكنك التأكد أن التغيير لا يزيد الأخطاء أو يضعف الأداء قبل أن يصل للجميع.
إذا كان منتجك يُصدر كثيرًا، أو فرق متعددة تُساهم، أو تغييرات يمكن إدخالها تدريجيًا (تعديلات واجهة، تجارب تسعير، منطق التوصية)، فستناسبك خطوات الكناري: 1% → 10% → 50% → 100% وفقًا لما تراه.
الكناري يتوافق جيدًا مع أعلام الميزات: تنشر الكود بأمان، ثم تفعّل الوظيفة لشريحة من المستخدمين أو مناطق أو حسابات. يجعل التراجع أقل دراماتيكية—غالبًا ما يمكنك فقط إيقاف العلم بدل إعادة النشر.
إذا كنت تبني نحو التسليم التدريجي، فغالبًا ما يكون إصدار الكناري أنسب نقطة بداية.
راجع أيضًا: /blog/feature-flags-and-progressive-delivery
تحويل الحركة يعني ببساطة التحكم في من يحصل على النسخة الجديدة من تطبيقك ومتى. بدلًا من تحويل الجميع مرة واحدة، تنقل الطلبات تدريجيًا (أو انتقائيًا) من النسخة القديمة إلى الجديدة. هذا هو جوهر كل من نشر أزرق/أخضر وإصدار الكناري—وهو أيضًا ما يجعل نشر بدون توقف ممكنًا عمليًا.
يمكنك تحويل الحركة من عدة نقاط في الستاك. الاختيار يعتمد على ما تُشغّل بالفعل ومدى الدقة التي تحتاجها في التحكم:
لا تحتاج كل طبقة. اختر مصدرًا واحدًا "للحقائق" لقرارات التوجيه حتى لا يصبح إدارة الإصدارات تخمينًا.
معظم الفرق تستخدم أحد هذه الأساليب أو مزيجًا منها لـ تحويل الحركة:
النسبة أسهل في الشرح، لكن الشرائح غالبًا أكثر أمانًا لأنك تتحكم من يرى التغيير (وتجنب مفاجأة أكبر عملائك في الساعة الأولى).
أمران يكسران خطط النشر السليمة أحيانًا:
الجلسات الملزِقة (ثبات الجلسة). إذا كان نظامك يربط المستخدم بخادم/نسخة واحدة، فقد لا يتصرف تقسيم 10% كـ 10%. ويمكن أن يسبب أخطاء عند تنقل المستخدم بين نسخ خلال الجلسة. إن أمكن، استخدم تخزين جلسات مُشارك أو تأكد أن التوجيه يحافظ على ثبات المستخدم على نسخة واحدة.
تدفئة الكاش. النسخ الجديدة غالبًا تضرب كاش باردة (CDN، كاش التطبيق، كاش استعلامات DB). قد يبدو ذلك كتراجع أداء حتى وإن كان الكود سليمًا. خطط وقتًا لتدفئة الكاش قبل تصعيد الحركة، خاصةً للصفحات عالية الحركة ونقاط النهاية المكلفة.
عامل تغييرات التوجيه كم تغييرات إنتاجية، لا كزر عشوائي.
وثّق:
قليل من الحوكمة يمنع الناس من "رفعها إلى 50%" بينما لا يزال الفريق يراجع صحة الكناري.
النشر ليس مجرد "هل نجح النشر؟" بل هو "هل يحصل المستخدمون الحقيقيون على تجربة أسوأ؟" أسهل طريقة للبقاء هادئًا أثناء أزرق/أخضر أو كناري هي مراقبة مجموعة صغيرة من الإشارات التي تخبرك: هل النظام صحي، وهل التغيير يضر بالعملاء؟
معدل الأخطاء: راقب 5xx، فشل الطلبات، المهلات، وأخطاء التبعيات (قاعدة البيانات، المدفوعات، واجهات الطرف الثالث). كناري يزيد "أخطاء صغيرة" قد تخلق عبئ دعم كبير.
الكمون: راقب p50 وp95 (وp99 إن كانت متاحة). تغيير يحافظ على متوسط الكمون قد يخلق تباطؤات طويلة الذيل يشعر بها المستخدم.
الإشباع (Saturation): راقب مدى امتلاء مواردك—CPU، الذاكرة، IO للقرص، اتصالات DB، عمق الطوابير، تجمعات الخيوط. تُظهر مشاكل الإشباع عادة قبل الانهيارات الكاملة.
إشارات تأثير المستخدم: قِس ما يختبره المستخدم فعليًا—فشل الدفع، معدل نجاح تسجيل الدخول، نتائج البحث المرجعة، معدل تعطل التطبيق، أزمنة تحميل الصفحات الأساسية. هذه غالبًا أكثر دلالة من إحصاءات البنية التحتية وحدها.
اصنع لوحة صغيرة تناسب شاشة واحدة وتُشارك في قناة الإصدار. اجعلها متسقة عبر كل نشر حتى لا يضيّع الناس وقتهم في البحث عن الرسوم.
تضمن:
إذا كنت تُجري إصدار كناري، فقسم المقاييس حسب النسخة/مجموعة الحوادث حتى تقارن الكناري مقابل الأساس مباشرة. بالنسبة لـأزرق/أخضر، قارن البيئة الجديدة مقابل القديمة خلال نافذة التبديل.
حدد القواعد قبل بدء نقل الحركة. أمثلة للحدود:
الأرقام الدقيقة تعتمد على خدمتك، لكن الجزء المهم هو الاتفاق. إذا كان الجميع يعرف خطة التراجع والمشغلات، تتجنب النقاش أثناء تأثر العملاء.
أضف (أو شدّد) التنبيهات خصيصًا أثناء نوافذ النشر:
اجعل التنبيهات قابلة للتنفيذ: "ما الذي تغير، أين، وماذا نفعل بعد ذلك." إذا كانت التنبيهات مزعجة، سيفوّت الناس الإشارة المهمة عند تحويل الحركة.
معظم إخفاقات النشر لا تُسبّبها "أخطاء كبيرة" بل اختلافات صغيرة: قيمة إعداد مفقودة، هجرة قاعدة بيانات سيئة، شهادة منتهية، أو تكامل يتصرف بشكل مختلف في البيئة الجديدة. فحوص ما قبل الإصدار فرصة لالتقاط هذه القضايا بينما نطاق الخطر لا يزال صغيرًا.
قبل أن تحول أي حركة (سواء تبديل أزرق/أخضر أو نسبة كناري صغيرة)، تأكد أن النسخة الجديدة على الأقل حية وقادرة على خدمة الطلبات.
الاختبارات الوحدوية جيدة، لكنها لا تثبت أن النظام المُستَخدم يعمل. شغّل مجموعة اختبار تكامل قصيرة وأتمتة تنتهي خلال دقائق، لا ساعات.
ركز على التدفقات التي تعبر حدود الخدمات (ويب → API → DB → طرف ثالث)، وتضمّن على الأقل طلبًا "حقيقيًا" لكل تكامل رئيسي.
الاختبارات الآلية قد تفشل في اكتشاف الواضح أحيانًا. قم بتحقق بشري مستهدف لمسارات العمل الأساسية:
إذا دعمت أدوارًا متعددة (مشرف مقابل عميل)، اختبر واحدة على الأقل لكل دور.
قائمة تحقق تحوّل المعرفة القبلية إلى استراتيجية قابلة للتكرار. اجعلها قصيرة وقابلة للتنفيذ:
عندما تصبح هذه الفحوص روتينية، يصبح تحويل الحركة خطوة متحكَّمًا بها—لا قفزة إيمانية.
نشر أزرق/أخضر أسهل عند معاملته كقائمة تحقق: التحضير، النشر، التحقق، التبديل، المراقبة، ثم التنظيف.
أرسل النسخة الجديدة إلى بيئة الأخضر بينما يستمر الأزرق في خدمة حركة المستخدم الحقيقية. أبقِ الإعدادات والأسرار متطابقة ليكون الأخضر مرآة حقيقية.
قم بفحوص سريعة عالية الإشارة: التطبيق يبدأ بشكل نظيف، الصفحات الرئيسية تحمل، الدفع/تسجيل الدخول يعملان، والسجلات تبدو طبيعية. إذا كانت لديك اختبارات دخان أوتوماتيكية، شغّلها الآن. هذه اللحظة أيضًا للتحقق من لوحات المراقبة والتنبيهات الخاصة بالأخضر.
تصبح الأمور معقدة عند تغيير قاعدة البيانات. استخدم نهج التوسيع/التضييق:
هذا يتجنّب موقف "الأخضر يعمل والأزرق يكسر" خلال التبديل.
قبل التبديل، دفّئ الكاشات الحرجة (الصفحة الرئيسية، الاستعلامات الشائعة) حتى لا يدفع المستخدمون تكلفة "البداية الباردة".
بالنسبة للوظائف الخلفية/المهام المجدولة، قرر من سيشغّلها:
اقلب التوجيه من الأزرق إلى الأخضر (موازن التحميل/DNS/ingress). راقب معدل الأخطاء، الكمون، ومقاييس الأعمال لفترة قصيرة.
قم بفحص على غرار تجربة المستخدم الحقيقية، أبقِ الأزرق متاحًا مؤقتًا كخيار للرجوع. عند الاستقرار، أوقف وظائف الأزرق، أرشف السجلات، وحرّر موارد الأزرق لتقليل التكلفة واللبس.
نشر الكناري يتعلق بالتعلّم بأمان. بدلًا من إرسال كل المستخدمين إلى النسخة الجديدة مرة واحدة، تُعرّض شريحة صغيرة من حركة المرور الحقيقية، تراقب عن كثب، ثم توسع. الهدف ليس "الإبطاء" بل "إثبات الأمان" بأدلة في كل خطوة.
انشر النسخة الجديدة جنبًا إلى جنب مع النسخة المستقرة الحالية. تأكد من إمكانية توجيه نسبة محددة من الحركة لكلٍ منهما، وأن كلا النسختين مرئيان في المراقبة (لوحات منفصلة أو وسم يساعد).
ابدأ صغيرًا. هنا تظهر المشاكل الواضحة بسرعة: نقاط نهاية مكسورة، إعدادات مفقودة، مفاجآت هجرة DB، أو ارتفاع الكمون غير المتوقع.
دوّن ملاحظات للمرحلة:
إذا كانت المرحلة الأولى نظيفة، زد إلى حوالي ربع الحركة. ستشاهد الآن تنوّعًا أكثر من العالم الحقيقي: سلوكيات مستخدمين مختلفة، أجهزة طويلة الذيل، حالات حافة، وتزامن أعلى.
نصف الحركة حيث تصبح مسائل السعة والأداء أوضح. إذا كنت ستصل إلى حد التوسعة، غالبًا سترى إشارات مبكرة هنا.
عندما تكون المقاييس مستقرة وتأثير المستخدم مقبولًا، حول كل الحركة إلى النسخة الجديدة واعتبرها مُرقّاة.
توقيت التصعيد يعتمد على المخاطرة وحجم الحركة:
اعتبر أيضًا دورات الأعمال. إذا كان منتجك له ذروات (مثل وقت الغداء، عطلات نهاية الأسبوع، جولات الفوترة)، شغّل الكناري طويلاً بما يكفي لتغطية الظروف التي عادةً تسبب مشاكل.
النشرات اليدوية تخلق ترددًا وتباينًا. حيثما أمكن، أتمتة:
لا تُزيل الأتمتة الحكم البشري—هي فقط تُزيل التأخير.
لكل خطوة تصعيد، اكتب:
تحوّل هذه الملاحظات سجل نشراتك إلى كتاب قواعد للإصدار التالي—وتُسهل تشخيص الحوادث المستقبلية.
التراجعات أسهل عندما تقرر مسبقًا ما الذي يعنيه "السيء" ومن يملك صلاحية الضغط على الزر. خطة التراجع ليست تشاؤمًا—إنها كيف تبقي المشاكل الصغيرة من التحوّل إلى انقطاعات طويلة.
اختر قائمة قصيرة من الإشارات وحدد حدودًا صريحة حتى لا تدور المناقشات أثناء الحادث. المحفزات الشائعة:
اجعل المشغّل قابلًا للقياس ("p95 > 800ms لمدة 10 دقائق") واربطه بمالك (المناوبة، مدير الإصدار) الذي يملك صلاحية التصرف فورًا.
السرعة أهم من الأناقة. يجب أن يكون التراجع أحد هذه الطرق:
تجنّب "إصلاح يدوي ثم استكمال النشر" كخيار أول. استقر أولًا، ثم حقّق.
مع إصدار كناري، قد يكون بعض المستخدمين قد أنشأوا بيانات تحت النسخة الجديدة. قرر مسبقًا:
عند الاستقرار، اكتب ملاحظة قصيرة لما أدّى للتراجع، أيّ إشارات كانت مفقودة، وما ستغيّره في قائمة التحقق. اعتبرها دورة تحسّن لعملية الإصدار، لا تمرين لوم.
تسمح أعلام الميزات بفصل "النشر" (إرساء الكود إلى الإنتاج) عن "الإصدار" (تشغيله للمستخدمين). هذا فرق كبير لأنك تستطيع استخدام نفس خط النشر—أزرق/أخضر أو كناري—مع التحكم في التعريض بمفتاح بسيط.
بفضل الأعلام، يمكنك الدمج والنشر بأمان حتى لو لم تكن الميزة جاهزة للجميع. الكود موجود لكن غير مفعل. عندما تكون واثقًا، تفعّل العلم تدريجيًا—غالبًا أسرع من دفع بناء جديد—وإذا حدث خطأ يمكنك إيقافه بسرعة بنفس البساطة.
التسليم التدريجي يدور حول زيادة الوصول بخطوات مقصودة. يمكن تفعيل العلم لـ:
هذا مفيد خصوصًا عندما يخبرك نشر الكناري أن النسخة الجديدة صحية، لكنك تود إدارة مخاطر الميزة بشكل منفصل.
أعلام الميزات قوية، لكنها فعّالة فقط مع حوكمة:
قاعدة عملية: إذا لم يستطع أحد الإجابة عن "ماذا يحدث عند إيقاف هذا؟" فالعلم ليس جاهزًا.
لمزيد من الإرشاد حول استخدام الأعلام كجزء من استراتيجية الإصدار، انظر /blog/feature-flags-release-strategy.
الاختيار بين أزرق/أخضر وكناري ليس عن "أيّهما أفضل" بل عن نوع المخاطرة التي تريد التحكم بها، وما يمكنك تشغيله فعليًا بفريقك وأدواتك الحالية.
إذا كان هدفك الأعلى هو قطع نظيف وقابل للتنبؤ وزر "العودة" سهل، فغالبًا أزرق/أخضر هو الأنسب.
إذا كان هدفك تقليل نطاق الضرر والتعلّم من حركة المستخدم قبل الانتشار الكامل، فكناري أأمن—خاصة عندما تكون التغييرات متكررة أو يصعب اختبارها بالكامل مسبقًا.
قاعدة عملية: ابدأ بما يمكن لفريقك تشغيله باستمرار في الساعة الثانية صباحًا عندما يحدث خطأ.
اختر خدمة واحدة (أو تدفق واجهة مستخدم واحد) وجربها لعدة إصدارات. اختر شيئًا مهمًا لكنه ليس حرجًا لدرجة تجميد الجميع. الهدف بناء عادات حول تحويل الحركة، المراقبة، والتراجع.
اجعله قصيرًا—صفحة واحدة كافية:
تأكد من وضوح الملكية. استراتيجية بلا مالك تصبح مجرد اقتراح.
قبل إضافة منصات جديدة، انظر للأدوات التي تستخدمها بالفعل: إعدادات موازن التحميل، سكربتات النشر، المراقبة الحالية، وعملية الحوادث. أضف أدوات جديدة فقط عندما تزيل احتكاكًا حقيقيًا شعرت به في التجربة.
إذا كنت تبني وتطلق خدمات جديدة بسرعة، فإن المنصات التي تجمع إنشاء التطبيقات مع ضوابط النشر يمكن أن تقلل العبء التشغيلي. على سبيل المثال، Koder.ai منصة توليد تطبيقات من واجهة دردشة وتتيح النشر والاستضافة مع ميزات أمان كـ اللقطات والتراجع، ودعم نطاقات مخصصة وتصدير الشيفرة المصدرية. هذه القدرات تتماشى مع الهدف الأساسي لهذا المقال: جعل الإصدارات قابلة للتكرار، قابلة للملاحظة، وقابلة للرجوع.
إذا أردت رؤية خيارات التنفيذ وسيناريوهات الدعم، راجع /pricing و /docs/deployments. ثم جدولة أول نشر تجريبي، سجّل ما نجح، وطوّر دفتر التشغيل بعد كل عملية نشر.