
خلينا نتكلم النهارده عن حاجة مهمة جدًا في الـ Backend والـ Frontend مع بعض: Background Jobs.
عمرك شوفت API بيرجعلك:
202 Accepted
بدل:
200 OK
وسألت نفسك:
هو كده العملية نجحت ولا لسه؟ 🤔
خلينا ناخد مثال بسيط.
تخيل إن المستخدم رفع فيديو حجمه 2GB.
الـ Backend استقبل الفيديو، لكن لسه وراه شغل كتير:
- Processing
- Encoding
- Generating Thumbnails
- Extracting Metadata
- Compression
- أحيانًا أكتر من خطوة حسب طبيعة المشروع
هل منطقي إن الـ API يفضل مستني كل العمليات دي تخلص، وبعدها يرجع Response للمستخدم؟
غالبًا لا.
وهنا بيظهر مفهوم مهم جدًا:
Background Jobs
الفكرة ببساطة إن الـ API يستقبل الطلب، ويبدأ العملية في الخلفية، من غير ما يفضل الـ Request مفتوح لحد ما كل حاجة تخلص.
يعني بدل ما يحصل:
Request
↓
Process Everything
↓
Response
↓
Done
ممكن يحصل:
Request
↓
Create Job
↓
202 Accepted
↓
Queue
↓
Worker
↓
Processing
↓
Completed
وهنا نفهم معنى:
202 Accepted
الـ 202 مش معناها:
"خلصت العملية بنجاح."
لكن معناها:
"أنا استلمت طلبك وقبلته للمعالجة، لكن العملية نفسها لسه ممكن تكون شغالة."
وده فرق مهم جدًا.
لأن الـ Frontend لو تعامل مع الـ 202 على إنها Final Success، ممكن يعرض للمستخدم إن العملية خلصت، وهي لسه شغالة في الـ Backend.
وهنا طريقة تفكير الـ Frontend نفسها لازم تتغير.
في الـ API التقليدي أنت متعود على:
Request
↓
Response
↓
Done
لكن مع الـ Background Jobs بتتعامل مع:
Request
↓
Accepted
↓
Processing
↓
Completed / Failed
طيب، الـ Frontend هيعرف إزاي إن الـ Job خلصت؟
فيه أكتر من طريقة.
1️⃣ Polling
الـ Frontend يفضل يسأل الـ Backend كل فترة:
GET /jobs/123
والـ API ممكن يرجع:
{
"status": "processing",
"progress": 45
}
وبعد شوية:
{
"status": "processing",
"progress": 80
}
ولما تخلص:
{
"status": "completed",
"progress": 100
}
2️⃣ WebSockets
بدل ما الـ Frontend يفضل يسأل:
"خلصت؟"
السيرفر نفسه يبعت Updates للـ Client:
Processing Started
↓
20%
↓
45%
↓
80%
↓
Completed
وده مناسب جدًا لما تكون محتاج Real-time Updates.
3️⃣ Server-Sent Events - SSE
حل مناسب لما يكون المطلوب إن الـ Server يبعت Updates للـ Client في اتجاه واحد.
وده ممكن يكون ممتاز في العمليات اللي محتاجة Progress Updates من غير ما تحتاج اتصال WebSocket كامل.
طيب شكل الـ UI ممكن يكون إزاي؟
Uploading...
████████████████░░░░ 80%
Processing...
█████████░░░░░░░░░░░ 45%
Generating Thumbnail...
✅ Completed
أو لو حصل Error:
❌ Processing Failed
[Retry]
وهنا تظهر نقطة مهمة جدًا لأي Frontend Engineer:
مش كل API Request بيمثل عملية خلصت.
أحيانًا الـ API بيرد عليك:
أنا استلمت طلبك.
مش:
أنا خلصت كل حاجة.
وعشان كده الأفضل إن الـ Frontend يتعامل مع الـ Job كـ State Machine مثلًا:
pending
↓
processing
↓
completed
وممكن يحصل:
processing
↓
failed
أو:
processing
↓
cancelled
وده أفضل بكتير من إنك تعتمد فقط على:
isLoading = true
لأنك هنا مش بتتعامل مع Request بس، أنت بتتعامل مع Long-running Operation.
والـ Background Jobs مش مقتصرة على الفيديوهات.
ممكن تستخدمها في:
- إرسال آلاف الـ Emails
- توليد Reports كبيرة
- إنشاء PDFs
- معالجة الصور
- Export بيانات ضخمة
- Import ملفات كبيرة
- إرسال Notifications
- Data Processing
- AI Tasks
الفكرة الأساسية:
الـ API مش لازم يعمل كل حاجة بنفسه وفي نفس اللحظة.
ممكن يستقبل الطلب بسرعة، ينشئ Job، ويحطها في Queue، وبعد كده Worker يتولى تنفيذها في الخلفية.
وفي النهاية:
API
↓
202 Accepted
↓
Job Queue
↓
Worker
↓
Processing
↓
Final State
وعشان كده، فهمك للـ 202 مش مجرد معرفة Status Code في HTTP.
دي طريقة تفكير كاملة في تصميم الـ APIs والـ UX.
وأهم جملة ممكن تخرج بيها من الموضوع:
202 Accepted = أنا استلمت طلبك، مش بالضرورة إني خلصته.
ودي نقطة بسيطة جدًا في الـ HTTP، لكن فهمها بيفرق جدًا لما تبدأ تتعامل مع Production Systems وLong-running Operations وScalable Applications.
Top comments (0)