Laravel · طوابير المعالجة

Laravel Queues: إعادة المحاولة والمعاملات وتنفيذ المهام بأمان

قرارات عملية لبناء Laravel Jobs موثوقة، من توقيت الإرسال بعد المعاملة إلى المهام القابلة للإعادة والمراقبة وإدارة الفشل.

المسار المرتبطواجهات API وSaaS ومعمارية الأنظمة
مهام منظّمة تمر عبر محطات معالجة، لتوضيح الطوابير الخلفية.
تصوّر بصري للفكرة — يتبعه شرح ومخطط تنفيذي داخل المقال.

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

اختر حدودًا واضحة للمهمة

اجعل لكل Job مسؤولية يمكن وصفها بجملة، ومدخلات قابلة للتتبّع. بدل تمرير طلب HTTP كامل أو نموذج ضخم، مرّر معرّف السجل والعميل وإصدار العملية عند الحاجة. عند التنفيذ، اقرأ الحالة الحالية وتحقّق أن المهمة ما زالت مطلوبة. طلب تصدير ألغاه المستخدم قبل بدء العامل لا ينبغي أن يستهلك موارد كبيرة دون فحص.

أرسل بعد تثبيت المعاملة

إذا أنشأت طلبًا داخل transaction ثم أرسلت مهمة مباشرة، قد يحاول العامل قراءة سجل لم يصبح مرئيًا بعد. يوفّر Laravel خيار after_commit وإمكانية afterCommit للمهمة. هذا يضبط توقيت الإرسال، لكنه لا يحوّل قاعدة البيانات والـbroker إلى معاملة موزّعة واحدة. العمليات التي لا تتحمّل فقد الإرسال قد تحتاج outbox محفوظًا مع بيانات العمل.

DB::transaction(function () use ($order) {
    $order->update(['status' => 'confirmed']);
    SendOrderConfirmation::dispatch($order->id)->afterCommit();
});

صمّم التنفيذ كي يقبل الإعادة

تخيّل مهمة إنشاء شحنة: المزوّد أنشأها لكن الاتصال انقطع قبل وصول الرد. إعادة الطلب بلا مفتاح ثابت قد تنشئ شحنتين. خزّن operation_id قبل التنفيذ واستخدمه كمفتاح idempotency إذا كان التكامل يدعمه. إن لم يدعمه، ابحث عن مرجع الشحنة أو أضف مسار مصالحة بدل إعادة الطلب بشكل أعمى. قفل unique job يقلّل التكرار في ظروف محددة، لكنه ليس بديلًا عن حماية الأثر التجاري.

المحاولة الفاشلة تعود لمسار الانتظار، مع حماية الأثر من التكرار.
المحاولة الفاشلة تعود لمسار الانتظار، مع حماية الأثر من التكرار. اضغط لعرض أكبر

اضبط المهلات وفق النظام كاملًا

يجب تنسيق مهلة العامل ومدة إعادة إتاحة الرسالة ووقت الاتصال الخارجي. إذا عادت الرسالة إلى الطابور بينما العامل الأول ما زال ينفّذ، قد يبدأ عامل آخر المهمة نفسها. اختر backoff متدرّجًا للأخطاء المؤقتة، وحدًا لعدد المحاولات. أخطاء البيانات الدائمة تحتاج تصحيحًا أو تدخّلًا، لا مئات المحاولات المتطابقة.

قسّم التصديرات الكبيرة

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

ضع التشغيل ضمن تعريف الاكتمال

راقب زمن الانتظار وزمن التنفيذ والفشل وعمر أقدم مهمة. اربط job_id بمعرّف الطلب وسجل العملية. عند النشر، تأكّد من إعادة تشغيل العمال بالطريقة الملائمة لتشغيل الكود الجديد. معيار النجاح ليس أن المهمة اشتغلت مرة؛ بل أن إعادتها وإيقافها ونشر نسخة جديدة أثناءها لا يفسد نتيجة المستخدم.

سيناريو عملي: تصدير كبير قابل للاستئناف

قسّم التصدير إلى دفعات مرتبطة بطلب واحد، واحفظ معرّف آخر سجل أو نطاق الدفعة بحسب استراتيجية القراءة. لا تجعل اسم الملف النهائي متاحًا بينما بعض أجزائه لم يكتمل. يمكن كتابة الأجزاء في مساحة مؤقتة، ثم اعتماد النتيجة بعد التحقّق من اكتمالها. إذا أعيدت دفعة، يجب أن تستبدل الجزء الخاص بها أو تتعرّف على اكتماله، بدل إضافة الصفوف مرة ثانية إلى الملف نفسه.

قرار الاستئناف أو إعادة البداية

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

المراجع الرسمية

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

إعداد: Noor Yasser

من القرار إلى التنفيذ

تعمل على تحدٍ تقني مشابه؟

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

احجز لقاءً لمدة ٣٠ دقيقةالخدمة المرتبطةهندسة الأنظمة الخلفية وتكاملات APIمشروع من الأعمالمنصة اللوجستيات