تطوير Laravelوقت القراءة: 4 دقيقة

تحديث التطبيقات باستخدام Laravel: الطوابير وعدم التكرار (Idempotency) والترحيل الآمن

حدّث تطبيق PHP قديمًا على مراحل، عبر عمليات كتابة ضمن معاملات، ومهام آمنة عند إعادة المحاولة، وخطة تراجع جرى التدرّب عليها.

معاملة في التطبيق تغذّي طابورًا وعدة عمّال مستقلين

الإجابة المختصرة

رحّل وظيفة تجارية واحدة في كل مرة. احمِ ثوابت قاعدة البيانات بالمعاملات والقيود، واجعل مهام الطوابير آمنة عند إعادة المحاولة، وتحقّق من التسليم والتراجع قبل نقل المسار التالي.

اختر نطاقًا صغيرًا بما يكفي للتحقّق منه

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

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

اجعل عمليات الكتابة الحرجة ضمن معاملة

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

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

لا ترسل المهمة إلا بعد اعتماد البيانات

قد يبدأ العامل في التنفيذ قبل اعتماد المعاملة التي أنشأته. يوفّر Laravel إرسال المهام بعد الاعتماد، حتى لا تقرأ المهام سجلات غير معتمدة أو جرى التراجع عنها. في تطبيق Laravel 12، يبدو النمط الأساسي كما يلي:

DB::transaction(function () use ($validated) {
    $order = Order::create($validated);
    ProcessOrder::dispatch($order->id)->afterCommit();
});

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

صمّم المهام على أساس التنفيذ «مرة واحدة على الأقل»

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

  • حدّد مهلات الانتظار وحدود إعادة المحاولة وفترات التراجع التدريجي بحسب طبيعة كل عملية.
  • اجعل مهلة العامل أقصر من فاصل إعادة المحاولة في الطابور، مع هامش للإيقاف، لتقليل المحاولات المتداخلة.
  • راقب المهام الفاشلة وعمر الطابور؛ فالاستجابة HTTP 202 تعني «مقبول» وليس «مكتمل».
  • أعد تشغيل العمّال طويلي التشغيل أثناء الإصدارات حتى يحمّلوا الشيفرة المقصودة.

تدرّب على الأعطال وعلى التراجع

اختبر وصول Webhook مكرر، وتعطّل عامل بعد استدعاء خارجي، وحالة جمود (Deadlock) في قاعدة البيانات، وتوقّف الطابور، وفشل عملية نشر. تحقّق من السجلات والآثار الجانبية الناتجة، وليس من استجابة HTTP وحدها. أضف آلية مطابقة للأعمال التي قُبلت لكنها لم تكتمل أبدًا.

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

الأسئلة الشائعة

متى ينبغي أن تبقى المعالجة متزامنة؟

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

هل يضمن الإرسال بعد الاعتماد وصول المهمة إلى الطابور؟

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

كيف أمنع إعادة المحاولة من إنشاء مدفوعات أو طلبات مكررة؟

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

ما الذي يسهّل التراجع عن ترحيل تدريجي؟

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

المصادر وقراءات إضافية

تابع القراءة

قارن بين استراتيجيات العرض أو تواصل معنا بشأن الترحيل إلى Laravel.

Paul Edward

بقلم Paul Edward

مطوّر ويب متكامل أول يعمل بـ PHP وLaravel وWordPress وأنظمة ويب مدعومة بالذكاء الاصطناعي.

المزيد عن بول

Leave a Reply

Your email address will not be published. Required fields are marked *

جارٍ تحميل تحقق سريع… (يتطلب JavaScript)

نموذج المشروع الخطوة 1 من 2 · العمل

ما الذي تريد بناءه؟

تكفي فقرة واحدة للبدء. وإن لم يكن العمل مناسبًا لي فسأخبرك بذلك وأدلّك على من هو أنسب.

العمل

اختر كل ما ينطبق.

المنصة

«لا أعرف» إجابة مقبولة تمامًا.

ما الذي تحاول بناءه، وما الذي يجب أن يقدّمه لمن سيستخدمونه؟ اكتبه كما لو كنت تقوله بصوت عالٍ.

0 / 1200

خطوتان. أقل من دقيقة.