Skip to content

The search box in the website knows all the secrets—try it!

For any queries, join our Discord Channel to reach us faster.

JasperFx Logo

JasperFx provides formal support for Wolverine and other JasperFx libraries. Please check our Support Plans for more details.

Fair Queues

Amazon SQS fair queues let a standard queue mitigate "noisy neighbor" problems in multi-tenant workloads. By assigning a MessageGroupId to each message, SQS spreads dwell time more fairly across groups so that one tenant generating a large backlog does not starve the others. Unlike FIFO queues, fair queues imply no ordering or deduplication semantics — they keep standard queue throughput while improving fairness.

Enabling Fair Queues

Wolverine already maps Envelope.GroupId to the SQS MessageGroupId for FIFO queues. For a standard queue this mapping is opt-in via EnableFairQueueMessageGroups(), so existing standard queues are unaffected unless you ask for it:

cs
opts.PublishMessage<OrderPlaced>()
    .ToSqsQueue("orders")
    .EnableFairQueueMessageGroups();

Once enabled, set the group id the same way you would for a FIFO queue — typically a tenant id — through DeliveryOptions:

cs
await messageBus.PublishAsync(new OrderPlaced(orderId), new DeliveryOptions
{
    GroupId = tenantId
});

The group id can also be assigned with message partitioning rather than per-publish.

TIP

EnableFairQueueMessageGroups() only affects standard queues. FIFO queues (names ending in .fifo) always map MessageGroupId and MessageDeduplicationId regardless of this setting.

Customizing the Group Id

The group id is derived through the endpoint's ISqsEnvelopeMapper via DetermineGroupId(Envelope), which returns Envelope.GroupId by default. A custom mapper can override it to source the group id from a header, the message body, or a tenant id when interoperating with non-Wolverine systems.

Released under the MIT License.