بعد از مدت ها اینجا مطلبی به اشتراک میزارم اونم به خاطر این که فکر میکنم مطلب به درد بخوری ممکنه باشه
تو یکی از پروژه های شرکت #باسلام نیاز بود که توکن از سرویسی گرفته بشه و درصورت اکسپایر شدن دوباره اینکار تکرار کنه.
چالش ها :
۱- نبود دیتابیس ۲- در بهینه ترین شرایط استفاده از منابع سرور باشه
در شروع :
پروژه ابتدا با یک اسکژول هر n دقیقه توکن جدید دریافت میکرد و در redis ذخیره میکرد. این خوب بود اما اگر درخواست به خطا میخورد چی ؟ نباید درخواست از بین میرفت :/ فعلا اینو ایگنور میکنیم تا بعد :) پروژه بعد از ۳ هفته تکمیل شد حالا نوبت این رسید که قسمتی که ایگنور کردیم هندل کنم ، اوه تو چندین فایل رکویست های جدا زده شده !
راه حل پیشنهادی چیه ؟
ی فایل اصلی بسازیم که متد رکویست داخل اون هندل بشه و بقیه از اون ارث بری کنند و تابع رکویست پدر فراخوانی کنند تا اینجاش خوب بود ولی بازم رکویست در صورت پاسخ ندادن api به فنا میرفت .
رفع مشکل اصلی :
باید ساختاری ایجاد میشد که بتونیم درخواست تکرار کنیم . پس درخواستُ داخل یه حلقه while قرار میدیم اگر درخواست اوکی بود که رسپانس دریافت میکنیم اما اگر خطا داشت داخل while خود تابع صدا میکنیم اما به دیتا های ورودی قبل دسترسی نداریم پس داخل تابع اصلی مقادیر تو متغیر های سراسری دیگه ای ذخیره میکنیم که در صورت به فنا رفتن رکویست به دیتا ها دسترسی داشته باشیم. با این کار تا بینهایت میتونیم درخواست تکرار کنیم اما نباید با تکرار زیاد منابع سروری که بهش رکویست میزنیم هم پر کنیم پس نیاز به ی ماکسیمم داریم که فقط n بار درخواستمون تکرار کنیم اگر به اون عدد رسیدیم باید break کنیم حالا میشه این خطا هارو نسبت به هر کدومش اکشن متفاوت داشت به عنوان مثال اگر استاتوس 401 گرفتیم پس باید توکن جدید بگیریم و درخواست بعد از دریافت توکن تکرار کنیم یا اگر اکسپشن گرفتیم خطا مون کپچر کنیم
برای من نتیجه خیلی جالبی داشت چون کلی از تکرار کد جلوگیری کرد و هم ی کار چالش دار جدید بود
آدرس ریپازیتوری : github