تخطَّ إلى المحتوى
كل الرؤى

إصلاح مشكلة "جدولة فائتة" عندما يعمل cron ووردبريس خلف موازن الأحمال Load Balancer

Jaafar Abazid

WordPress AWS WP-CLI Cron
تشغيل كرون ووردبريس بموثوقية خلف موازن الأحمال، رؤى ManTek

نسخة عربية مختصرة. أما المقال الكامل باللغة الإنجليزية، متضمناً المخططين، فيمكنك الاطلاع عليه، هنا.

في غرفة الأخبار، تمت جدولة نشر الخبر الرئيسي عند السادسة صباحاً. وعند السادسة وخمس دقائق، لم يكن الخبر قد ظهر على الصفحة الرئيسية. لم يكن خطأ أحدهم: كُتب المقال، وحُدد موعد نشره، وحُفظ، ثم جاء وقت النشر ومضى. لا رسالة خطأ، ولا مهمة فاشلة، ولا أي سجل يشير إلى مشكلة. كل ما تراه هو المقال في قائمة، وبجواره عبارة صغيرة باللون الرمادي: جدولة فائتة Missed schedule، وكأنه قرر بصمت ألا يُنشر.

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

السبب: إنّ wp-cron ليس Cron حقيقياً؛ فهو يعتمد على طلب HTTP يُرسل عند تحميل الصفحات. والحيلة الشائعة، المتمثلة في تعطيل الحلقة الداخلية باستخدام DISABLE_WP_CRON ثم استدعاء wp-cron.php من خلال Shell أو Lambda، لا تزال في جوهرها مجرد طلب HTTP. لكن خلف موازن الأحمال Load Balancer والـ CDN، قد يُجاب عن هذا الطلب من ذاكرة الكاش دون أن يعمل PHP إطلاقاً، أو قد يُوجَّه إلى خادم في طور الإخراج من الخدمة. وبذلك يبدو وكأن Cron قد بدأ عمله، بينما لم يُنجز شيئاً، في حين أن المقال المجدول لا يهمه سوى أن تكتمل عملية النشر في موعدها.

الحل: شغّل Cron على الخادم نفسه باستخدام WP-CLI (wp cron event run)، ودون إرسال أي طلب HTTP، بحيث لا تستطيع ذاكرة الكاش إخفاءه ولا يستطيع موازن الأحمال توجيهه إلى المسار الخطأ. ثم، عند تشغيل ووردبريس على مجموعة من الخوادم، شغّل المهمة على جميع العقد حتى لا يعتمد النظام على خادم واحد قد يتوقف، وضع أمام التنفيذ قفلاً مشتركاً Shared Lock، مثل Advisory Lock في MySQL باستخدام GET_LOCK، أو مفتاحاً في Redis، بحيث لا ينفذ الأحداث المجدولة في كل دقيقة إلا خادم واحد فقط. والأهم من ذلك كله، أضف مراقباً Watcher يسجل كل تشغيل ناجح، ويطلق تنبيهاً فور توقف الـ Cron، لتحويل العطل الصامت إلى إنذار واضح.

لقد جمعنا كل ذلك في إضافة مفتوحة المصدر باسم wp-fleet-cron، مرخصة بموجب GPL، ومتاحة على GitHub وPackagist، بالإصدار 0.9.0:

composer require mantekio/wp-fleet-cron

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

هل هناك ما يدور في عقلك؟

سواء كنت تبحث عن حل لمشكلة ما أو تبني نظاماً يدوم للمستقبل، أخبرنا بما تعمل عليه، يسرّنا أن نساعدك.