- بواسطة x32x01 ||
يعني إيه Idempotency Keys وليه كل الشركات الكبيرة بتستخدمها؟ 
لو انت شغال Backend أو بتطور API، أكيد قابلت مشكلة إن المستخدم يضغط على نفس الزر أكتر من مرة بسبب بطء النت…وفجأة تلاقي عندك:
- طلبين دفع بدل واحد
- أوردرين بدل أوردر
- عملية اتكررت 3 مرات
هنا بقى بيظهر واحد من أهم المفاهيم اللي بتميز المبرمج العادي عن الـ Backend Developer الجامد:
Idempotency Keys
التقنية دي مستخدمة عند أكبر الشركات في العالم:
- Stripe
- PayPal
- Uber
- Amazon
الفكرة ببساطة
بدون Idempotency:لو المستخدم ضغط 3 مرات → السيستم هينفّذ العملية 3 مرات.
مع Idempotency:
السيستم يعامل الـ 3 طلبات كأنهم طلب واحد بس، ويتجاهل الباقي، ويرجع لهم نفس الرد من غير ما ينفّذ العملية تاني.
وده معناه:
- مفيش Double Payment
- مفيش Duplicate Orders
- مفيش Chaos في الـ API
ليه التقنية دي مهمة جدًا لأي Backend قوي؟ 
تمنع تكرار تنفيذ الطلبات
لو API بتاعك بيتعامل مع فلوس، تذاكر، اشتراكات، شحن رصيد…التكرار = كارثة.
Idempotency بتقف قدام الكارثة دي.
بتخلي السيستم ثابت ومستقر
لما كل طلب متكرر يرجع نفس الرد، بتضمن:- استقرار عالي
- Zero duplicated actions
- أكواد مرتبة
- منطق واضح للتعامل مع الطلبات
بتخلي الـ Backend بتاعك Enterprise-Level
لإن الشركات الكبيرة مابتقبلش Backend "شغل والسلام".لازم يكون:
- Reliable
- Consistent
- Deterministic
سيناريو بسيط يوضح الفكرة 
تخيل مستخدم بيحاول يدفع Online، بس النت ضعيف…ضغط زر الدفع 3 مرات.
لو الـ API بتاعك مفيهوش Idempotency:
- هيتسحب منه فلوس 3 مرات
- هيتسجّل 3 فواتير
- والداتا هتبقى غلط
أما مع Idempotency Keys:
- الـ 3 طلبات بيتعاملوا كأنهم طلب واحد
- الفلوس تتسحب مرة واحدة بس
- الباقي يرجع نفس الـ Response
إزاي نطبق Idempotency في Laravel؟ 
الخطوة الأولى - إرسال المفتاح من الـ Frontend
لازم الـ Frontend يبعت Header اسمه:Idempotency-Key
والقيمة بتاعته بتكون UUID.
مثال Postman
Code:
Idempotency-Key: 123e4567-omar-001 مثال Axios
Code:
axios.post('/api/orders', data, {
headers: {
'Idempotency-Key': crypto.randomUUID()
}
}); الخطوة التانية - إنشاء Middleware مخصوص في Laravel 
Middleware يحفظ الطلبات ويرجع نفس الرد للطلبات المتكررة
الكود اللي تحت مثال قوي وواضح: PHP:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Cache;
class IdempotencyMiddleware
{
public function handle($request, Closure $next)
{
$key = $request->header('Idempotency-Key');
if (!$key) {
return response()->json(['error' => 'Idempotency-Key missing'], 400);
}
if (Cache::has($key)) {
return response()->json(Cache::get($key));
}
$response = $next($request);
Cache::put($key, $response->getData(), 60 * 60);
return $response;
}
} شرح سريع للكود:
- بيقرأ الـ Idempotency-Key من الطلب
- لو المفتاح موجود في الكاش → بيرجع نفس الرد
- لو جديد → ينفّذ الطلب ويحفظ النتيجة
الخطوة الثالثة - تسجيل الـ Middleware في Kernel.php
PHP:
protected $routeMiddleware = [
'idempotency' => \App\Http\Middleware\IdempotencyMiddleware::class,
]; الخطوة الرابعة - تطبيقه على Route أو مجموعة Routes
PHP:
Route::post('/orders', 'OrderController@store')->middleware('idempotency'); فوائد ضخمة بعد تطبيق Idempotency 
1. حماية كاملة من الـ Double Payment
مفيش مستخدم هيدفع مرتين بالغلط… حتى لو ضغط 10 مرات.2. منع تكرار إنشاء الطلبات داخل قواعد البيانات
Zero Duplicate Orders3. ثبات عالي للأنظمة الحساسة
لو عندك:- نظام دفع
- نظام شحن
- API متصل بتطبيق موبايل ضعيف النت
4. تحسين جودة الكود
الكود هيكون:- Predictable
- Stable
- Clean
- Enterprise-grade
5. مستوى محترف لأي Backend Developer
Idempotency من العلامات اللي بتقول:"اللي كتب الكود فاهم Backend كويس".
ازاي تختبر Idempotency؟ 
اختبار بسيط عبر Postman
- ارسل نفس الطلب مرتين
- بنفس الـ Idempotency-Key
- هتلاحظ إن الرد هو هو… من غير تكرار
اختبار من الموبايل
لو التطبيق Network ضعيف وبيعمل Retryهتلاقي رد ثابت ومفيش تكرار عمليات.
أفضل Practices للتعامل مع Idempotency
- استخدم UUID حقيقي من الـ Client
- خلي زمن التخزين (TTL) طويل نسبيًا
- استخدم Storage سريع زي Redis
- اربط المفتاح بالـ User ID لو عايز أمان أعلى
- خزّن الـ Request + Response لو العملية حساسة
الخلاصة
Idempotency Keys مش مجرد فكرة لطيفة… ده مفهوم أساسي لأي Backend احترافي.التقنية دي لو استخدمتها صح:
- هتحمي معاملات الدفع
- هتمنع تكرار الطلبات
- هترفع استقرار النظام
- وهتخلي الـ API بتاعك Enterprise-Level
لكن فعليًا من أهم الحاجات اللي بتفرق بين الكود العادي والكود البرمجي اللي يتاخد ليفل أعلى.
لو عايز أضيف جزء كامل عن Idempotency في Microservices أو مع Queue Workers… قولهالي وأنا أكمّل عليك