لارافيل, Others / 2025-10-31

قفزة نوعية في أداء Laravel: تفعيل الـ Deferred Queue لتنفيذ المهام بالخلفية بدون Workers

قفزة نوعية في أداء Laravel: تفعيل الـ Deferred Queue لتنفيذ المهام بالخلفية بدون Workers

2025-10-31 وقت القراءه : 2 دقائق

عند تنفيذ مهام بسيطة في الخلفية - كإرسال رسائل البريد الإلكتروني أو تحديث سجلات الدخول - يضطر المطورون عادةً إلى الاعتماد على قوائم انتظار خارجية مثل Redis أو SQS. لكن في الإصدار Laravel 12.35، قُدِمت ميزة Deferred Queue كحل مبتكر لتحسين الأداء. يكمن جوهر هذه الميزة في معالجة الوظائف المؤجلة مباشرة بعد إرسال استجابة HTTP، مما يضمن سرعة فورية للمستخدم.


ما فكرة الـ Deferred Queue؟

الفكرة ببساطة:

يقوم Laravel بتأجيل تنفيذ بعض المهام إلى ما بعد إرسال استجابة HTTP إلى المستخدم.

لنتخيل السيناريو التالي:

الخطوة العاجلة: حفظ الطلب في قاعدة البيانات (يجب أن يتم فورًا).

الخطوة المؤجلة: إرسال بريد تأكيد الطلب للعميل (يمكن تنفيذه بعد لحظات).

في الوضع التقليدي، كان المستخدم ينتظر حتى يتم إرسال البريد الإلكتروني قبل أن يحصل على الرد.

أما مع Deferred Queue:

تُنفَّذ الخطوة العاجلة.

يُرسل الرد للمستخدم ("تمت عملية الشراء بنجاح ✅").

بعد إرسال الاستجابة، يبدأ Laravel في تنفيذ البريد المؤجل بالخلفية.

النتيجة: المستخدم يحصل على تجربة أسرع، وتُنفَّذ المهمة في الخلفية دون تعقيد.



كيف تستخدم Deferred Queue عمليًا؟

1️⃣ الإعداد (خطوة واحدة)

في ملف config/queue.php أضف الاتصال الجديد:

'connections' => [
    // ...
    'deferred' => [
        'driver' => 'deferred', // هذا هو المفتاح!
    ],
],



2️⃣ إرسال المهمة (Job Dispatching)

في أي مكان داخل التطبيق:

RecordDelivery::dispatch($order)->onConnection('deferred');

الشرح:

RecordDelivery::dispatch($order)

— مهمة تسجّل عملية تسليم الطلب.

->onConnection('deferred') 

— يخبر Laravel أن يُنفّذ المهمة بعد إرسال الاستجابة.




Job Dispatching (قبل وبعد استخدام Deferred Queue)

بعد إعداد الاتصال في config/queue.php وتحديده في .env،

دعنا نرى كيف يتغير تنفيذ المهام (Jobs) قبل وبعد استخدام ميزة Deferred Queue.

قبل إضافة Deferred Queue

في الوضع الافتراضي، يتم تنفيذ الـ Job عبر Default Queue Connection (مثل database أو sync):

RecordDelivery::dispatch($order);

في هذه الحالة، يتم إرسال الـ Job إلى نظام الانتظار المحدد في الإعدادات (مثلاً: QUEUE_CONNECTION=sync أو database).

يعني ذلك أن تنفيذ المهمة قد يحدث قبل أو أثناء إرسال HTTP Response —

أي أن المستخدم قد ينتظر حتى تنتهي المهمة.


بعد إضافة Deferred Queue

الآن، بعد تعريف Deferred Driver، يمكننا توجيه Laravel لتنفيذ نفس الـ Job

ولكن بعد إرسال الاستجابة للمستخدم مباشرة:

RecordDelivery::dispatch($order)->onConnection('deferred');

التحليل:

الكود    التنفيذ    تجربة المستخدم

RecordDelivery::dispatch($order)

    التنفيذ الفوري أو عبر Queue Worker    المستخدم ينتظر زمن أطول

RecordDelivery::dispatch($order)->onConnection('deferred')

    التنفيذ بعد إرسال الـ HTTP Response في نفس الـ PHP Process



حالات الاستخدام المثالية

إرسال بريد ترحيبي 

   (new SendWelcomeEmail($user))->onConnection('deferred')

   المستخدم لا ينتظر الاتصال بخادم البريد.


تسجيل تحليلات (Analytics) 

Analytics::logAction()->onConnection('deferred')  

  يتم حفظ النشاط دون التأثير على سرعة التصفح.



إطلاق Webhooks بسيطة  

  (new SendWebhook($event))->onConnection('deferred')  

  إشعار الأنظمة الخارجية بعد أن يرى المستخدم تأكيد العملية.



متى لا يُنصح باستخدامها؟

المهام الطويلة أو الثقيلة

مثل معالجة فيديوهات، ضغط صور، أو استيراد ملفات ضخمة.

→ استخدم Redis أو Database Queue مع Workers بدلاً من ذلك.


 المهام الحساسة التي تحتاج ضمان التنفيذ الكامل (Reliability)

لأنّ العملية المؤجلة تعتمد على نفس تنفيذ PHP؛

فإذا أُغلِقت العملية أو فشلت فجأة، قد لا تُنفَّذ المهمة.

إضافة تعليق
Loading...