Simulation and rate limiting

NuGet Package:
NServiceBus.Transport.NonDurable 1.x
Target Version:
NServiceBus 10.x

The NonDurableBroker supports optional simulation settings for testing resilience scenarios. Simulation can introduce artificial delays or rejections on send, receive, and delayed delivery operations. Combined with a fake time provider, tests can simulate the passage of time deterministically.

Basic simulation

Configure rate limiting with a fixed window:

var broker = new NonDurableBroker(new NonDurableBrokerOptions
{
    Send =
    {
        Mode = NonDurableSimulationMode.Delay,
        RateLimit = new NonDurableRateLimitOptions
        {
            PermitLimit = 1,
            Window = TimeSpan.FromSeconds(5)
        }
    },
    Receive =
    {
        Mode = NonDurableSimulationMode.Reject,
        RateLimit = new NonDurableRateLimitOptions
        {
            PermitLimit = 0,
            Window = TimeSpan.FromSeconds(30)
        }
    }
});

endpointConfiguration.UseTransport(new NonDurableTransport(new NonDurableTransportOptions(broker)));

Simulating the passage of time

Use FakeTimeProvider to advance time deterministically in tests:

var simulatedTime = new FakeTimeProvider(DateTimeOffset.UtcNow);

var broker = new NonDurableBroker(new NonDurableBrokerOptions
{
    TimeProvider = simulatedTime,
    Send =
    {
        Mode = NonDurableSimulationMode.Delay,
        RateLimit = new NonDurableRateLimitOptions
        {
            PermitLimit = 1,
            Window = TimeSpan.FromSeconds(5)
        }
    }
});

// In tests, advance time to trigger delayed operations
// simulatedTime.Advance(TimeSpan.FromSeconds(5));

endpointConfiguration.UseTransport(new NonDurableTransport(new NonDurableTransportOptions(broker)));

Per-queue rate limit overrides

Apply different simulation settings to specific queues:

var options = new NonDurableBrokerOptions
{
    Send =
    {
        RateLimit = new NonDurableRateLimitOptions
        {
            PermitLimit = 1,
            Window = TimeSpan.FromSeconds(30)
        }
    }
};

// Override the default rate limit for a specific queue
options.ForQueue("orders").Send.RateLimit = new NonDurableRateLimitOptions
{
    PermitLimit = 10,
    Window = TimeSpan.FromSeconds(30)
};

var broker = new NonDurableBroker(options);
endpointConfiguration.UseTransport(new NonDurableTransport(new NonDurableTransportOptions(broker)));

Delayed delivery simulation

Control the timing of delayed message delivery:

var simulatedTime = new FakeTimeProvider(DateTimeOffset.UtcNow);

var broker = new NonDurableBroker(new NonDurableBrokerOptions
{
    TimeProvider = simulatedTime,
    DelayedDelivery =
    {
        Mode = NonDurableSimulationMode.Delay,
        RateLimit = new NonDurableRateLimitOptions
        {
            PermitLimit = 1,
            Window = TimeSpan.FromSeconds(5)
        }
    }
});

endpointConfiguration.UseTransport(new NonDurableTransport(new NonDurableTransportOptions(broker)));