Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ketahanan adalah kemampuan aplikasi untuk pulih dari kegagalan sementara dan terus berfungsi. Dalam konteks pemrograman .NET, ketahanan dicapai dengan merancang aplikasi yang dapat menangani kegagalan dengan anggun dan pulih dengan cepat. Untuk membantu membangun aplikasi tangguh di .NET, dua paket berikut tersedia di NuGet:
| Paket NuGet | Deskripsi |
|---|---|
| 📦 Microsoft.Extensions.Resilience | Paket NuGet ini menyediakan mekanisme untuk memperkuat aplikasi terhadap kegagalan sementara. |
| 📦 Microsoft.Extensions.Http.Resilience | Paket NuGet ini menyediakan mekanisme resiliensi khusus untuk kelas HttpClient. |
Kedua paket NuGet ini dibangun di atas Polly, yang merupakan proyek sumber terbuka yang populer. Polly adalah pustaka ketahanan .NET dan penanganan kesalahan sementara yang memungkinkan pengembang untuk mengekspresikan strategi seperti mencoba kembali, pemutus sirkuit, tenggat waktu, isolasi sekat, pembatasan laju, penyimpangan, dan hedging dengan cara yang lancar dan aman untuk thread.
Penting
Paket NuGet Microsoft.Extensions.Http.Polly tidak digunakan lagi. Gunakan salah satu paket yang disebutkan di atas sebagai gantinya.
Mulai sekarang!
Untuk memulai dengan ketahanan di .NET, instal paket NuGet Microsoft.Extensions.Resilience .
dotnet add package Microsoft.Extensions.Resilience
Untuk informasi selengkapnya, lihat menambahkan paket dotnet atau Mengelola dependensi paket di aplikasi .NET.
Membangun rangkaian ketahanan
Untuk menggunakan ketahanan, Anda harus terlebih dahulu membangun alur strategi berbasis ketahanan. Setiap strategi yang dikonfigurasi dijalankan dalam urutan konfigurasi. Dengan kata lain, urutan itu penting. Titik masuk adalah metode ekstensi pada tipe IServiceCollection, bernama AddResiliencePipeline. Metode ini mengambil pengidentifikasi alur kerja dan delegasi yang mengonfigurasi alur kerja. Delegasi diberikan instance ResiliencePipelineBuilder, yang digunakan untuk menambahkan strategi ketahanan ke pipeline.
Pertimbangkan contoh berbasis key string berikut:
using Microsoft.Extensions.DependencyInjection;
using Polly;
using Polly.CircuitBreaker;
using Polly.Registry;
using Polly.Retry;
using Polly.Timeout;
var services = new ServiceCollection();
const string key = "Retry-Timeout";
services.AddResiliencePipeline(key, static builder =>
{
// See: https://www.pollydocs.org/strategies/retry.html
builder.AddRetry(new RetryStrategyOptions
{
ShouldHandle = new PredicateBuilder().Handle<TimeoutRejectedException>()
});
// See: https://www.pollydocs.org/strategies/timeout.html
builder.AddTimeout(TimeSpan.FromSeconds(1.5));
});
Kode sebelumnya:
- Membuat instans
ServiceCollectionbaru. - Menentukan
keyuntuk mengidentifikasi alur. - Menambahkan alur resiliensi ke
ServiceCollectioninstance. - Mengonfigurasi jalur proses dengan strategi pengulangan dan batas waktu.
Setiap pengaliran dikonfigurasi untuk key, dan masing-masing key digunakan untuk mengidentifikasi ResiliencePipeline yang sesuai ketika mendapatkan pengaliran dari penyedia.
key adalah parameter jenis generik dari AddResiliencePipeline metode .
Ekstensi pembangun rangkaian ketahanan sistem
Untuk menambahkan strategi ke dalam alur, panggil salah satu metode ekstensi Add* yang tersedia pada instans ResiliencePipelineBuilder.
-
AddRetry: Coba lagi jika ada yang gagal, yang berguna ketika masalah bersifat sementara dan mungkin hilang. -
AddCircuitBreaker: Berhenti mencoba jika ada sesuatu yang rusak atau sibuk, yang bermanfaat bagi Anda dengan menghindari waktu terbuang dan memperburuk keadaan. -
AddTimeout: Menyerah jika sesuatu membutuhkan waktu terlalu lama, yang dapat meningkatkan performa dengan membebaskan sumber daya. -
AddRateLimiter: Batasi berapa banyak permintaan yang Anda terima, yang memungkinkan Anda mengontrol beban masuk. -
AddConcurrencyLimiter: Batasi berapa banyak permintaan yang Anda buat, yang memungkinkan Anda mengontrol beban keluar. -
AddFallback: Lakukan hal lain saat mengalami kegagalan, yang meningkatkan pengalaman pengguna. -
AddHedging: Terbitkan beberapa permintaan jika terjadi latensi atau kegagalan tinggi, yang dapat meningkatkan responsivitas.
Untuk informasi selengkapnya, lihat Strategi ketahanan. Misalnya, lihat Membangun aplikasi HTTP tangguh: Pola pengembangan utama.
Pengayaan metrik
Pengayaan adalah augmentasi telemetri otomatis dengan keadaan yang sudah dikenal, dalam bentuk pasangan nama/nilai. Misalnya, aplikasi mungkin memancarkan log yang menyertakan operasi dan kode hasil sebagai kolom untuk mewakili hasil dari beberapa operasi. Dalam situasi ini dan tergantung pada konteks periferal, pengayaan menambahkan Nama kluster, Nama proses, Wilayah, ID Penyewa, dan lainnya ke log saat dikirim ke backend telemetri. Saat pengayaan ditambahkan, kode aplikasi tidak perlu melakukan apa pun tambahan untuk mendapatkan manfaat dari metrik yang diperkaya.
Cara kerja proses pengayaan
Bayangkan 1.000 instans layanan yang didistribusikan secara global menghasilkan log dan metrik. Saat Anda mengalami masalah di dasbor layanan, sangat penting untuk mengidentifikasi wilayah atau pusat data yang bermasalah dengan cepat. Pengayaan memastikan bahwa rekaman metrik berisi informasi yang diperlukan untuk menentukan kegagalan dalam sistem terdistribusi. Tanpa pengayaan, beban jatuh pada kode aplikasi untuk mengelola status ini secara internal, mengintegrasikannya ke dalam proses pengelogan, dan mengirimkannya secara manual. Pengayaan menyederhanakan proses ini, menanganinya dengan lancar tanpa memengaruhi logika aplikasi.
Dalam kasus resiliensi, ketika Anda menambahkan pengayaan, dimensi berikut ditambahkan ke dalam telemetri keluar:
-
error.type: Versi kardinalitas rendah dari informasi pengecualian. -
request.name: Nama permintaan. -
request.dependency.name: Nama dependensi.
Di bawah sampul, pengayaan ketahanan dibangun di atas Telemetri MeteringEnricherPolly. Untuk informasi selengkapnya, lihat Polly: Pengayaan pengukuran.
Menambahkan pengayaan ketahanan
Selain mendaftarkan alur ketahanan, Anda juga dapat mendaftarkan pengayaan ketahanan. Untuk menambahkan pengayaan, panggil metode ekstensi dari AddResilienceEnricher(IServiceCollection) pada instans IServiceCollection.
services.AddResilienceEnricher();
Dengan memanggil metode ekstensi AddResilienceEnricher, Anda menambahkan dimensi di atas dimensi default yang dibangun ke dalam pustaka Polly dasarnya. Dimensi pengayaan berikut ditambahkan:
- Pengayaan pengecualian berdasarkan IExceptionSummarizer, yang menyediakan mekanisme untuk meringkas pengecualian untuk digunakan dalam telemetri. Untuk informasi selengkapnya, lihat Ringkasan pengecualian.
- Minta pengayaan metadata berdasarkan RequestMetadata, yang menampung metadata permintaan untuk telemetri. Untuk informasi selengkapnya, lihat Polly: Metrik Telemetri.
Menggunakan jalur ketahanan
Untuk menggunakan alur ketahanan yang dikonfigurasi, Anda harus mendapatkan alur dari ResiliencePipelineProvider<TKey>. Ketika Anda menambahkan pipeline sebelumnya, key adalah jenis string, jadi Anda harus memperoleh pipeline dari ResiliencePipelineProvider<string>.
using ServiceProvider provider = services.BuildServiceProvider();
ResiliencePipelineProvider<string> pipelineProvider =
provider.GetRequiredService<ResiliencePipelineProvider<string>>();
ResiliencePipeline pipeline = pipelineProvider.GetPipeline(key);
Kode sebelumnya:
- Membangun
ServiceProviderdari instansServiceCollection. - Mendapatkan
ResiliencePipelineProvider<string>dari penyedia layanan. - Mengambil
ResiliencePipelinedariResiliencePipelineProvider<string>.
Jalankan proses berkelanjutan ketahanan
Untuk menggunakan alur ketahanan, panggil salah satu metode yang tersedia Execute* pada ResiliencePipeline instance. Misalnya, pertimbangkan contoh panggilan ke ExecuteAsync metode:
await pipeline.ExecuteAsync(static cancellationToken =>
{
// Code that could potentially fail.
return ValueTask.CompletedTask;
});
Kode yang mendahului menjalankan delegasi di dalam metode ExecuteAsync. Ketika ada kegagalan, strategi yang dikonfigurasi dijalankan. Misalnya, jika RetryStrategy dikonfigurasi untuk mencoba kembali tiga kali, delegasi dijalankan empat kali (satu upaya awal ditambah tiga upaya percobaan ulang) sebelum kegagalan diteruskan.