حسین بیگی
حسین بیگی
خواندن ۳ دقیقه·۳ سال پیش

حکایت شیخ و مریدان : Idempotency

روزی شیخ خندان در کنار جوی آب نشسته بود و گذر عمر میدید که مریدی بر وی نازل شد و گفت : یا شیخ اگر چیز خنده داری هم هست، بگو ماهم بخندیم(انتقامش را از شیخ گرفت!)

شیخ نگاهی به وی کرد و گفت : آری، هست! بشین تا برایت بگویم!

مرید که تازه فهمیده بود که یک منبر رفته در پاچه اش! نشست و گفت : بگو یا شیخ.....

شیخ گفت : در مهندسی نرم‌افزار مخصوصا زمانی که داری API را طراحی میکنی، مبحثی وجود دارد با نام Idempotency بگو خب...

مرید گفت : خب! این که میگویی چیست!!!!!

شیخ ادامه داد : این در علم کامپیوتر و ریاضیات یعنی عملی را بدون هیچ تغییری تکرار کنی و دقیقا همان نتیجه را بگیری! یا اینجوری بگم هر چند بار که یک درخواست را به سرور فرستادی، هیچ عوارض جانبی برای سرور بدبخت نداشته باشد!!!!

مرید پرید و گفت : گرفتی مارو؟؟؟ مگر میشود جز این؟؟؟

شیخ گفت : گوش کن یره!جنومرگ!!!

بگذار مثالی بزنم : فکر کن کاربر یک عملیات POST انجام میده بعدش حالا به هر دلیلی TimeOut اتفاق می افته!الان چی شد؟ عملیات انجام شد؟ نشد؟ شد جوابش نیومده؟ نشده و جوابی نداره؟ شد شد نشد نشد ولش کن؟؟؟؟ الان دوباره درخواست ارسال کنه؟؟ نکنه ؟ اگه رفرش کنه بعد دوبار توی دیتابیس ذخیره بشه چی؟؟ (مثل سند های حسابداری که میتونه حساب ها رو بهم بزنه)! چه بدبختیه! نه؟؟؟؟؟

خب جواب این در اینه که API ها Idempotent باشن!

مرید گفت : وَع!(نماد تعجب مرید!) خب چرا پیش فرض همشون Idempotent نیستند؟؟دردسر درست کردن هااا.

شیخ گفت : بدان و اگاه باش که متد های OPTIONS, GET, HEAD, PUT, DELETE  پیش فرض Idempotent هستند! اما متد های POST  و PATCH  به صورت پیش فرض Idempotent نیستند!

(آره.PUT  پیش فرض Idempotent هستش!!!) حالا چرا این دوتا نیستند؟؟؟ چون این دوتا ذاتا قراره یک وضعیتی رو توی سرور تغییر بدن! خب اگه Idempotent باشن که نمیتونن کارشونو درست انجام بدن!

مرید پرسید: یا شیخ چگونه از این باگ خلقت فرار کنیم؟؟؟؟

شیخ گفت : چند راه داری!البته یادت باشد همیشه به اندازه انسان های روی زمین راه های رسیدن به خدا هست!(مارمولک)

اولین راه : سعی کنی یکی از Property هایی که به سمت سرور میفرستی را دستی کنی و در زمانی که درخواستی اومد ریز یک کوئری بزنی دیتابیس ببینی هست یا نه! مثلا (شماره سند یا شماره پرداخت و....)

دومین راه : مثل خفن ها دیتا را (مثلا Json) را هش کنی ! آن طرف چک کنی که آیا این هش قبلا به اینجا سرزده یا نه(البته این راه برای عملیات هایی که می خواهید حتما از صحت داده هم اطمینان حاصل کنید، پیشنهاد میشود کلا برکات زیادی دارد، بسته به خلاقیت شما!)

سومین راه : در هدر های خود یک هدر جدید مثلا(IdemCode) بگذارید بعدش ریز یک Middleware اون وسط های بگذارید تا چک کند که اوضاع در چه حال است!برای این میتوانید یک Expire  بگذارید تا دردسر حجم داده ایجاد نشود!

مرید گفت : این همه روضه چه ربطی داشت به خنده؟؟؟؟

شیخ گفت : دوستی این روضه ها را پیاده نکرده و حالا به مانند آهویی که در جنگل گم شده، میماند! داشتم به وی میخندیدم!

مرید به صورت مارادونایی خشتکش درید و با زاویه به ده رفت تا مریدان دیگر را از این برکت بک اند آگاه کند!

مهندسی نرم‌افزار
شاید از این پست‌ها خوشتان بیاید