Polly: A Resilience and Fault-Handling Library for .NET

 

Polly: A Resilience and Fault-Handling Library for .NET

Introduction

In modern software development, applications must be resilient to failures, such as network timeouts, transient errors, and service disruptions. Polly is a powerful .NET library that helps developers implement resilience strategies, including retries, circuit breakers, timeouts, and more.

What is Polly?

Polly is an open-source .NET library that provides policies for handling transient faults and improving system reliability. It allows developers to define robust error-handling strategies in a declarative and flexible way.

Key Features of Polly

  • Retry Policies – Automatically retry failed operations.
  • Circuit Breaker – Temporarily stop execution when failures exceed a threshold.
  • Timeouts – Limit execution time to avoid long waits.
  • Fallback – Provide an alternative response when an operation fails.
  • Bulkhead Isolation – Limit concurrent requests to prevent overload.
  • Cache – Store responses to avoid repeated expensive operations.
  • Integration with .NET Core & HttpClientFactory – Works seamlessly with modern .NET applications.

Installing Polly

To use Polly in a .NET project, install the NuGet package:

dotnet add package Polly

For HTTP client resilience, use:

dotnet add package Microsoft.Extensions.Http.Polly

How to Use Polly

1. Retry Policy

The following example retries an HTTP request three times before failing:

using Polly;
using Polly.Retry;
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var retryPolicy = Policy
            .Handle<HttpRequestException>()
            .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(retryAttempt));

        var httpClient = new HttpClient();
        
        await retryPolicy.ExecuteAsync(async () =>
        {
            var response = await httpClient.GetAsync("https://example.com");
            response.EnsureSuccessStatusCode();
            Console.WriteLine("Request successful!");
        });
    }
}

2. Circuit Breaker Pattern

A circuit breaker prevents repeated execution when failures occur. This example opens the circuit after two consecutive failures and waits 30 seconds before retrying:

var circuitBreakerPolicy = Policy
    .Handle<HttpRequestException>()
    .CircuitBreakerAsync(2, TimeSpan.FromSeconds(30));

await circuitBreakerPolicy.ExecuteAsync(async () =>
{
    var response = await httpClient.GetAsync("https://example.com");
    response.EnsureSuccessStatusCode();
});

3. Timeout Policy

To limit execution time and prevent long waits:

var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(10); // 10 seconds timeout

await timeoutPolicy.ExecuteAsync(async () =>
{
    var response = await httpClient.GetAsync("https://example.com");
});

Polly with HttpClientFactory

Polly integrates with HttpClientFactory in .NET Core, allowing centralized resilience policies for HTTP requests:

services.AddHttpClient("MyClient")
    .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMessage>(5))
    .AddPolicyHandler(Policy.Handle<HttpRequestException>()
        .RetryAsync(3));

Conclusion

Polly is a must-have library for any .NET developer building resilient applications. By implementing retries, circuit breakers, timeouts, and fallbacks, developers can handle failures gracefully and improve system stability.

Comments

Popular posts from this blog

Maxpooling vs minpooling vs average pooling

Generative AI - Prompting with purpose: The RACE framework for data analysis

Best Practices for Storing and Loading JSON Objects from a Large SQL Server Table Using .NET Core