رهام رفیعی تهرانی
رهام رفیعی تهرانی
خواندن ۳ دقیقه·۱ سال پیش

استراتژی retry در انگولار برای دریافت پاسخ از سرور


وقتی اپلیکیشن درخواست HTTP ارسال میکنه و fail میشه، لازمه خطای درخواست رو مدیریت کنیم. در حالت ایده آل یک جا باید خطاها را مدیریت کنیم. در ساختار انگولار، برای مدیریت ارسال و دریافت درخواست ها ( مثل اضافه کردن توکن Bearer به header )، از intereptor ها استفاده میکنیم. یک مروری بکنیم که interceptor ها چی هستند؟


مرور مختصر interceptor ها

انگولار برای اضافه کردن رفتارهای جدید به اپلیکیشن موقع ارسال و دریافت درخواست های HTTP، کلاس های خاصی بنام interceptor رو توسعه داده. هر HttpInterceptor کنترل کامل درخواست و دریافت پاسخ رو در اختیار میگیره و میتونه اجازه بده درخواست ارسال بشه یا نشه و اجازه بده پاسخ در مبدا دریافت بشه یا نشه.

در مُدل بالا کاملا واضحه که interceptor به عنوان یک middleman عمل میکنه. به طور کلی این نوع سرویس فضای مناسبی رو آماده میکنه برای عملیات هایی مثل ارسال توکن، افزودن هدر به درخواست، caching و مدیریت خطا.


سرویس error interceptor

یکی از کارهایی که به طور متداول در interceptor ها انجام میشه مدیریت خطاهاییه که موقع ارسال درخواست و دریافت پاسخ اتفاق می افته. خطاها بنا به هر دلیلی ممکنه از طرف مرورگر اتفاق بیفته یا از طرف server side اتفاق بیفته. مثلا ممکنه لحظه ای که درخواست به سمت سرور ارسال شد، سرور امکان پاسخگویی رو نداشته باشه. یا برای مدت چند ثانیه یک سرویسش از کار افتاده باشه. به طور کلی موقع دریافت بعضی خطاها از سمت سرور، میتونیم چند ثانیه بعد دوباره اقدام کنیم و جواب رو از سرور بگیریم. به این اقدام میگیم استراتژی retry و در ادامه میخوایم پیاده سازیش کنیم.


ساخت یک interceptor در اپلیکیشن

برای ساخت یک interceptor، یک کلاس تعریف میکنیم که HttpInterceptor رو implement میکنه و متد intercept رو بر اساس interface پیاده سازی میکنه. پارامتر اول این متد آبجکت request و پارامتر دومش متغیری از تایپ HttpHandler هست (به صورت پیش فرض بنام next) که به ما اجازه میده به صورت اختیاری، عملیات رو به interceptor بعدی در زنجیره interceptor منتقل کنیم.


همین طور برای ساخت یک interceptor جدید میتونیم از ابزار angular cli استفاده کنیم. اگر نام interceptor رو مشخص نکرده باشیم، خود angular cli از ما میخواد اسمش رو مشخص کنیم.

اگر در فضای اشتراکی بین چند پروژه کار میکنیم، میتونیم با option بنام project-- ، مشخص کنیم interceptor جدید در کدام اپلیکیشن ساخته شود.


معرفی interceptor به NgModule

هر سرویس interceptor برای اینکه در اپلیکیشن استفاده بشه، باید به NgModule در بخش providers معرفی بشه:

بعد از این مرحله میتونیم retry strategy رو در ErrorInterceptor پیاده سازی کنیم.


پیاده سازی ساده استراتژی retry

ساده ترین روش پیاده سازی retry اینه که از rxjs retry استفاده کنیم. هر درخواستی که به خطا بخوره به تعداد عددی که به ورودی تابع retry میدهیم، دوباره درخواست داده میشه و در صورت به خطا نخوردن، عملیات ارسال درخواست قطع میشه:

مشکل این روش تعداد درخواست های اضافه ایه که تولید میشه. به ازای هر درخواستی که به خطا میخوره این استراتژی اجرا میشه. ممکنه برای بعضی درخواست ها نیاز نباشه از این روش استفاده کنیم. بنابر این باید دنبال روش هوشمندانه تری باشیم که علاوه بر تعداد، روی زمان و شرایط تکرار درخواست هم کنترل داشته باشیم.


پیاده سازی هوشمندانه تر استراتژی retry

فرض کنید میخواهیم :

  1. حداکثر سه بار تلاش کنیم.
  2. در شرایطی که خطای ۵۰۰ گرفتیم، درخواست را تکرار کنیم.
  3. فاصله بین هر تلاش تا تلاش بعدی ۲ ثانیه (۲۰۰۰ میلی ثانیه) باشد.

از تعداد تلاش ها با margeMap مراقبت میکنیم. به کمک rxjs delay هم فاصله بین هر تلاش تا تلاش بعدی را کنترل میکنیم:


کلام آخر

در این مقاله با سرویس خاصی در انگولار آشنا شدیم به اسم interceptor ها. با استراتژی retry آشنا شدیم و دو نوع پیاده سازی ساده و هوشمندانه این استراتژی رو در انگولار مرور کردیم.

موفق باشید :)

angularانگولارrxjs
برنامه نویسی یک شغل نیست، یک هنره.
شاید از این پست‌ها خوشتان بیاید