DEV Community

Cover image for 202 Accepted مش معناها إن العملية خلصت!
Ahmed Niazy
Ahmed Niazy

Posted on

202 Accepted مش معناها إن العملية خلصت!


خلينا نتكلم النهارده عن حاجة مهمة جدًا في الـ Backend والـ Frontend مع بعض: Background Jobs.

عمرك شوفت API بيرجعلك:

202 Accepted
Enter fullscreen mode Exit fullscreen mode

بدل:

200 OK
Enter fullscreen mode Exit fullscreen mode

وسألت نفسك:
هو كده العملية نجحت ولا لسه؟ 🤔

خلينا ناخد مثال بسيط.

تخيل إن المستخدم رفع فيديو حجمه 2GB.

الـ Backend استقبل الفيديو، لكن لسه وراه شغل كتير:

  • Processing
  • Encoding
  • Generating Thumbnails
  • Extracting Metadata
  • Compression
  • أحيانًا أكتر من خطوة حسب طبيعة المشروع

هل منطقي إن الـ API يفضل مستني كل العمليات دي تخلص، وبعدها يرجع Response للمستخدم؟

غالبًا لا.

وهنا بيظهر مفهوم مهم جدًا:

Background Jobs

الفكرة ببساطة إن الـ API يستقبل الطلب، ويبدأ العملية في الخلفية، من غير ما يفضل الـ Request مفتوح لحد ما كل حاجة تخلص.

يعني بدل ما يحصل:

Request
   ↓
Process Everything
   ↓
Response
   ↓
Done
Enter fullscreen mode Exit fullscreen mode

ممكن يحصل:

Request
   ↓
Create Job
   ↓
202 Accepted
   ↓
Queue
   ↓
Worker
   ↓
Processing
   ↓
Completed
Enter fullscreen mode Exit fullscreen mode

وهنا نفهم معنى:

202 Accepted
Enter fullscreen mode Exit fullscreen mode

الـ 202 مش معناها:

"خلصت العملية بنجاح."

لكن معناها:

"أنا استلمت طلبك وقبلته للمعالجة، لكن العملية نفسها لسه ممكن تكون شغالة."

وده فرق مهم جدًا.

لأن الـ Frontend لو تعامل مع الـ 202 على إنها Final Success، ممكن يعرض للمستخدم إن العملية خلصت، وهي لسه شغالة في الـ Backend.

وهنا طريقة تفكير الـ Frontend نفسها لازم تتغير.

في الـ API التقليدي أنت متعود على:

Request
   ↓
Response
   ↓
Done
Enter fullscreen mode Exit fullscreen mode

لكن مع الـ Background Jobs بتتعامل مع:

Request
   ↓
Accepted
   ↓
Processing
   ↓
Completed / Failed
Enter fullscreen mode Exit fullscreen mode

طيب، الـ Frontend هيعرف إزاي إن الـ Job خلصت؟

فيه أكتر من طريقة.

1️⃣ Polling

الـ Frontend يفضل يسأل الـ Backend كل فترة:

GET /jobs/123
Enter fullscreen mode Exit fullscreen mode

والـ API ممكن يرجع:

{
  "status": "processing",
  "progress": 45
}
Enter fullscreen mode Exit fullscreen mode

وبعد شوية:

{
  "status": "processing",
  "progress": 80
}
Enter fullscreen mode Exit fullscreen mode

ولما تخلص:

{
  "status": "completed",
  "progress": 100
}
Enter fullscreen mode Exit fullscreen mode

2️⃣ WebSockets

بدل ما الـ Frontend يفضل يسأل:

"خلصت؟"

السيرفر نفسه يبعت Updates للـ Client:

Processing Started
      ↓
20%
      ↓
45%
      ↓
80%
      ↓
Completed
Enter fullscreen mode Exit fullscreen mode

وده مناسب جدًا لما تكون محتاج Real-time Updates.

3️⃣ Server-Sent Events - SSE

حل مناسب لما يكون المطلوب إن الـ Server يبعت Updates للـ Client في اتجاه واحد.

وده ممكن يكون ممتاز في العمليات اللي محتاجة Progress Updates من غير ما تحتاج اتصال WebSocket كامل.

طيب شكل الـ UI ممكن يكون إزاي؟

Uploading...
████████████████░░░░ 80%

Processing...
█████████░░░░░░░░░░░ 45%

Generating Thumbnail...

✅ Completed
Enter fullscreen mode Exit fullscreen mode

أو لو حصل Error:

❌ Processing Failed

[Retry]
Enter fullscreen mode Exit fullscreen mode

وهنا تظهر نقطة مهمة جدًا لأي Frontend Engineer:

مش كل API Request بيمثل عملية خلصت.

أحيانًا الـ API بيرد عليك:

أنا استلمت طلبك.

مش:

أنا خلصت كل حاجة.

وعشان كده الأفضل إن الـ Frontend يتعامل مع الـ Job كـ State Machine مثلًا:

pending
   ↓
processing
   ↓
completed
Enter fullscreen mode Exit fullscreen mode

وممكن يحصل:

processing
   ↓
failed
Enter fullscreen mode Exit fullscreen mode

أو:

processing
   ↓
cancelled
Enter fullscreen mode Exit fullscreen mode

وده أفضل بكتير من إنك تعتمد فقط على:

isLoading = true
Enter fullscreen mode Exit fullscreen mode

لأنك هنا مش بتتعامل مع 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
Enter fullscreen mode Exit fullscreen mode

وعشان كده، فهمك للـ 202 مش مجرد معرفة Status Code في HTTP.

دي طريقة تفكير كاملة في تصميم الـ APIs والـ UX.

وأهم جملة ممكن تخرج بيها من الموضوع:

202 Accepted = أنا استلمت طلبك، مش بالضرورة إني خلصته.

ودي نقطة بسيطة جدًا في الـ HTTP، لكن فهمها بيفرق جدًا لما تبدأ تتعامل مع Production Systems وLong-running Operations وScalable Applications.

Top comments (0)