طوابير الرسائل والمهام الخلفية لتطبيقات الويب

Backend2026-09-17TryQuickToolBox

لماذا يحتاج تطبيق الويب الخاص بك إلى مهام خلفية

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

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

المفاهيم الأساسية: الطوابير والمنتجون والمستهلكون

في أبسط صوره، طابور الرسائل هو مخزن مؤقت يحتفظ بالرسائل حتى يسترجعها المستهلك. المكونات هي:

غالبًا ما يسمى هذا النمط المنتج-المستهلك أو النشر-الاشتراك (إذا كان بإمكان عدة مستهلكين العمل على نفس الرسالة). الفائدة الرئيسية هي الفصل: لا يحتاج المنتج إلى معرفة من يعالج المهمة أو كم من الوقت تستغرق.

حالات الاستخدام الشائعة للمهام الخلفية

المهام الخلفية مثالية لأي مهمة لا يُطلب إكمالها قبل إرسال استجابة للمستخدم. تشمل الأمثلة النموذجية:

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

اختيار الأداة المناسبة للمهمة

يعتمد طابور الرسائل المناسب على حجمك واحتياجاتك من الموثوقية ومكدسك الحالي. إليك مقارنة للخيارات الشائعة:

الأداة الأفضل لـ الاستمرارية التعقيد
Redis (مع RQ، Bull، Celery) طوابير بسيطة وسريعة؛ نطاق صغير إلى متوسط اختياري (يمكن الاستمرار على القرص) منخفض
RabbitMQ توجيه معقد، تسليم مضمون، موثوقية عالية نعم متوسط
Apache Kafka تدفق أحداث عالي الإنتاجية، تجميع السجلات نعم عالي
AWS SQS مُدار بالكامل، بدون خادم، الدفع حسب الاستخدام نعم منخفض
مدعوم بقاعدة بيانات (مثل PostgreSQL SKIP LOCKED) البساطة، لا بنية تحتية إضافية نعم منخفض

بالنسبة للعديد من تطبيقات الويب، البدء بـ Redis أو طابور مدعوم بقاعدة بيانات كافٍ. مع نموك، يمكنك الانتقال إلى وسيط أكثر قوة مثل RabbitMQ أو Kafka.

تنفيذ المهام الخلفية: دليل خطوة بخطوة

دعنا نستعرض تنفيذًا أساسيًا باستخدام Python و Celery و Redis. تنطبق نفس المبادئ على المكدسات الأخرى (مثل Node.js مع Bull، Ruby مع Sidekiq، Go مع Machinery).

1. إعداد Redis و Celery

قم بتثبيت Redis ومكتبة Celery. قم بتكوين Celery لاستخدام Redis كوسيط وخلفية للنتائج.

# تثبيت التبعيات
pip install celery redis

# بدء خادم Redis (إذا لم يكن قيد التشغيل بالفعل)
redis-server

2. تعريف تطبيق Celery

أنشئ ملف tasks.py يقوم بتهيئة Celery ويعرف مهمة خلفية.

from celery import Celery

app = Celery('tasks', broker='redis://localhost:6379/0')

@app.task
def send_welcome_email(user_id):
    # محاكاة إرسال بريد إلكتروني
    print(f"Sending welcome email to user {user_id}")
    # في الإنتاج، التكامل مع خدمة بريد إلكتروني
    return f"Email sent to user {user_id}"

3. إضافة مهمة من تطبيق الويب الخاص بك

في إطار عمل الويب الخاص بك (مثل Flask، Django)، استدعِ المهمة بشكل غير متزامن. طريقة .delay() تضيف المهمة إلى الطابور وتعيد فورًا.

from tasks import send_welcome_email

@app.route('/signup', methods=['POST'])
def signup():
    # ... إنشاء مستخدم في قاعدة البيانات ...
    send_welcome_email.delay(user_id=123)
    return {"status": "success"}, 202

4. تشغيل عمليات العمال

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

celery -A tasks worker --loglevel=info

الآن، عندما يسجل مستخدم، يعيد تطبيق الويب استجابة 202 Accepted فورًا، ويرسل العامل البريد الإلكتروني في الخلفية.

أفضل الممارسات للمهام الخلفية الموثوقة

تقدم المهام الخلفية أنماط فشل جديدة. اتبع هذه الممارسات للحفاظ على قوة نظامك:

توسيع نظام المهام الخلفية الخاص بك

مع نمو تطبيقك، ستحتاج إلى توسيع كل من الطابور والعمال. تشمل الاستراتيجيات:

تذكر أن إضافة العمال تزيد من التزامن، مما قد يضغط على قواعد البيانات أو واجهات برمجة التطبيقات الخارجية. راقب استخدام الموارد واضبط وفقًا لذلك.

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

ما الفرق بين طابور الرسائل والمهمة الخلفية؟

طابور الرسائل هو البنية التحتية التي تنقل الرسائل، بينما المهمة الخلفية هي وحدة العمل التي تمثلها الرسالة. تقوم بإضافة مهمة (رسالة) إلى طابور، ويعالجها عامل.

هل أحتاج إلى وسيط رسائل منفصل مثل RabbitMQ؟

ليس بالضرورة. بالنسبة للعديد من تطبيقات الويب، يمكن أن يكون Redis أو حتى جدول قاعدة بيانات بمثابة طابور بسيط. استخدم وسيطًا مخصصًا عندما تحتاج إلى توجيه متقدم، أو تسليم مضمون، أو إنتاجية عالية.

كيف أتعامل مع المهام الخلفية الفاشلة؟

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

هل أنت مستعد لتحسين أداء تطبيق الويب الخاص بك؟ ابدأ بنقل أول مهمة خلفية لك. وعندما تحتاج إلى معالجة ملفات PDF أو الصور في تلك المهام، تحقق من ضاغط PDF لتقليل أحجام الملفات قبل إرسالها إلى المستخدمين.