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.
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.
- Menginstal dengan Visual Studio
- Menginstal dengan dotnet CLI
- Instal dengan CLI nuget.exe
- Menginstal dengan Package Manager Console (PowerShell)
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
Pola coba lagihttps://learn.microsoft.com/azure/architecture/patterns/retry
Polly dan IHttpClientFactoryhttps://github.com/App-vNext/Polly/wiki/Polly-and-HttpClientFactory
Polly (pustaka ketahanan.NET dan penanganan kesalahan sementara)https://github.com/App-vNext/Polly
Polly: Coba lagi dengan Jitterhttps://github.com/App-vNext/Polly/wiki/Retry-with-jitter
Marc Brooker. Jitter: Membuat Segalanya Lebih Baik Dengan Keacakan https://brooker.co.za/blog/2015/03/21/backoff.html
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk