نشر الكناري مع Java: نشر آمن دون خوف

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

نشر الكناري مع Java: كيفية إصدار إصدارات جديدة دون مخاطر على بيئة الإنتاج

\n\n

تخيل: أنت قبطان غواصة. تحتاج إلى اختبار سونار جديد، لكن لا يمكنك ببساطة تشغيله بكامل طاقته - فقد يعمي الفريق بأكمله، أو الأسوأ من ذلك، يعطي إنذارًا كاذبًا. ماذا تفعل؟ تطلق كناريًا (طائرًا كان في الأزمنة القديمة يحذر عمال المناجم من تسرب الغاز). إذا كان الطائر على قيد الحياة - فالنظام بخير.

\n\n

في عالم تطوير Java، يُسمى هذا المبدأ نشر الكناري. إنها استراتيجية يتم فيها إرسال الإصدار الجديد من التطبيق أولاً إلى نسبة صغيرة من المستخدمين (عادةً 1-5%). إذا كان كل شيء على ما يرام - يزداد التدفق تدريجيًا. إذا لم يكن كذلك - نتراجع دون كارثة.

\n\n

في هذه المقالة، سنشرح كيفية تنفيذ نشر الكناري في Java بأمثلة واقعية: من التكوينات البسيطة إلى التقنيات المتقدمة مع Kubernetes و Spring Cloud. هيا بنا!

\n\n

لماذا الكناري وليس blue-green أو rolling update؟

\n\n

دعنا نقارن بسرعة ثلاث استراتيجيات نشر شائعة:

\n\n
    \n
  • Blue-Green: لديك بيئتان متطابقتان (زرقاء وخضراء). تقوم بتحويل كل التدفق مرة واحدة. سريع، ولكن إذا ظهر خطأ - سيتأثر الجميع.
  • \n
  • Rolling update: تقوم بتحديث الـ pods/الخوادم واحدًا تلو الآخر. أبطأ، ولكنه أيضًا شامل.
  • \n
  • الكناري: تقوم بتوجيه الإصدار الجديد فقط إلى 2% من المستخدمين. إذا لم يشتكوا - توسع إلى 10%، ثم إلى 50%، ثم إلى 100%.
  • \n
\n\n

الكناري هي الاستراتيجية الوحيدة التي تسمح لك باختبار A/B للإصدار الجديد على مستخدمين حقيقيين دون مخاطرة للجميع. هذا مهم بشكل خاص للخدمات المصغرة Java، حيث يمكن لخطأ واحد أن يسبب فشلًا متتاليًا.

\n\n

كيف يعمل هذا في Java؟ البنية التقنية

\n\n

لنتخيل نظام Java نموذجي: تطبيق Spring Boot يخدم REST API. لتنفيذ الكناري، نحتاج إلى:

\n\n
    \n
  1. توجيه التدفق: توجيه جزء من الطلبات إلى الإصدار الجديد (v2)، والباقي إلى الإصدار القديم (v1).
  2. \n
  3. المقاييس والمراقبة: جمع الأخطاء، والتأخيرات، وعدد الطلبات.
  4. \n
  5. التراجع التلقائي: إذا تجاوزت نسبة الأخطاء الحد - نتراجع عن الكناري.
  6. \n
  7. الزيادة التدريجية: إذا كان كل شيء على ما يرام - نزيد وزن الكناري.
  8. \n
\n\n

أسهل طريقة للقيام بذلك هي استخدام Kubernetes مع Service Mesh (مثل Istio) أو Spring Cloud Gateway مع أوزان التوجيه. فيما يلي أمثلة لكلا النهجين.

\n\n

مثال 1: الكناري مع Spring Cloud Gateway (بدون Kubernetes)

\n\n

إذا لم يكن لديك Kubernetes ولكن لديك Spring Cloud، يمكنك استخدام Spring Cloud Gateway مع تكوين الأوزان. إليك كيف يبدو ذلك:

\n\n
// application.yml\nspring:\n  cloud:\n    gateway:\n      routes:\n        - id: my-app-canary\n          uri: http://my-app-v2:8080\n          predicates:\n            - Weight=my-app, 10   # 10% من التدفق\n          filters:\n            - SetPath=/api/v2/**\n        - id: my-app-stable\n          uri: http://my-app-v1:8080\n          predicates:\n            - Weight=my-app, 90   # 90% من التدفق\n          filters:\n            - SetPath=/api/v1/**\n
\n\n

هنا نستخدم المسند Weight - ميزة مدمجة في Spring Cloud Gateway. يقوم بتوزيع الطلبات عشوائيًا بنسبة 10/90. إذا كان v2 يعمل بثبات، نغير الوزن إلى 50/50، ثم إلى 100/0.

\n\n

الإيجابيات: بسيط، لا يتطلب أدوات خارجية.
\nالسلبيات: لا يوجد أتمتة - يتم تغيير الأوزان يدويًا أو عبر API.

\n\n

مثال 2: الكناري مع Kubernetes و Istio (متقدم)

\n\n

هذا هو المعيار الذهبي للخدمات المصغرة Java. نستخدم Istio VirtualService

المدونات

توصيات الكتب