Menerapkan percobaan ulang panggilan HTTP dengan backoff eksponensial dengan kebijakan IHttpClientFactory dan Polly

Tip

Konten ini adalah kutipan dari eBook, .NET Microservices Architecture for Containerized .NET Applications, tersedia di .NET Docs atau sebagai PDF yang dapat diunduh gratis dan dapat dibaca secara offline.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Pendekatan yang direkomendasikan untuk percobaan ulang dengan backoff eksponensial adalah memanfaatkan pustaka .NET yang lebih canggih seperti pustaka Polly sumber terbuka.

Polly adalah pustaka .NET yang menyediakan kemampuan penanganan ketahanan dan kesalahan sementara. Anda dapat menerapkan kemampuan tersebut dengan menerapkan kebijakan Polly seperti Percobaan Lagi, Pemutus Sirkuit, Isolasi Bulkhead, Waktu Habis, dan Fallback. Polly menargetkan .NET Framework 4.x dan .NET Standard 1.0, 1.1, dan 2.0 (yang mendukung .NET Core dan yang lebih baru).

Langkah-langkah berikut menunjukkan bagaimana Anda dapat menggunakan percobaan ulang Http dengan Polly terintegrasi ke dalam IHttpClientFactory, yang dijelaskan di bagian sebelumnya.

Menginstal paket .NET

Pertama, Anda harus menginstal Microsoft.Extensions.Http.Polly paket.

Mereferensikan paket .NET 8

IHttpClientFactory tersedia karena .NET Core 2.1, namun, kami sarankan Anda menggunakan paket .NET 8 terbaru dari NuGet dalam proyek Anda. Anda biasanya juga perlu merujuk ke paket ekstensi Microsoft.Extensions.Http.Polly.

Mengonfigurasi klien dengan kebijakan Coba Lagi Polly, dalam startup aplikasi

Metode AddPolicyHandler() adalah yang menambahkan kebijakan ke objek HttpClient yang akan Anda gunakan. Dalam hal ini, ia menambahkan kebijakan Polly untuk Http Retries dengan backoff eksponensial.

Untuk memiliki pendekatan yang lebih modular, Kebijakan Percobaan Kembali Http dapat ditentukan dalam metode terpisah dalam file Program.cs , seperti yang ditunjukkan dalam kode berikut:

static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
        .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2,
                                                                    retryAttempt)));
}

Seperti yang ditunjukkan di bagian sebelumnya, Anda perlu menentukan konfigurasi HttpClient klien bernama atau yang diketik dalam konfigurasi aplikasi Program.cs standar Anda. Sekarang Anda menambahkan kode bertambah bertahap yang menentukan kebijakan untuk percobaan ulang Http dengan backoff eksponensial, sebagai berikut:

// Program.cs
builder.Services.AddHttpClient<IBasketService, BasketService>()
        .SetHandlerLifetime(TimeSpan.FromMinutes(5))  //Set lifetime to five minutes
        .AddPolicyHandler(GetRetryPolicy());

Dengan Polly, Anda dapat menentukan kebijakan Coba lagi dengan jumlah percobaan ulang, konfigurasi backoff eksponensial, dan tindakan yang harus diambil saat ada pengecualian HTTP, seperti mencatat kesalahan. Dalam hal ini, kebijakan dikonfigurasi untuk mencoba enam kali dengan percobaan ulang eksponensial, mulai dari dua detik.

Menambahkan strategi jitter ke kebijakan percobaan kembali

Kebijakan percobaan kembali reguler dapat memengaruhi sistem Anda dalam kasus konkurensi dan skalabilitas tinggi dan di bawah pertentangan tinggi. Untuk mengatasi puncak percobaan ulang serupa yang datang dari banyak klien dalam pemadaman sebagian, solusi yang baik adalah menambahkan strategi jitter ke algoritme/kebijakan percobaan kembali. Strategi ini dapat meningkatkan kinerja keseluruhan sistem menyeluruh. Seperti yang direkomendasikan di Polly: Coba lagi dengan Jitter, strategi jitter yang cocok dapat diterapkan dengan interval coba lagi yang lancar dan terdistribusi secara merata yang diterapkan dengan penundaan coba lagi awal median yang terkontrol dengan baik pada backoff eksponensial. Pendekatan ini membantu menyebarkan paku ketika masalah muncul. Prinsip tersebut diilustrasikan oleh contoh berikut:


var delay = Backoff.DecorrelatedJitterBackoffV2(medianFirstRetryDelay: TimeSpan.FromSeconds(1), retryCount: 5);

var retryPolicy = Policy
    .Handle<FooException>()
    .WaitAndRetryAsync(delay);

Sumber daya tambahan