المستخدم ضغط زر الحفظ مرتين أو الشبكة قطعت بعد ما الخادم نفذ الطلب فالعميل جرب يبعت تاني لو كل وصول للطلب بينشئ عملية جديدة ممكن تطلع سجلات مكررة حتى لو المستخدم كان يقصد عملية واحدة
تعطيل الزر خطوة مفيدة لكنها مش الحل الكامل
تعطيل الزر أثناء الإرسال بيقلل الضغط المتكرر في نفس الشاشة لكنه مش بيمنع طلب من نافذة تانية أو إعادة المحاولة من العميل بعد انقطاع الاتصال القرار النهائي لازم يبقى على الخادم
افهم معنى Idempotency
المقصود إن تكرار نفس العملية المنطقية ميعملش أثر إضافي غير المقصود مش شرط كل طلب شبكة يكون جديد من ناحية المعنى ونجاح التنفيذ قبل ضياع الرد هو حالة مهمة لازم تفكر فيها
Client sends request A
Server creates the order
Connection closes before the response arrives
Client retries request A
Server returns the existing resultاستخدم مفتاح لنفس العملية
في أنظمة بتدعم Idempotency Key العميل بيجهز مفتاح للعملية الجديدة ويعيد استخدامه عند إعادة نفس الطلب لكن لو المستخدم بدأ عملية جديدة مستقلة لازم يكون لها مفتاح جديد
اسم الهيدر وسياسة الاحتفاظ بالمفتاح والتعامل مع الفشل بتختلف حسب الخدمة فراجع توثيق ال API متفترضش إن إرسال هيدر بالاسم ده بيخلي أي خادم يدعم الفكرة
POST /orders
Idempotency-Key: 3a632acc-35a6-478d-92de-90a7b1d97802
Content-Type: application/json
{"product":"notebook","quantity":2}الخادم لازم يحجز المفتاح بطريقة تمنع السباق
لو طلبين وصلوا في نفس اللحظة ففحص وجود المفتاح ثم إضافته بخطوتين منفصلتين ممكن يسمح للاتنين بالتنفيذ استخدم قيد فريد مناسب على المستخدم ونوع العملية والمفتاح مع معاملة أو آلية حجز ذرية
احفظ بصمة البيانات المهمة مع المفتاح وارفض استخدام نفس المفتاح لبيانات مختلفة بعد فحص هوية المستخدم وصلاحياته المفاتيح مش بديل عن التحقق من الطلب
خطوات التنفيذ على الخادم
ابدأ بالتحقق من المستخدم والبيانات ثم حاول حجز المفتاح مرة واحدة لو العملية مكتملة رجع نتيجتها المسجلة ولو لسه بتتنفذ تعامل مع الحالة حسب تصميم ال API من غير بدء تنفيذ مكرر
وقت النجاح احفظ النتيجة وربطها بالمفتاح مع التغيير الأساسي لما يكونوا في نفس قاعدة البيانات أما الخدمات الخارجية فمحتاجة تنسيق خاص بيها ومفتاح عدم تكرار عند الخدمة لو بتدعمه
القيد الفريد يحمي معنى البيانات كمان
لو العضو المفروض يشترك في الدورة مرة واحدة فقيد فريد على العضو والدورة بيفرض القاعدة حتى لو طلبان لهم مفتاحان مختلفان وصلت في نفس الوقت دي قاعدة مختلفة عن إعادة إرسال نفس الطلب
جرب السيناريوهات اللي بتكشف التكرار
جرب نفس المفتاح ونفس البيانات مرتين ثم نفس المفتاح ببيانات مختلفة ثم طلبين متزامنين ثم انقطاع الرد بعد النجاح وتأكد إن تغيير حساب المستخدم مش بيرجع له نتيجة حساب تاني
متوعدش إن الطلب هيتنفذ مرة واحدة في كل الظروف من غير تصميم واضح للحفظ والفشل الهدف إنك تتحكم في الأثر وإعادة المحاولة وتعرف إيه اللي حصل