النشر بنمط Blue‑Green مقابل Canary: تغييرات آمنة في الـ API وقاعدة البيانات
شرح مقارنة Blue‑Green وCanary لتغييرات API وقاعدة البيانات مع خطوات عملية لتقليل مخاطر التوقف أثناء ترحيل المخطط وتحديثات تطبيقات الموبايل البطيئة.

لماذا يصبح النشر محفوفًا بالمخاطر عند تغيّر المخطط وتباطؤ تحديثات الموبايل
قد يبدو النشر ناجحًا تمامًا في الاختبارات ويتوقف فور وصوله لحركة المرور الحقيقية. السبب الشائع أن الكود ليس الشيء الوحيد الذي يتغير؛ عقدة واجهة الـ API ومخطط قاعدة البيانات يتغيران أيضًا، ونادرًا ما يسيران بنفس الوتيرة.
تتعطل الأشياء عندما تختلف أجزاء النظام حول معنى "الصحيح". قد يتوقع الـ backend الجديد عمودًا غير موجود بعد. أو يكتب الـ backend القديم بيانات بصيغة لا يفهمها الكود الجديد بعد الآن. حتى تغييرات بسيطة مثل إعادة تسمية حقل، تشديد التحقق، أو تغيير قيمة enum يمكن أن تسبب أخطاء في الإنتاج.
تزيد المخاطر في تطبيقات الموبايل لأن الإصدارات القديمة تبقى موجودة. بعض المستخدمين يحدثون التطبيق خلال دقائق، وآخرون خلال أسابيع. هذا يعني أن الـ backend يجب أن يخدم أجيالًا متعددة من العملاء في الوقت نفسه. إذا طرحت تغييرًا في الـ API يعمل فقط مع أحدث تطبيق، قد تكسر عملية الدفع أو التسجيل أو المزامنة في الخلفية لجزء من المستخدمين دون ملاحظة فورية.
مصطلح "مخاطر التوقف" ليس مقصورًا على تعطل الموقع. في الأنظمة الحقيقية يظهر غالبًا كأخطاء جزئية:
- ارتفاع مفاجئ في أخطاء 4xx/5xx على نقاط نهاية محددة بينما يبدو الباقي طبيعيًا
- فشل تسجيل الدخول لأن الرموز أو الأدوار أو سجلات المستخدم لم تعد تطابق التوقعات
- مشكلات بيانات صامتة (افتراضات خاطئة، نص مقطوع، علاقات مفقودة) تظهر بعد أيام
- مهام خلفية تتوقف وتبني قائمة انتظار تستغرق ساعات لتفريغها
لهذا السبب تقارن الفرق بين Blue‑Green وCanary: الهدف تقليل نصف القطر الأثري عندما لا تكون التغييرات متوافقة تمامًا.
Blue‑Green وCanary بلغة بسيطة
عند المقارنة بين Blue‑Green وCanary عادة نسأل سؤالًا واحدًا: هل تريد تحويلًا كبيرًا ومتحكمًا أم اختبارًا صغيرًا وحذرًا؟
Blue‑Green: نسختان كاملتان وتحويل للمرور
يعني Blue‑Green تشغيل بيئتين كاملتين في نفس الوقت. "الـ Blue" هي النسخة الحالية التي تخدم المستخدمين. "الـ Green" هي النسخة الجديدة، مُنشَرة ومجربة بالتوازي. عندما تكون جاهزًا، تقلب المرور من blue إلى green.
هذا النهج جيد للتنبؤ. يمكنك التحقق من النسخة الجديدة بإعدادات شبيهة بالإنتاج قبل أن تخدم مستخدمين حقيقيين، ثم إجراء قصْبة واحدة ونظيفة.
العودة للخلف أيضًا واضحة: إذا حدث خطأ بعد التحويل، أعد توجيه المرور إلى الـ blue. هو تقريبًا تبديل فوري، لكن الكاشات والمهام الخلفية وتغييرات البيانات قد تعقّد الاسترداد.
Canary: إرسال نسبة صغيرة من المرور أولًا
Canary يعني أن تُشغّل النسخة الجديدة لجزء صغير من المستخدمين أو الطلبات أولًا. إذا بدت صحية، تزيد النسبة خطوة بخطوة حتى تخدم الجميع.
Canary مناسب عندما تقلق من سلوك غير معلوم تحت حركة المرور الحقيقية. يمكنك كشف المشكلات مبكرًا قبل أن يشعر بها معظم المستخدمين.
تعمل العودة للخلف هنا بتقليل نسبة الـ canary إلى الصفر (أو إيقاف توجيه المرور للإصدار الجديد). عادةً هي سريعة، لكنها ليست دائمًا نظيفة لأن بعض المستخدمين قد أنشأوا بيانات أو حالة يجب أن يتعامل معها كلا الإصدارين.
ملخص بسيط للمقارنة:
- Blue‑Green يفضّل تحويلات نظيفة والعودة السريعة.
- Canary يفضّل التعلم من المرور الحقيقي مع نصف قطر أضرار محدود.
- ولا أحد منهما يضمن سلامة قواعد البيانات تلقائيًا. إذا لم تكن تغييرات المخطط متوافقة، يمكن أن يفشلا.
- Canary يعتمد على المراقبة لأن قرارك مبني على إشارات حية.
- Blue‑Green غالبًا يحتاج سعة إضافية لأنك تشغل اثنين من الستاكات كاملة.
مثال: إذا طرحت API تعيد حقلًا جديدًا أحيانًا، يساعدك canary على رؤية ما إذا كانت الإصدارات القديمة من العملاء تتعطل عند استقبال بيانات غير متوقعة. إذا تطلّب التغيير إعادة تسمية عمود لا يمكن للكود القديم التعامل معه، فلن ينقذك Blue‑Green ما لم يصمم تغيير المخطط ليدعم الإصدارين.
لماذا تختلف ترحيلات قواعد البيانات عن نشر الكود
إعادة نشر الكود عادةً ما تكون سهلة التراجع. إذا تصرف الإصدار الجديد بشكل خاطئ، تعيد نشر النسخة القديمة وتعود إلى الوضع السابق إلى حد كبير.
تختلف تغييرات قاعدة البيانات لأنها تغيّر شكل بياناتك. بعد إعادة كتابة صفوف أو حذف أعمدة أو تشديد قيود، العودة نادرًا ما تكون فورية. حتى لو عدت للكود القديم، قد لا يفهم المخطط الجديد.
لهذا السبب مخاطر التوقف أثناء ترحيل المخطط غالبًا تتعلق أكثر بكيفية تصميم الترحيل منه بالطريقة التي تنشر بها.
أساسيات الترحيل عبر الإنترنت
أأمن الترحيلات هي تلك المصممة للعمل بينما تعمل إصدارات التطبيق القديمة والجديدة في آن واحد. النمط بسيط: أجرِ تغييرًا يمكن تجاهله بأمان، حدّث الكود لاستخدامه، ثم نظّف لاحقًا.
تتبع سلسلة التوسيع ثم التضييق الشائعة هذا الترتيب:
- تغييرات إضافية أولًا: أضف عمودًا قابلًا لأن يكون nullable، أضف جدولًا جديدًا، أضف فهرسًا بطريقة لا تقفل الكتابات.
- سلوك ثنائي: اكتب في القديم والجديد معًا، أو اقرأ من الجديد مع الرجوع للقديم كاحتياط.
- الملء الخلفي منفصلًا: حرّك البيانات الموجودة على دفعات صغيرة.
- التحويل: حوّل غالبية المرور للسلوك الجديد.
- تغييرات مدمرة أخيرًا: احذف الأعمدة القديمة، أزل مسارات الكود القديمة، شدّد القيود.
"الترحيلات الكبيرة" تجمع أكثر الخطوات خطورة في إصدار واحد: أقفال طويلة، ملء خلفي ثقيل، وكود يفترض أن المخطط الجديد موجود في كل مكان.
لماذا ترفع تحديثات الموبايل البطيئة مستوى المتطلبات
عملاء الموبايل يمكن أن يبقوا على إصدارات قديمة أسابيعًا. يجب أن يقبل الـ backend طلبات قديمة ويعيد استجابات قديمة بينما تتطور قاعدة البيانات.
إذا أرسل تطبيق قديم طلبًا بدون حقل جديد، لا يمكنك أن تجعل هذا الحقل مطلوبًا فجأة في قاعدة البيانات. تحتاج فترة يعمل فيها السلوكان معًا.
أي استراتيجية تقلل مخاطر التوقف لترحيلات المخطط؟
الخيار الأكثر أمانًا يعتمد أقل على أداة النشر وأكثر على سؤال واحد: هل يمكن للإصدارين القديم والجديد العمل بشكل صحيح على نفس مخطط قاعدة البيانات لمدى من الوقت؟
إذا كان الجواب نعم، غالبًا ما يكون Blue‑Green هو الخيار الأقل توقفًا. يمكنك تحضير تغيير قاعدة البيانات أولًا، إبقاء المرور على الستاك القديم، ثم تحويل المرور إلى الستاك الجديد في نقلة واحدة. إذا بدا شيء خاطئ، تعود بسرعة.
يظل Blue‑Green معرضًا للفشل عندما يتطلب التطبيق الجديد المخطط الجديد فورًا. أمثلة شائعة تشمل حذف أو إعادة تسمية عمود ما يزال الإصدار القديم يقرؤه، أو إضافة قيد NOT NULL قبل أن يكتب التطبيق القيمة. في تلك الحالات، قد لا تكون العودة للخلف آمنة لأن قاعدة البيانات أصبحت متوافقة بشكل مختلف.
Canary أفضل عندما تحتاج تعلمًا مسيطَرًا. جزء صغير من المرور يصل الإصدار الجديد أولًا، ما يساعدك على اكتشاف حالات الحافة مثل الفهارس المفقودة، أنماط الاستعلام غير المتوقعة، أو اختلاف سلوك مهام الخلفية تحت حمولة الإنتاج. المقايضة هنا أنك يجب أن تحافظ على عمل الإصدارين في الوقت نفسه، مما يتطلب عادة تغييرات قاعدة بيانات متوافقة مع الإصدارات السابقة.
قاعدة قرار عملية
عند الموازنة بين Blue‑Green وCanary لمخاطر ترحيل المخطط:
- اختر Blue‑Green عندما يمكنك إبقاء تغيير المخطط إضافيًا ومتوافقًا، وتريد قطعًا نظيفًا وسريعًا.
- اختر Canary عندما لست متأكدًا من سلوك التغيير في الإنتاج أو تتوقع أن أشكال البيانات النادرة قد تؤثر.
- إذا أجبر الترحيل على تغيير يكسر التوافق فورًا، لا تختَر بين Blue‑Green وCanary. غيّر الخطة لتتبع نمط التوسيع ثم التضييق.
كيف يبدو "التوافق" عمليًا
افترض أنك تضيف حقلًا جديدًا لجدول orders. المسار الآمن هو: أضف العمود كقابل لأن يكون nullable، انشر التطبيق الذي يكتبه، ملء الخلفي للصفوف القديمة، ثم شدّد القيود لاحقًا. في هذا الإعداد، يعطيك Blue‑Green قصبة نظيفة، ويعطيك Canary تحذيرًا مبكرًا إذا افترضت بعض مسارات الكود الشكل القديم.
كيف يغيّر تباطؤ تحديثات الموبايل اختيار النشر
مستخدمي الويب يحدثون الصفحة. مستخدمي الموبايل لا يفعلون ذلك بالضرورة.
على iOS وAndroid، قد يبقى الناس على إصدارات قديمة أسابيعًا أو أشهر. بعض الأجهزة لا تحدث حتى تُجبر على ذلك، وبعضها يكون غير متصل لفترات طويلة. هذا يجعل "العميل القديم" اختبارًا دائمًا لتوافقك الرجعي.
هذا يحوّل الهدف من "النشر بدون توقف" إلى "الحفاظ على عمل أجيال متعددة من العملاء في الوقت نفسه." عمليًا، يدفعك الموبايل غالبًا للتفكير بأسلوب يشبه Canary لواجهات الـ API، حتى لو كنت تستخدم Blue‑Green للبنية التحتية.
تغييرات متوافقة رجعيًا مقابل إصدار الـ API
معظم الوقت تريد تغييرات متوافقة رجعيًا لأنها تسمح للعملاء القدامى والجدد بمشاركة نفس النقاط النهائية.
أمثلة على التوافق الرجعي تشمل إضافة حقول جديدة، قبول أشكال حمولة قديمة وجديدة، الحفاظ على الحقول الاستجابية الموجودة، وتجنّب تغيير المعنى.
تصبح نسخ الـ API مفيدة عندما يجب أن يتغير السلوك (وليس مجرد إضافة بيانات)، أو عندما يجب إزالة أو إعادة تسمية حقول.
مثال: إضافة حقل اختياري مثل marketing_opt_in عادةً آمن. تغيير كيفية حساب price عادةً ليس آمنًا.
تخطيط نافذة التوقف عن الدعم
إذا احتجت إلى تغيير يكسر التوافق، عامل نهاية الدعم كقرار منتجي. نافذة الإيقاف المفيدة تُقاس بـ "المستخدمين النشطين الذين ما زالوا على الإصدارات القديمة"، وليس بعدد الأيام في التقويم.
تسلسل عملي مفيد:
- انشر الـ backend الذي يدعم العملاء القدامى والجدد.
- أطلق التطبيق الجديد وتتبع التبني بحسب إصدار التطبيق.
- حذّر أو قيّد فقط عندما تنخفض إصدارات العملاء القديمة أدنى حد آمن.
- أزل السلوك القديم أخيرًا مع خطة تراجع.
خطوة بخطوة: نمط طرح آمن لتغييرات API + قاعدة البيانات
عندما تغيّر API وقاعدة بيانات في نفس الوقت، الخطة الأكثر أمانًا عادةً تكون من مرحلتين أو ثلاث. يجب أن تكون كل خطوة قابلة للنشر بمفردها بأمان، حتى لو بقي مستخدمون على تطبيق موبايل قديم أسابيع.
نمط طرح يتجنّب كسر العملاء القدامى
ابدأ بتغيير قاعدة بيانات إضافي. أضف أعمدة أو جداول جديدة، تجنّب إعادة التسمية أو الحذف، اسمح بالـ nulls عند الحاجة، واستخدم قيم افتراضية حتى لا يواجه الكود القديم قيودًا جديدة.
ثم أرسل كودًا يتحمّل كلا شكلَي البيانات. يجب أن تقبل القراءة "غياب الحقل القديم" و"وجود الحقل الجديد". يجب أن تستمر الكتابة في كتابة الحقل القديم الآن، ومن الممكن أن تكتب الحقل الجديد أيضًا.
تسلسل نموذجي:
- أضف أجزاء المخطط الجديدة (أعمدة، جداول، فهارس) دون إزالة القديمة.
- انشر كودًا يقرأ من القديم أو الجديد ولا يتعطل على nulls.
- عبّئ البيانات القديمة على دفعات صغيرة، ثم تحقّق من العدود، ونسب null، وأداء الاستعلامات.
- غيّر مسار الكتابة للحقل الجديد مع الاحتفاظ بالقراءة الاحتياطية.
- بعد تلاشي نسخ الموبايل القديمة، أزل الحقل القديم ونظّف الكود.
الملء الخلفي والتحقق: حيث تختبئ الانقطاعات
تفشل عمليات الملء الخلفي غالبًا لأنها تعامل كبرنامج نصي سريع. شغّلها تدريجيًا، راقب الحمولة، وتحقق من النتائج. إذا كان السلوك الجديد يحتاج فهرسًا، أضفه قبل تحويل القراءة أو الكتابة، لا بعد ذلك.
مثال: تضيف phone_country_code لتحسين التنسيق. أضف العمود أولًا (nullable)، حدّث الـ API لقبوله لكن لا تزال تعمل إذا كان مفقودًا، عبّئه من أرقام الهاتف الموجودة، ثم ابدأ في كتابته لعمليات التسجيل الجديدة. بعد أسابيع، عندما تختفي إصدارات الموبايل القديمة، يمكنك إزالة مسار التحليل القديم.
أدوات تقلل المخاطر لكلا الاستراتيجيتين (بدون تعقيد)
لا تحتاج إعدادًا معقّدًا ليصبح Blue‑Green أو Canary أكثر أمانًا. عادات قليلة تقلل المفاجآت عندما تتحرك واجهات الـ API ومخططات قواعد البيانات بوتيرة مختلفة.
القراءة المزدوجة والكتابة المزدوجة (اجعلها مؤقتة)
الكتابة المزدوجة تعني أن التطبيق يكتب البيانات في القديم والجديد خلال الانتقال (مثل users.full_name وusers.display_name). القراءة المزدوجة تعني أنه يمكنه القراءة من أي منهما، عادةً يفضّل الحقل الجديد لكن يرجع إلى القديم.
هذا يمنحك وقتًا لتحديث العملاء البطيئين، لكنه يجب أن يكون جسرًا قصير العمر. قرّر كيف ستزيله، تعقّب أي مسار يُستخدم، وأضف فحوصًا أساسية للتأكد من اتساق الكتابتين.
أعلام المزايا لتغيّر السلوك
تسمح أعلام المزايا بنشر الكود دون تفعيل السلوك المحفوف بالمخاطر. هذا يساعد مع Blue‑Green وCanary لأنك تفصل "النشر" عن "التشغيل".
مثال: انشر دعمًا لحقل استجابة جديد، لكن احتفظ بالخادم يعيد الشكل القديم حتى تكون جاهزًا. ثم فعّل السلوك الجديد لمجموعة صغيرة، راقب الأخطاء، وصعد النسبة. إذا حدث خطأ، أطفئ العلم دون إعادة نشر كاملة.
عقلية اختبار العقود (الـ API وعد)
العديد من حوادث الترحيل ليست "مشكلات قاعدة بيانات" بقدر ما هي مشكلات توقعات العملاء.
عامل الـ API كوعْد. تجنّب إزالة الحقول أو تغيير المعنى. اجعل الحقول غير المعروفة اختيارية. التغييرات الإضافية (حقول جديدة، نقاط نهاية جديدة) عادةً آمنة. التغييرات المكسورة يجب أن تنتظر إصدار API جديد.
مهام ترحيل بيانات موثوقة
غالبًا ما تحتاج ترحيلات المخطط إلى مهمة ملء خلفي لنسخ البيانات أو حساب قيم أو تنظيف. يجب أن تكون هذه المهام قابلة للتكرار: آمنة للتشغيل مرتين، قابلة لإعادة المحاولة، سهلة التتبع، ومُخفضة السرعة حتى لا تسبّب قفزات في الحمل.
أخطاء شائعة تسبب انقطاعات أثناء الترحيلات
معظم حوادث الترحيل تحدث عندما يفترض الإصدار أن كل شيء يتحرك معًا: كل الخدمات تُنشر دفعة واحدة، كل البيانات نظيفة، وكل العملاء يحدثون بسرعة. الأنظمة الحقيقية لا تعمل هكذا، خاصة مع الموبايل.
أنماط الفشل الشائعة:
- حذف أو إعادة تسمية عمود مبكرًا. قد لا تزال واجهات API القديمة أو مهام الخلفية أو تطبيقات الموبايل القديمة تستخدمه.
- افتراض تحديث العملاء بسرعة. إصدارات الموبايل تستغرق وقتًا للوصول إلى المستخدمين، والعديد لا يحدثون على الفور.
- تشغيل ترحيلات تقفل جداول كبيرة في ساعات الذروة. تغيير بسيط قد يمنع الكتابات.
- اختبار بيانات نظيفة فقط. بيانات الإنتاج تتضمن nulls، صيغ غريبة، مكررات، وقيم قديمة.
- عدم وجود خطة تراجع حقيقية للكود والبيانات. "يمكننا إعادة نشر النسخة السابقة" لا يكفي إذا تغيّر المخطط.
مثال: تعيد تسمية status إلى order_status وتنشر الـ API الجديد. يعمل الويب. تطبيقات الموبايل القديمة ما زالت ترسل status، والآن الـ API يرفض تلك الطلبات مما يسبب فشل عمليات الدفع. إذا حذفت العمود، استعادة السلوك ليست عملية سريعة.
الإفتراض الأفضل: قيّم التغييرات بخطوات صغيرة وقابلة للرجوع، حافظ على المسارين القديم والجديد يعملان معًا، واكتب خطة واضحة لما ستفعله إذا قفزت المقاييس (كيفية توجيه المرور للخلف، أي علم ميزة يوقف السلوك الجديد، وكيفية التحقق وإصلاح البيانات إذا فشل الملء الخلفي).
قائمة سريعة قبل النشر
قبل الإصدار بقليل، قائمة تحقق قصيرة تلتقط المشاكل التي تؤدي إلى التراجعات في وقت متأخر من الليل. هذا مهم جدًا عندما تغيّر API وقاعدة البيانات في نفس الوقت، خصوصًا مع تباطؤ تحديثات الموبايل.
خمس فحوصات تمنع معظم الانقطاعات
- التوافق: تأكد أن النسختين القديمتين والجديدة تعملان أمام نفس مخطط قاعدة البيانات. اختبار عملي هو تشغيل البناء الإنتاجي الحالي أمام قاعدة بيانات اختبار بها الترحيل الجديد مطبّق.
- ترتيب الترحيل: تأكد أن أول ترحيل إضافي، وجدول تغييرات مدمرة (حذف أعمدة، تشديد قيود) يُجدول لاحقًا.
- التراجع: عرّف أسرع تراجع. في Blue‑Green، هو إعادة توجيه المرور؛ في Canary، هو إعادة 100% من المرور للإصدار المستقر. إذا تطلّب التراجع ترحيلًا آخر، فهو ليس بسيطًا.
- الأداء: قِس زمن الاستعلام بعد تغيير المخطط، وليس فقط الصلاحية. فهرس مفقود قد يجعل نقطة نهاية تبدو كأنها متوقفة.
- واقع العميل: حدّد أقدم إصدار تطبيق موبايل لا يزال ينادي الـ API. إذا نسبة ملحوظة منه لا تزال تعمل، خطط لفترة توافق أطول.
سيناريو عقلي سريع
إذا كنت تضيف حقلًا جديدًا مثل preferred_language، نفّذ تغيير قاعدة البيانات أولًا كقابل لأن يكون null. ثم انشر كود الخادم الذي يقرأه عند وجوده لكنه لا يجبر عليه. فقط بعد أن ينتقل معظم المرور لتطبيقات محدثة اجعله مطلوبًا أو أزل السلوك القديم.
مثال: إضافة حقل جديد دون كسر تطبيقات الموبايل القديمة
افترض أنك تضيف حقل ملف شخصي جديد country، والأعمال الآن تريد أن يكون حقلًا مطلوبًا. هذا يمكن أن يسبب كسرًا في مكانين: العملاء القدامى قد لا يرسلون الحقل، وقاعدة البيانات قد ترفض الكتابات إذا فُرض NOT NULL مبكرًا.
نهج أكثر أمانًا يتضمن تغييرين منفصلين: أولًا أضف الحقل بطريقة متوافقة رجعيًا، ثم فرض "مطلوب" لاحقًا بعد أن تلتقط العملاء التحديث.
كيف يبدو الأمر مع Blue‑Green
مع Blue‑Green تنشر النسخة الجديدة بجانب القديمة. ومع ذلك لا يزال عليك أن تجعل تغيير قاعدة البيانات متوافقًا مع الإصدارين.
تدفق آمن مثالًيا:
- نفّذ الترحيل (أضف
countryكقابل لأن يكون nullable) - انشر النسخة green التي تقبل غياب
countryوتستخدم قيمة احتياطية - اختبر التدفقات الأساسية على green (التسجيل، تحرير الملف، إتمام الشراء)
- قم بتحويل المرور
إذا ساءت الأمور، عد للوراء. الشرط أن يكون الرجوع ممكنًا أن يظل المخطط يدعم النسخة القديمة.
كيف يبدو الأمر مع Canary
مع Canary تعرض السلوك الجديد لشريحة صغيرة (عادة 1% إلى 5%) وتراقب أخطاء التحقق من الحقول المفقودة، تغيّرات زمن الاستجابة، وفشل قواعد البيانات غير المتوقعة.
مفاجأة شائعة هي أن عملاء الموبايل القدامى يرسلون تحديثات ملف شخصي بدون country. إذا جعلت الـ API الحقل مطلوبًا فورًا سترى أخطاء 400. إذا فُرض NOT NULL في قاعدة البيانات قد ترى أخطاء 500.
تسلسل أكثر أمانًا:
- أضف
countryكقابل لأن يكون nullable (أو بقيمة افتراضية آمنة مثل "unknown") - اقبل غياب
countryمن العملاء القدامى - عبّئ
countryلعدد المستخدمين الموجودين عبر مهمة خلفية - فرض "مطلوب" لاحقًا (أولًا في الـ API، ثم في قاعدة البيانات)
بعد الإصدار، وثّق ما يمكن أن يرسله العملاء القدامى وما يضمنه الخادم. هذا العقد المكتوب يمنع تكرار نفس الكسر في الترحيل التالي.
إذا كنت تبني باستخدام AppMaster (appmaster.io)، تنطبق نفس قواعد الطرح حتى لو كان بإمكانك توليد backend، ويب، وتطبيقات موبايل أصلية من نموذج واحد. استخدم المنصة لنشر تغييرات مخطط إضافية ومنطق API متسامح أولًا، ثم شدّد القيود بعد ارتفاع التبني.
الأسئلة الشائعة
الـ Blue-Green يشغل بيئتين كاملتين ثم يحوّل كل المرور دفعة واحدة إلى الإصدار الجديد. Canary يطلق الإصدار الجديد لجزء صغير من المستخدمين أولًا ثم يرفعه تدريجيًا بناءً على ما تراه في المرور الحقيقي.
استخدم Blue-Green عندما تريد قطعًا واضحًا وسريعًا وتكون واثقًا من أن الإصدار الجديد متوافق مع مخطط قاعدة البيانات الحالي. يكون مفيدًا حين يكون الخطر الرئيسي في كود التطبيق وليس سلوك الإنتاج غير المتوقع.
اختر Canary عندما تحتاج إلى التعلم من المرور الحقيقي قبل التوسّع الكامل — مثل تغيّر أنماط الاستعلام أو بيانات الحافة أو سلوك مهام الخلفية تحت حمولة الإنتاج. يقلّل هذا النهج من دائرة الانعكاس لكنه يتطلب مراقبة دقيقة واستعدادًا لإيقاف الإطلاق.
لا. إذا كان تغيير المخطط يكسر التوافق (مثل حذف أو إعادة تسمية عمود ما لا يزال الكود القديم يستخدمه)، فقد يفشل كلا النهجين. الحل الأكثر أمانًا هو تصميم ترحيل عبر الإنترنت يدعم الإصدارات القديمة والجديدة في الوقت نفسه.
مستخدمي الموبايل قد يبقون على إصدارات قديمة أسابيعًا، لذلك يجب أن يدعم الخادم أجيالًا متعددة من العملاء في الوقت نفسه. هذا يعني عادةً الحفاظ على توافق الـ API لفترة أطول وتجنّب تغييرات تتطلب تحديث جميع العملاء فورًا.
ابدأ بتغييرات إضافية يمكن للتطبيق القديم تجاهلها، مثل إضافة أعمدة قابلة لأن تكون null أو جداول جديدة. ثم انشر كودًا يتعامل مع الأشكال القديمة والجديدة، أعِد ملء البيانات تدريجيًا، غيّر سلوك الكتابة، وبعد ارتفاع تبنّي العملاء أحدث السلوك أزل الحقول القديمة أو شدّد القيود.
أعد قائمة بما ترسله الأجيال القديمة من العملاء وما تتوقعه الاستجابات، ثم تجنّب إزالة الحقول أو تغيير معانيها. فضّل إضافة حقول اختيارية جديدة، تقبل أشكال الطلبات القديمة والجديدة، وأجّل التحقق من «مطلوب» حتى يرتفع معدل التبني.
Dual-write يعني الكتابة إلى المواقع القديمة والجديدة خلال الانتقال، وdual-read يعني القراءة من الحقل الجديد مع الرجوع إلى القديم كاحتياط. اجعل هذا جسرًا مؤقتًا، تتبّع أي مسار يُستخدَم، وخطّط لخطوات تنظيف واضحة بعد تلاشي العملاء القدامى.
تسمح لك feature flags بنشر الكود مع إبقاء السلوك المخاطَر مُعطَّلاً، ثم تفعيله تدريجيًا. إذا ارتفعت الأخطاء، يمكنك إيقاف العلم بسرعة دون إعادة نشر كاملة — مما يفيد في كل من عمليات قطع Blue-Green وتشغيل Canary تدريجيًا.
حذف أو إعادة تسمية أعمدة مبكرًا جدًا، فرض NOT NULL قبل أن يرسل العملاء القيمة، وتشغيل ترحيلات تقفِل جداول كبيرة أثناء ساعات الذروة هي أسباب متكررة. افتراض أن بيانات الاختبار تماثل الإنتاج يؤدي أيضًا إلى فشل عمليات الملء والتحقق.


