فرض کن کاربر روی دکمهی «پرداخت» میزنه، ولی بهخاطر کندی شبکه پاسخی دریافت نمیکنه و دوباره درخواست رو ارسال میکنه.
اگر سیستم درست طراحی نشده باشه، ممکنه پرداخت دو بار انجام بشه!
اینجاست که مفهوم ایدِمپوتِنسی اهمیت پیدا میکنه.
به زبان ساده:
اگر یک عملیات را چند بار با ورودی یکسان اجرا کنیم، نتیجهی نهایی باید مثل یک بار اجرا شدن آن باشد.
مثلاً فرض کن درخواست زیر میگه نام کاربر شمارهی ۴۲ را به «یوسف» تغییر بده:
PUT /users/42اگر این درخواست حتی ۱۰ بار هم ارسال بشه، نتیجه تغییری نمیکنه:
نام کاربر همچنان «یوسف» خواهد بود.
اما حالا این درخواست رو در نظر بگیر:
POST /paymentsیعنی:
«یک پرداخت جدید ایجاد کن.»
اگر این درخواست دوبار اجرا بشه، ممکنه دو پرداخت جداگانه ساخته بشه.
برای جلوگیری از این اتفاق، معمولاً از چیزی به اسم کلید ایدمپوتنسی (Idempotency Key) استفاده میکنیم.
مثلاً:
Idempotency-Key: 8f3a...سرور این کلید رو نگه میداره.
اگر همان درخواست دوباره با همان کلید ارسال بشه، سرور عملیات رو دوباره انجام نمیده و نتیجهی قبلی رو برمیگردونه.
ایدمپوتنسی مخصوصاً در این موارد خیلی مهمه:
• سیستمهای پرداخت
• طراحی API
• تلاش مجدد یا Retry
• صف پیامها
• میکروسرویسها
• سیستمهای توزیعشده
در سیستمهای واقعی باید همیشه این احتمال رو در نظر بگیریم که:
یک درخواست ممکنه بیشتر از یک بار به سرور برسه.
طراحی خوب یعنی تکرار یک درخواست، باعث خراب شدن دادهها یا انجام چندبارهی یک عملیات حساس نشه.
@Teachify | برنامه نویسی

