"> بکارگیری الگوی Retry در ASP.NET Core از طریق Polly |ام اس پی سافت

بکارگیری الگوی Retry در ASP.NET Core از طریق Polly

الگوی Retry در ASP.NET Core

در این مقاله، نحوه ی بکارگیری الگوی retry در ASP.NET Core از طریق Polly با دو نمونه ی ساده مورد بحث قرار خواهیم داد.

الگوی Retry در ASP.NET Core

هنگامی که برنامه ی ما نیاز به برقراری ارتباط با بسیاری از سرویس ها یا کامپوننت های دیگر دارد، به دلیل وجود برخی سرویس ها یا کامپوننت هایی که قادر به پاسخگویی به موقع نیستند، با خطاهایی موقتی مواجه خواهیم شد.

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

تولید مجدد اکثر آن ها دشوار است چراکه این خطاها اغلب خود تصحیح می باشند.

نمی توانیم از خطاها اجتناب کنیم، اما می توانیم به روش هایی که سیستم ما را سرپا نگه می دارند یا حداقل زمان از کار افتادگی را کاهش می دهند، به آن ها پاسخ دهیم.

برای مثال، یک سرویس برنامه با راهبردی فشارشکن در حال پردازش چندین درخواست همزمان می باشد، و برخی درخواست ها به سرعت رد خواهند شد.

اما اگر بتوانیم پس از یک تأخیر، مجدد تلاش کنیم، ممکن است موفق شود. تلاش مجدد روشی مؤثر و ساده جهت مدیریت خطاهای ناپایدار می باشد.

در این مقاله، در رابطه با آن در ASP.NET Core از طریق Polly بحث خواهیم کرد.

Polly چیست؟

polly

Polly یک کتابخانه ی انعطاف و مدیریت خطای ناپایدار .NET است که توسعه دهندگان را قادر می سازد تا سیاست هایی مانند Retry  Circuit Breaker، Timeout ، Bulkhead Isolation  و Fallback  را به شیوه ای روان و thread-safe  بیان کنند.

چگونه از آن استفاده کنیم؟

در این بخش، دو سناریوی رایج را به اشتراک خواهم گذاشت، یکی درخواست ( HTTP( s، و دیگری ارسال یک پیام به گذرگاه پیام است.

درخواست (HTTP(s

الگوی Retry با درخواست (HTTP(s، به دلیل ترکیب Polly و HttpClientFactory، بسیار ساده است.

کاری که نیاز است انجام دهیم این است که از یک متد افزونه به نام AddPolicyHandler جهت افزودن سیاست تلاش مجدد برای HTTPClient استفاده کنیم.

در اینجا کد نمونه جهت پیکربندی آورده شده است.

public void ConfigureServices(IServiceCollection services)  
{  
    services.AddHttpClient("csharpcorner")  
        .SetHandlerLifetime(TimeSpan.FromMinutes(5))  
        // important step  
        .AddPolicyHandler(GetRetryPolicy())  
        ;  
  
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);  
}  
  
private IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()  
{  
    return HttpPolicyExtensions  
        // HttpRequestException, 5XX and 408  
        .HandleTransientHttpError()  
        // ۴۰۴  
        .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)  
        // Retry two times after delay  
        .WaitAndRetryAsync(2, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)))  
        ;  
}  

متد GetRetryPolicy بدین معناست که خطاهای شبکه یاRabbitMQ یا کد وضعیت ۴۰۸ مکانیزم تلاش مجدد را فعال خواهد کرد.

جهت اجرای کنترل کننده، نیازی نیست پیش از ارسال درخواست (HTTP(s کدی اضافه کنیم، تنها همان رفتار پیشین را هنگام استفاده از HttpClient حفظ کنید.

[Route("api/[controller]")]  
[ApiController]  
public class ValuesController : ControllerBase  
{  
    private readonly IHttpClientFactory _clientFactory;  
  
    public ValuesController(IHttpClientFactory clientFactory)  
    {  
        _clientFactory = clientFactory;  
    }  
  
    // GET api/values  
    [HttpGet]  
    public async Task<string> GetAsync()  
    {  
        // define a 404 page  
        var url = $"https://www.c-sharpcorner.com/mytestpagefor404";  
  
        var client = _clientFactory.CreateClient("csharpcorner");              
        var response = await  client.GetAsync(url);  
        var result = await response.Content.ReadAsStringAsync();  
        return result;  
    }          
}

پس از اجرای این پروژه و مشاهده ی آن، ممکن است گزارش های زیر را دریافت کنیم.

الگوی Retry

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

ارسال یک پیام به گذرگاه پیام

گذرگاه های پیام بسیاری وجود دارند که می توانیم برای برنامه های خود استفاده کنیم.

در اینجا، از RabbitMQ برای نشان دادن نحوه ی انجام این کار استفاده می کنیم.

هنگامی که برنامه های ما با RabbitMQ ارتباط برقرار می کنند، باید از طریق کاربرد متعارف Polly، با مکانیزم تلاش مجدد درگیر شویم.

[Route("api/[controller]")]  
[ApiController]  
public class ValuesController : ControllerBase  
{  
    // GET api/values  
    [HttpGet]  
    public ActionResult<IEnumerable<string>> Get()  
    {  
        var message = Encoding.UTF8.GetBytes("hello, retry pattern");  
  
        var retry = Policy  
            .Handle<Exception>()  
            .WaitAndRetry(2, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));  
  
        try  
        {  
            retry.Execute(() =>  
            {  
                Console.WriteLine($"begin at {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}.");  
                var factory = new ConnectionFactory  
                {  
                    HostName = "localhost",  
                    UserName = "guest",  
                    Password = "guest"  
                };  
  
                var connection = factory.CreateConnection();  
                var model = connection.CreateModel();  
                model.ExchangeDeclare("retrypattern", ExchangeType.Topic, true, false, null);  
                model.BasicPublish("retrypattern", "retrypattern.#", false, null, message);  
            });  
        }  
        catch  
        {  
            Console.WriteLine("exception here.");  
        }  
  
        return new string[] { "value1", "value2" };  
    }  
}  

پس از اجرای این پروژه و مشاهده ی آن، ممکن است گزارش های زیر را دریافت کنیم.

الگوی Retry

خلاصه

این مقاله، دو روش ساده جهت استفاده از الگوی تلاش مجدد را به شما نشان داد.

گرچه استفاده از الگوی تلاش مجدد در برنامه های خود بسیار آسان است، اما باید مکان و زمان استفاده از آن و نه در همه جا را مد نظر قرار داد.

این مورد، بر مبنای نیازمندی های کسب و کار شما استوار است.

امیدوارم این مقاله بتواند شما را یاری کند!

  • پسورد: www.mspsoft.com
زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.