Idempotency في APIs: لماذا يجب ألا يكرر Retry عملية الدفع أو الإنشاء؟

Idempotency في APIs: لماذا يجب ألا يكرر Retry عملية الدفع أو الإنشاء؟

كيف تمنع Idempotency Keys تكرار العمليات الحساسة عند retries وانقطاع الشبكة، وما الفرق بين إعادة الطلب وإعادة الأثر.

لماذا يهم؟
0مصادر موثقة
6محاور
  • GET يفترض أن يكون safe/idempotent من ناحية الأثر المقصود.
  • PUT غالبًا يمكن تصميمها كـidempotent.
  • POST تحتاج غالبًا مفتاحًا أو مرجعًا منطقيًا لمنع التكرار.
  • Timeout لا يعني أن الخادم لم ينفذ العملية.

العميل قد يرسل طلب دفع أو إنشاء Order ثم ينقطع الاتصال قبل استلام الرد. من وجهة نظره لا يعرف هل العملية نجحت أم لا، فيعيد الطلب. إذا تعامل الخادم مع Retry كعملية جديدة فقد ينشئ طلبين أو يخصم مرتين. Idempotency تعني أن إعادة نفس العملية المنطقية تنتج أثرًا واحدًا حتى لو وصل request أكثر من مرة. هذا مهم في أي API ذات side effects لا يمكن تجاهل تكرارها.

المشكلة ليست في Retry نفسها

Retry ضرورية في الأنظمة الموزعة لأن timeouts والانقطاعات طبيعية. المشكلة أن POST جديد قد يمثل عملية جديدة. لذلك يجب أن يعرف الخادم أن الطلب الثاني هو محاولة لنفس العملية، وليس أمرًا جديدًا من المستخدم.

Idempotency Key تربط المحاولات بنفس العملية

العميل يولد key فريدة للعملية ويرسلها مع الطلب. الخادم يخزن key مع نتيجة التنفيذ أو حالة العملية. إذا وصلت نفس key مرة أخرى بنفس payload، يعيد النتيجة السابقة أو ينتظر العملية الجارية بدل تنفيذ أثر جديد.

خطوات عملية

  1. ولّد key للعملية.
  2. أرسلها مع الطلب.
  3. احجز key ذريًا على الخادم.
  4. نفذ العملية مرة واحدة.
  5. خزن status/response.
  6. أعد نفس النتيجة عند retry.

التحقق من payload مهم

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

التزامن يحتاج قفلًا أو قيدًا ذريًا

قد يصل طلبان بنفس key في اللحظة نفسها. فحص ثم إنشاء بسلسلة غير ذرية يترك race condition. استخدم unique constraint أو transaction أو atomic insert/lock بحسب قاعدة البيانات حتى يفوز تنفيذ واحد فقط.

قائمة مراجعة

  • key فريدة ضمن scope واضح.
  • نفس key + payload مختلفة تُرفض.
  • الإنشاء ذري.
  • حالة in-progress معروفة.
  • الاستجابة محفوظة أو يمكن إعادة بنائها.
  • TTL للمفاتيح مناسب لعمر retries.

حدد معنى الفشل

إذا فشلت العملية قبل أي أثر، يمكن السماح بإعادة التنفيذ. إذا حدث أثر خارجي ثم فشل حفظ الرد، يجب أن تستطيع الاستعلام عن الحالة أو استعادة النتيجة بدل التكرار. تكاملات الدفع تحتاج reconciliation مع provider، لا مجرد إعادة POST.

اختبر الانقطاع عمدًا

اقطع الاتصال بعد إرسال request مباشرة، أو اجعل client timeout أقصر من زمن المعالجة، ثم أعد الطلب بنفس key. الاختبار الناجح هو وجود record واحدة وأثر واحد مع response متسقة، لا مجرد status 200.

هل تريد الاحتفاظ بالمقال أو إعادة استخدامه؟
مجتمع إيجي تاجعن المجتمع

شارك في تقييم ونقاش المقال

رأيك يضيف قيمة للمقال ويساعدنا على تحسين المحتوى والنقاش حوله.

تفاعل مع المقالاختر التفاعل المناسب، ويمكنك تغيير رأيك لاحقًا.
قيّم جودة المقاللا توجد تقييمات بعد — كن أول من يقيّم.

نقاش القراء

النقاش

جارٍ تحميل التعليقات…

بعد هذه المادة

تابع القراءة

كل مواد #البرمجة وتطوير الويب
مرتبطة بنفس الوسوم04
  1. 02
  2. 03
  3. 04
اختيار القراء

الأكثر قراءة

الترتيب الكامل
  1. 01
  2. 02
  3. 03
  4. 04
  5. 05
يتجدد مع النشر

أحدث المواد

  1. 01
  2. 02
  3. 03
  4. 04
  5. 05
  6. 06