نشر الكناري مع 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
الكناري هي الاستراتيجية الوحيدة التي تسمح لك باختبار A/B للإصدار الجديد على مستخدمين حقيقيين دون مخاطرة للجميع. هذا مهم بشكل خاص للخدمات المصغرة Java، حيث يمكن لخطأ واحد أن يسبب فشلًا متتاليًا.
\n\nكيف يعمل هذا في Java؟ البنية التقنية
\n\nلنتخيل نظام Java نموذجي: تطبيق Spring Boot يخدم REST API. لتنفيذ الكناري، نحتاج إلى:
\n\n- \n
- توجيه التدفق: توجيه جزء من الطلبات إلى الإصدار الجديد (v2)، والباقي إلى الإصدار القديم (v1). \n
- المقاييس والمراقبة: جمع الأخطاء، والتأخيرات، وعدد الطلبات. \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السلبيات: لا يوجد أتمتة - يتم تغيير الأوزان يدويًا أو عبر API.
مثال 2: الكناري مع Kubernetes و Istio (متقدم)
\n\nهذا هو المعيار الذهبي للخدمات المصغرة Java. نستخدم Istio VirtualService
المدونات
توصيات الكتب
اقرأ أيضًا