تخيّل متجراً يرسل آلاف الإيميلات، أو تطبيقاً يعالج آلاف الصور، أو نظاماً يولّد تقارير ضخمة. لو نفّذ الموقع هذه المهام أثناء طلب المستخدم، لتجمّد وانتظر الزائر طويلاً. الحلّ هو الطوابير (Queues): تضع المهام الثقيلة في طابور ويعالجها عمّال في الخلفية، فيبقى الموقع سريعاً. وأداة إدارة هذه الطوابير في Laravel هي Laravel Horizon فوق Redis. في هذا الدليل نشرح كيف تعالج ملايين المهام دون إبطاء موقعك — ونثبت ذلك باختبار حقيقي على خادم مرام.

كيف تعالج Laravel Horizon المهام الثقيلة في الخلفية دون إبطاء الموقع
الموقع يدفع المهمة إلى طابور Redis، وعمّال Horizon يعالجونها بعيداً عن دورة الطلب.

لماذا الطوابير أصلاً؟

كل مهمة تستغرق وقتاً (إرسال بريد، معالجة صورة، نداء API خارجي) يجب ألا تُنفَّذ داخل دورة الطلب، لأن المستخدم سينتظرها. الطوابير تفصل هذه المهام: يستجيب الموقع فوراً بعد وضع المهمة في الطابور، ويتولّى العمّال (Workers) تنفيذها لاحقاً في الخلفية. النتيجة: تجربة سريعة للمستخدم مهما ثقُلت المهام.

كيف يعمل النظام

كما في المخطط أعلاه، تمرّ المهمة بثلاث محطات: يدفعها الموقع (dispatch) إلى طابور Redis، ثم يلتقطها أحد العمّال ويعالجها، بينما يكون الموقع قد ردّ على المستخدم منذ لحظة الدفع. Redis هنا هو المخزن السريع للطابور، وLaravel Horizon هو من يدير العمّال ويراقبهم.

ما هو Laravel Horizon؟

Laravel Horizon هو مدير طوابير رسمي من Laravel يعمل فوق Redis، ويمنحك:

  • لوحة تحكّم بصرية: ترى المهام الجارية والفاشلة ومعدّل المعالجة والزمن لحظياً.
  • إدارة العمّال تلقائياً: يشغّل العمّال ويوازن عددهم حسب الحِمل (balance).
  • مراقبة الفشل: يتتبّع المهام الفاشلة ويتيح إعادة تشغيلها.
  • مقاييس (Metrics): إنتاجية وزمن انتظار لكل طابور.
اقرأ أيضاً: التعامل مع التزامن العالي: Redis والطوابير ومعالجة المهام

الإعداد الأساسي

الإعداد بسيط. ثبّت Horizon، واجعل Redis محرّك الطوابير في .env، ثم شغّل Horizon:

composer require laravel/horizon
php artisan horizon:install

# في .env
QUEUE_CONNECTION=redis

# تشغيل مدير الطوابير
php artisan horizon

لدفع مهمة إلى الطابور من كودك، تكفي سطر واحد — والموقع يتابع فوراً دون انتظار تنفيذها:

// إرسال بريد ثقيل دون إبطاء الاستجابة
ProcessPodcast::dispatch($podcast);

// أو مع تأخير
SendInvoice::dispatch($order)->delay(now()->addMinutes(5));
⚠️ في الإنتاج، شغّل Horizon تحت Supervisor ليبقى يعمل دائماً ويُعاد تشغيله تلقائياً عند التعطّل — كما في دليل نشر Laravel لدينا.

دورة حياة المهمة: Retries وFailed Jobs

ماذا يحدث حين تفشل مهمة (انقطاع API مثلاً)؟ هنا تتجلّى قوة النظام:

