نشر Canary مع PHP: تحديثات آمنة بدون قلق
\n\nكل مطور يعرف هذا الشعور: تنشر نسخة جديدة على الإنتاج، تحبس أنفاسك وتتمنى ألا ينهار كل شيء. وإذا انهار - ستكون أول من يعلم عندما يسقط الخادم تحت ضغط آلاف المستخدمين.
\n\nلكن هناك طريقة أذكى. نشر Canary (النشر التدريجي) هو أسلوب يتم فيه إرسال النسخة الجديدة من التطبيق أولاً إلى مجموعة صغيرة من المستخدمين، ثم إذا كان كل شيء على ما يرام، يتم نشرها تدريجياً للجميع. الاسم مشتق من عمال المناجم القدماء الذين كانوا يأخذون معهم طيور الكناري: إذا صمت الطائر - كان هناك غاز في المنجم. في حالتنا، "الكناري" هو أول 5-10% من حركة المرور التي تختبر قوة الكود.
\n\nفي هذه المقالة، سأوضح لك كيفية تنفيذ نشر Canary في PHP باستخدام أمثلة كود حقيقية، وموازن حركة المرور، وأدوات المراقبة. ستتعلم كيفية تحديث التطبيق بدون توقف، والتراجع السريع عن التغييرات، وإجراء اختبار A/B بدون ألم.
\n\nلماذا Canary ليس مجرد كلمة رنانة؟
\n\nالنشر التقليدي (blue-green أو rolling update) يعمل، لكن له عيوب:
\n- \n
- Blue-green يتطلب بنية تحتية مزدوجة - مكلف وليس مبرراً دائماً. \n
- Rolling update يحدث الخوادم واحداً تلو الآخر، لكن إذا كان هناك خطأ في الكود - سيصل للجميع في النهاية. \n
- Feature flags جيدة، لكنها لا تحل مشكلة الأداء أو الأخطاء التي تظهر فقط تحت الضغط. \n
نشر Canary يحل هذه المشاكل بأناقة: ترسل الكود الجديد إلى 5-10% من المستخدمين، تراقب المقاييس (الأخطاء، زمن الاستجابة، استخدام المعالج)، وإذا كان كل شيء جيداً - تزيد النسبة. إذا لم يكن - فقط ترجع هذه الـ 5%.
\n\nبالنسبة لـ PHP، هذا مهم بشكل خاص لأن العديد من المشاريع تعمل على استضافة مشتركة أو VPS بدون منسق معقد. لكن حتى على خادم عادي مع nginx يمكنك إعداد canary - وسأوضح لك كيف.
\n\nمعمارية نشر Canary لتطبيق PHP
\n\nتخيل أن لدينا تطبيق PHP نموذجي على Laravel أو Symfony يعمل خلف nginx. لتنفيذ canary، سنحتاج إلى:
\n\n- \n
- نسختين من التطبيق - مستقرة (stable) وجديدة (canary). \n
- موازن - nginx، الذي سيوجه جزءاً من حركة المرور إلى canary. \n
- آلية التبديل - عبر الكوكيز، عنوان IP، أو الرؤوس. \n
- مراقبة - لمعرفة أن canary يعمل بشكل طبيعي. \n
إليك المخطط الأساسي:
\n\nمستخدم → nginx (موازن) → stable (80% من الحركة)\n → canary (20% من الحركة)\n\nلكن يمكننا أن نكون أذكى: مثلاً، توجيه المستخدمين الذين لديهم كوكيز معينة فقط إلى canary. بهذه الطريقة يمكننا الاختبار على مجموعة محددة (مثل موظفي الشركة).
\n\nالخطوة 1: إعداد nginx لـ canary
\n\nNginx هو الأداة المثالية لـ canary، لأنه يستطيع توزيع حركة المرور على مستوى upstream والتحقق من الرؤوس. إليك مثال على الإعداد:
\n\nupstream php_stable {\n server 127.0.0.1:9001;\n}\n\nupstream php_canary {\n server 127.0.0.1:9002;\n}\n\nserver {\n listen 80;\n server_name example.com;\n\n location / {\n # إذا كان هناك كوكيز canary=1 - أرسل إلى canary\n if ($http_cookie ~* "canary=1") {\n set $upstream "php_canary";\n }\n\n # وإلا - عشوائياً 10% من الحركة إلى canary\n if ($upstream = "") {\n set $rand $request_id;\n set $modulo 10;\n if ($rand ~* "^[0-9a-f]{1}$") {\n set $upstream "php_canary";\n }\n if ($upstream = "") {\n set $upstream "php_stable";\n }\n }\n\n pro