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)));