دورة حياة مهمة Laravel: من الطابور إلى النجاح أو إعادة المحاولة والمهام الفاشلة
المهمة تمرّ بالطابور ثم المعالجة؛ عند الفشل تُعاد تلقائياً، وإن استمرّ الفشل تُسجَّل كمهمة فاشلة.
  • إعادة المحاولة (Retries): حدّد عدد المحاولات بـ--tries=3، فتُعاد المهمة تلقائياً عند الفشل.
  • التراجع التدريجي (Backoff): اجعل الفواصل بين المحاولات تتزايد لتجنّب إغراق خدمة معطّلة.
  • المهام الفاشلة (Failed Jobs): بعد استنفاد المحاولات، تُسجَّل المهمة في جدول failed_jobs، فتفحصها وتعيد تشغيلها بـphp artisan queue:retry.

توزيع العمّال على عدة Nodes

حين تتجاوز مهامك طاقة خادم واحد، توسّع أفقياً: شغّل Laravel Horizon على عدة خوادم (Nodes)، وكلها تسحب من نفس طابور Redis المركزي. يوزّع النظام المهام بينها تلقائياً، فتضاعف معدّل المعالجة بمجرد إضافة عامل أو خادم جديد. هذا يجعل البنية قابلة للتوسّع بلا حدود عملياً: كلّما زاد الحِمل، أضفت Nodes.

✅ اعزل الطوابير حسب الأولوية: طابور high للمهام العاجلة (إشعارات) وطابور low للثقيلة (تقارير)، ووجّه عمّالاً أكثر للطابور المهمّ.

اختبار Laravel Horizon: 30,000 مهمة

لنثبت ذلك عملياً: على خادم VPS من مرام، أنشأنا 30,000 مهمة ودفعناها إلى طابور Redis، ثم شغّلنا Laravel Horizon وقِسنا كم يعالج — والأهمّ: هل يتباطأ الموقع أثناء ذلك؟

نتيجة اختبار Laravel Horizon الحقيقي: 30,000 مهمة والموقع بقي سريعاً
النتيجة الفعلية: عولجت 30,000 مهمة بمعدّل ~667/ثانية بينما بقي زمن استجابة الموقع 23 مللي ثانية.

النتيجة حاسمة: عالج Horizon 30,000 مهمة في 45 ثانية (نحو 667 مهمة/ثانية) بصفر فشل — وبقي زمن استجابة الموقع أثناء هذه المعالجة الكثيفة عند 23 مللي ثانية فقط. أي أن المستخدمين لم يتأثّروا إطلاقاً. وبهذا المعدّل يعالج خادم واحد مليون مهمة في نحو 25 دقيقة، ويمكن اختصارها أضعافاً بإضافة عمّال أو Nodes.

⚠️ شفافية: استخدمنا مهاماً خفيفة لقياس طاقة النظام نفسه؛ المهام الحقيقية (تتضمّن قاعدة بيانات أو نداءات خارجية) أبطأ لكل مهمة، لكن المبدأ ثابت: الموقع يبقى سريعاً، والإنتاجية تتوسّع بزيادة العمّال والـNodes.
اقرأ أيضاً: بنشمارك Laravel Octane: أسرع محرّك لتطبيقك

الخلاصة

Laravel Horizon مع طوابير Redis هو الحلّ الاحترافي لمعالجة المهام الثقيلة دون إبطاء موقعك: تدفع المهام إلى الطابور، ويعالجها العمّال في الخلفية مع إعادة محاولة ذكية وإدارة للمهام الفاشلة، وتتوسّع أفقياً عبر عدة Nodes. أثبت اختبارنا الحقيقي أن خادماً واحداً يعالج مئات المهام في الثانية والموقع لا يتباطأ. ابدأ بطابور واحد، وأضِف العمّال والـNodes كلّما نما تطبيقك. للتعمّق راجع توثيق Laravel Horizon الرسمي.

من واقع مرام

نشغّل Horizon والطوابير على خوادمنا فعلياً — والأرقام في هذا المقال مقاسة على عتاد مرام. نساعدك في إعداد Redis وHorizon وSupervisor وتوزيع العمّال على VPS بأداء NVMe ودعم عربي يفهم Laravel.

طوابير سريعة لموقع لا يتباطأ

خوادم VPS من مرام مع Redis جاهز لـLaravel Horizon — أداء عالٍ وقابلية توسّع ودعم عربي.

شغّل طوابيرك على VPS مرام ←