Ana içeriğe geç

Chaos Engineering

Chaos Engineering, bir sistemin dayanıklılığını test etmek ve hatalara karşı nasıl davrandığını anlamak için tasarlanmış bir disiplindir. Polly ile hata simülasyonu, gecikme enjekte etme ve başarısızlık oranlarını artırma gibi stratejiler uygulanabilir.


1. Polly ile Ağ Gecikmesi Simülasyonu

Gecikme enjekte ederek sistemi yüksek gecikme koşullarında test edin.

Örnek: Rastgele Gecikme Ekleme

var latencyPolicy = Policy
    .InjectLatencyAsync(
        enabled: _ => true,
        injectionRate: 0.4, // %40 olasılıkla gecikme
        latency: _ => TimeSpan.FromMilliseconds(new Random().Next(500, 2000))); // 500ms - 2000ms arasında gecikme

await latencyPolicy.ExecuteAsync(async () =>
{
    Console.WriteLine("Request started...");
    await Task.Delay(100); // Gerçek iş mantığı
    Console.WriteLine("Request completed.");
});

2. Polly ile Hata Enjeksiyonu

Belirli bir olasılıkla hata oluşturun ve sistemin nasıl tepki verdiğini analiz edin.

Örnek: Simüle Edilmiş Hatalar

var faultPolicy = Policy
    .InjectFaultAsync(
        enabled: _ => true,
        injectionRate: 0.3, // %30 olasılıkla hata
        fault: _ => new Exception("Simulated fault!"));

await faultPolicy.ExecuteAsync(async () =>
{
    Console.WriteLine("Processing request...");
    await Task.Delay(200); // Gerçek iş mantığı
    Console.WriteLine("Request successfully processed.");
});

3. Polly ile Gecikme ve Hata Kombinasyonu

Gecikme ve hata enjeksiyonunu birleştirerek daha karmaşık senaryolar oluşturabilirsiniz.

Örnek: Karmaşık Simülasyon

var combinedPolicy = Policy.WrapAsync(
    Policy.InjectLatencyAsync(
        enabled: _ => true,
        injectionRate: 0.3,
        latency: _ => TimeSpan.FromSeconds(2)), // 2 saniye gecikme
    Policy.InjectFaultAsync(
        enabled: _ => true,
        injectionRate: 0.2, // %20 olasılıkla hata
        fault: _ => new Exception("Simulated fault!"))
);

await combinedPolicy.ExecuteAsync(async () =>
{
    Console.WriteLine("Executing operation...");
    await Task.Delay(150); // Gerçek iş mantığı
    Console.WriteLine("Operation completed.");
});

4. Polly ile Çalışma Yükü Testi

Sistemi yüksek yük altında test etmek için Chaos Engineering stratejileri kullanabilirsiniz.

Örnek: Toplu İstekler ve Hata Simülasyonu

var bulkPolicy = Policy.InjectFaultAsync(
    enabled: _ => true,
    injectionRate: 0.2,
    fault: _ => new Exception("Random fault injected!"));

var tasks = Enumerable.Range(1, 50).Select(async i =>
{
    try
    {
        await bulkPolicy.ExecuteAsync(async () =>
        {
            Console.WriteLine($"Processing request #{i}");
            await Task.Delay(100);
            Console.WriteLine($"Request #{i} completed.");
        });
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Request #{i} failed: {ex.Message}");
    }
});

await Task.WhenAll(tasks);

5. Polly ile Graceful Degradation (Kademeli Azalma)

Hizmetin tümden çökmesini engellemek için hata durumunda sınırlı bir hizmet sunabilirsiniz.

Örnek: Hata Durumunda Varsayılan Değer Döndürme

var fallbackPolicy = Policy<string>
    .Handle<Exception>()
    .FallbackAsync(
        fallbackValue: "Default value due to failure",
        onFallbackAsync: async (result, context) =>
        {
            Console.WriteLine("Fallback triggered: Returning default value.");
            await Task.CompletedTask;
        });

var result = await fallbackPolicy.ExecuteAsync(async () =>
{
    Console.WriteLine("Processing request...");
    throw new Exception("Simulated failure!"); // Hata oluştur
});

Console.WriteLine($"Result: {result}");

6. Polly ile Gecikmeli Yanıt ve Retry Politikaları

Kaotik koşullar altında tekrar denemeyi ve gecikmeli yanıtları birleştirin.

Örnek: Retry + Latency

var retryPolicy = Policy
    .Handle<Exception>()
    .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(retryAttempt));

var latencyPolicy = Policy
    .InjectLatencyAsync(
        enabled: _ => true,
        injectionRate: 0.5, // %50 olasılıkla gecikme
        latency: _ => TimeSpan.FromSeconds(1)); // 1 saniye gecikme

var combinedPolicy = Policy.WrapAsync(retryPolicy, latencyPolicy);

await combinedPolicy.ExecuteAsync(async () =>
{
    Console.WriteLine("Attempting operation...");
    await Task.Delay(200); // Gerçek iş mantığı
    Console.WriteLine("Operation completed.");
});