Skip to content

⚙️ Configuration

This guide explains how to configure CoreSystem.Resilience.

You'll learn how to:

  • Register the framework
  • Configure resilience pipelines
  • Configure Retry, Timeout, and Circuit Breaker strategies
  • Register multiple pipelines
  • Configure the framework using appsettings.json
  • Follow recommended production settings

Configuration Overview

The framework is configured through the AddResilience() extension.

builder.Services.AddResilience(options =>
{
    // Configure your resilience pipelines here.
});

A resilience pipeline is identified by a PipelineType and can contain one or more resilience strategies.


Creating a Pipeline

Register a new pipeline by specifying its type and configuring the desired strategies.

builder.Services.AddResilience(options =>
{
    options.AddPipeline(PipelineType.Redis, pipeline =>
    {
        pipeline.AddRetry(retry =>
        {
            retry.MaxRetryAttempts = 3;
        });

        pipeline.AddTimeout(timeout =>
        {
            timeout.Timeout = TimeSpan.FromSeconds(2);
        });

        pipeline.AddCircuitBreaker(circuitBreaker =>
        {
            circuitBreaker.FailureRatio = 0.5;
        });
    });
});

The framework builds the pipeline during application startup and registers it for dependency injection.


Registering Multiple Pipelines

Applications can register multiple independent resilience pipelines.

builder.Services.AddResilience(options =>
{
    options.AddPipeline(PipelineType.Redis, pipeline =>
    {
        pipeline.AddRetry(retry =>
        {
            retry.MaxRetryAttempts = 3;
        });
    });

    options.AddPipeline(PipelineType.Http, pipeline =>
    {
        pipeline.AddTimeout(timeout =>
        {
            timeout.Timeout = TimeSpan.FromSeconds(10);
        });
    });
});

Each pipeline can be resolved independently through IResiliencePipelineProvider.


Retry Configuration

Configure retry behavior for transient failures.

pipeline.AddRetry(retry =>
{
    retry.Enabled = true;

    retry.MaxRetryAttempts = 3;

    retry.Delay = TimeSpan.FromMilliseconds(500);

    retry.BackoffType = BackoffType.Exponential;

    retry.UseJitter = true;
});

Configuration Options

Option Description Default
Enabled Enables or disables the strategy true
MaxRetryAttempts Maximum retry attempts 3
Delay Initial retry delay 500 ms
BackoffType Delay calculation strategy Exponential
UseJitter Randomizes retry delays true

Timeout Configuration

Configure the maximum execution time allowed for protected operations.

pipeline.AddTimeout(timeout =>
{
    timeout.Enabled = true;

    timeout.Timeout = TimeSpan.FromSeconds(5);
});

Configuration Options

Option Description Default
Enabled Enables or disables the strategy true
Timeout Maximum execution time 30 seconds

Circuit Breaker Configuration

Protect downstream services by temporarily blocking requests after repeated failures.

pipeline.AddCircuitBreaker(circuitBreaker =>
{
    circuitBreaker.Enabled = true;

    circuitBreaker.FailureRatio = 0.5;

    circuitBreaker.MinimumThroughput = 10;

    circuitBreaker.BreakDuration = TimeSpan.FromSeconds(30);

    circuitBreaker.SamplingDuration = TimeSpan.FromMinutes(1);
});

Configuration Options

Option Description Default
Enabled Enables or disables the strategy true
FailureRatio Failure threshold before opening the circuit 0.5
MinimumThroughput Minimum requests before evaluation 10
SamplingDuration Evaluation window 1 minute
BreakDuration Time the circuit remains open 30 seconds

Handling Exceptions

Each strategy can be configured to handle only specific exception types.

pipeline.AddRetry(retry =>
{
    retry.Handle<TimeoutException>();

    retry.Handle<HttpRequestException>();
});

Or multiple exception types.

retry.Handle(
    typeof(HttpRequestException),
    typeof(TimeoutException));

Only matching exceptions will trigger the configured strategy.


Using appsettings.json

The framework supports configuration binding using the .NET Options pattern.

Example:

{
  "Core": {
    "Resilience": {
      "Pipelines": {
        "Redis": {
          "Retry": {
            "Enabled": true,
            "MaxRetryAttempts": 3,
            "Delay": "00:00:00.500",
            "BackoffType": "Exponential",
            "UseJitter": true
          },
          "Timeout": {
            "Enabled": true,
            "Timeout": "00:00:05"
          },
          "CircuitBreaker": {
            "Enabled": true,
            "FailureRatio": 0.5,
            "MinimumThroughput": 10,
            "SamplingDuration": "00:01:00",
            "BreakDuration": "00:00:30"
          }
        }
      }
    }
  }
}

Bind the configuration.

builder.Services
    .AddOptions<ResilienceOptions>()
    .Bind(builder.Configuration.GetSection("Core:Resilience"))
    .PostConfigure(options =>
    {
        options.ResolveHandledExceptions();
    });

builder.Services.AddResilience();

Resolving Pipelines

Resolve a configured pipeline using dependency injection.

public sealed class ProductService(
    IResiliencePipelineProvider provider)
{
    private readonly IResiliencePipeline _pipeline =
        provider.GetPipeline(PipelineType.Redis);
}

Execute protected operations.

await _pipeline.ExecuteAsync(async cancellationToken =>
{
    await repository.GetAsync(cancellationToken);
});

Staging

Strategy Recommendation
Retry 3 attempts
Timeout 10 seconds
Circuit Breaker Enabled

Production

Strategy Recommendation
Retry Exponential backoff with jitter
Timeout Based on SLA
Circuit Breaker Enabled
Metrics Enabled
OpenTelemetry Enabled

Best Practices

✅ Create one pipeline per infrastructure dependency.

✅ Configure retries only for transient failures.

✅ Always combine Retry with Timeout.

✅ Enable Circuit Breaker for external services.

✅ Use exponential backoff with jitter.

✅ Monitor resilience metrics using OpenTelemetry.

✅ Keep pipeline configurations consistent across environments.