شهد إصدار Laravel 13.36 إضافة مهمة تهدف إلى معالجة سلوك اتصالات قاعدة البيانات «اللزجة» (sticky) داخل مهام الـ Queue. تتيح هذه الميزة الجديدة للمطورين إعادة ضبط حالة الاتصالات قبل كل مهمة، مما يضمن استخدام الخوادم المخصصة للقراءة بكفاءة ويمنع توجيه طلبات القراءة إلى خادم الكتابة دون داعٍ.
مشكلة الاتصالات «اللزجة» في الـ Workers
في تطبيقات Laravel التي تقسم حركة مرور قاعدة البيانات بين خادم كتابة واحد وخادم أو أكثر من خوادم القراءة (read replicas)، تعمل خاصية «اللصق» (sticky) على توجيه جميع طلبات القراءة اللاحقة إلى خادم الكتابة بمجرد حدوث عملية كتابة. في طلبات الويب العادية، تستمر هذه الحالة حتى يتم إرسال الاستجابة. لكن في الـ Queue worker، والتي تُشغل عدة مهام متتالية في نفس عملية PHP، كانت هذه الحالة «اللزجة» تستمر بين المهام.
هذا يعني أنه إذا قام worker بمعالجة مهمة تتضمن كتابة بيانات، فإن جميع المهام اللاحقة التي يعالجها نفس الـ worker (حتى لو كانت مهام قراءة فقط) ستستمر في استخدام خادم الكتابة بدلاً من خوادم القراءة. كان هذا الوضع يستمر حتى يتم إعادة تشغيل الـ worker أو الوصول إلى حدوده القصوى، مما يؤدي إلى زيادة الحمل على خادم الكتابة وتناقص كفاءة استخدام خوادم القراءة.
حل Laravel 13.36
لحل هذه المشكلة، أضاف Jack Bayliss خاصية ثابتة جديدة Worker::$flushStickyConnections في Laravel 13.36. عند تعيين هذه الخاصية على true، سيقوم الـ worker باستدعاء الدالة forgetRecordModificationState() على جميع اتصالات قاعدة البيانات المفتوحة قبل معالجة كل مهمة جديدة من الـ Queue. وهذا يضمن أن تبدأ كل مهمة بحالة نظيفة، حيث يتم توجيه طلبات القراءة الأولية إلى خوادم القراءة (replicas).
تُعد هذه الميزة اختيارية (opt-in) وليست مفعلة افتراضياً، حيث يمكن أن تعتمد بعض المهام على قراءة بيانات كتبتها مهمة سابقة في نفس الـ worker قبل أن تصل هذه البيانات إلى خوادم القراءة. نرى أن المهام التي تعتمد على بعضها البعض بهذه الطريقة يجب أن تُصمم كسلاسل (chains) أو دفعات (batches) لضمان التسلسل الصحيح.
ملاحظات مهمة على استخدام الميزة
إذا كنت تستخدم database queue driver، فمن المهم الانتباه إلى الاتصال الذي يستخدمه. فعملية حجز المهمة نفسها تتطلب تحديثاً على جدول المهام، مما قد يعيد تعيين حالة «اللصق» بعد إعادة الضبط مباشرة. لحل هذه المشكلة، يمكن توجيه database queue driver لاستخدام اتصال قاعدة بيانات منفصل مخصص له، أو اتصال يستخدم خادم الكتابة فقط، وذلك عبر متغير البيئة DB_QUEUE_CONNECTION.
يمكن للمطورين أيضاً استدعاء forgetRecordModificationState() يدوياً في أي كود طويل الأمد يعالج عدة دورات عمل، مثل أوامر Artisan المخصصة. كما توفر الدالة DB::hasModifiedRecords() وسيلة للتحقق من الحالة الحالية للعلامة «اللزجة»، وهو أمر مفيد عند اختبار سلوك الاتصالات.
بالنسبة للمطورين، تعني هذه الميزة تحكماً أفضل في كيفية إدارة اتصالات قاعدة البيانات داخل الـ Queue workers. من خلال تفعيل Worker::$flushStickyConnections، يمكن تحسين أداء التطبيقات التي تعتمد بشكل كبير على الـ Queues، وتقليل الضغط غير الضروري على خوادم الكتابة، وضمان الاستفادة الكاملة من خوادم القراءة. هذا يمكن أن يؤدي إلى استهلاك موارد أقل، وتحسين سرعة معالجة المهام، وبالتالي تجربة مستخدم أفضل.
المصدر: laravel-news.com