Provides support for sending messages over RabbitMQ using the RabbitMQ .NET Client.
Broker compatibility
The transport is compatible with RabbitMQ broker version 3.10.0 or higher, either self-hosted or running on CloudAMQP.
The stream_queue
and quorum_queue
feature flags must be enabled because the delay infrastructure requires at-least-once dead lettering.
The broker requirements can be verified with the delays verify
command provided by the command line tool.
Running on Amazon MQ is not supported because it does not support streams.
Transport at a glance
Feature | |
---|---|
Transactions | None, ReceiveOnly |
Pub/Sub | Native |
Timeouts | Native |
Large message bodies | Broker can handle arbitrary message size within available resources, very large messages via data bus |
Scale-out | Competing consumer |
Scripted Deployment | Not supported |
Installers | Mandatory |
Native integration | Supported |
Configuring the endpoint
To use RabbitMQ as the underlying transport:
endpointConfiguration.UseTransport<RabbitMQTransport>();
The RabbitMQ transport requires a connection string to connect to the broker. A clustered configuration is recommended. See connection settings for options on how to provide the connection string.
The existing API surface with UseTransport
is supported via a shim API to ease migration. However, it is recommended to switch to the new transport configuration API to prepare for future upgrades of NServiceBus.
Routing topology
Routing topologies are used to control how queues, exchanges, and bindings are created on the RabbitMQ broker. Selecting a routing topology is mandatory. For new deployments, the ConventionalRoutingTopology
(previously the default) should be selected:
var transport = endpointConfiguration.UseTransport<RabbitMQTransport>();
transport.UseConventionalRoutingTopology(QueueType.Quorum);
See the routing topology documentation for further details.
Advantages and disadvantages
Advantages
- Provides native reliability and high-availability features.
- Offers a native publish-subscribe mechanism; therefore it doesn't require NServiceBus persistence for storing event subscriptions.
- Wide range of supported clients allows for integrating the system with applications written in other languages using native RabbitMQ features.
- Supports the competing consumers pattern out of the box. Messages are received by instances in a round-robin fashion without additional configuration.
Disadvantages
- Doesn't handle network partitions well; partitioning across a WAN requires dedicated features.
- Requires careful consideration for duplicate messages, e.g. using the outbox feature or making all endpoints idempotent.
- Many organizations don't have the same level of expertise with RabbitMQ as with other technologies, such as SQL Server, so it may require additional training.
- May require additional costs of commercial RabbitMQ license and support.
Controlling delivery mode
In AMQP the delivery_mode
controls how the broker treats the message from a durability standpoint. NServiceBus will default to persistent
in order to prevent message loss. To optimize for higher throughput this can be changed to non-persistent
.
Any failure in transmission or issues in the broker will result in the message being lost
To request non-persistent
delivery, use the following {Send|Publish|Reply}Options
as shown below.
var options = new SendOptions();
options.RouteToThisEndpoint();
options.UseNonPersistentDeliveryMode();
await context.Send(new MyMessage(), options);