The routing subsystem is responsible for finding destinations for messages. In most cases, the code which sends messages should not specify the destination of the message being sent:
var bus = Bus.Create(busConfiguration).Start(); var myMessage = new MyMessage(); bus.Send(myMessage);
Based on the type of the message, the routing subsystem will provide the destination address.
As described in messages, events and commands, NServiceBus distinguishes between these kinds of messages. Command messages are always routed to a single logical endpoint.
Command routing can be configured via MessageEndpointMappings.
Per-namespace routes override assembly-level routes while per-type routes override both namespace and assembly routes.
In specific cases, like sending to the same endpoint or to a specific queue (e.g. for integration purposes), the routing configuration can be overridden when sending a given message. Refer to documentation on sending messages for further details.
When events are published, they can be received by multiple logical endpoints. However, even in cases where those logical endpoints are scaled out, each event will be received by only one physical instance of a specific logical subscriber. It is important to note that before the event is published and delivered, the subscriber has to express its interest in that event by having a message handler for it.
Multicast transports support the Publish-Subscribe pattern natively. In this case the subscriber uses the APIs of the transport to create a route for a given subscribed message type.
EndpointOrientedTopologyrequires publisher names to be configured.
Other transports do not support Publish-Subscribe natively. These transports emulate the publish behavior by sending message to each subscriber directly. To do this, the publisher endpoint has to know its subscribers and subscribers have to notify the publisher about their interest in a given event type. The notification message (known as the subscribe message) has to be routed to the publisher.
Subscribe message routing can be configured in a configuration section by registering publishers for a given type, namespace or assembly containing events.
UnicastBusConfig/ configuration section, publishers are registered in the same way as the command destinations are defined. If a given assembly or namespace contains both events and commands, the mapping will recognize that fact and configure the routing correctly (both commands and subscribe messages will be routed to the destination specified in the
MessageEndpointMappings routing configuration can also take advantage of message inheritance: base types "inherit" routes from the derived types (opposite to member inheritance in .NET). If both
EventTwo inherit from
BaseEvent, when subscribing to
BaseEvent the subscription messages are sent to publishers of both
Reply message are always routed based on the
ReplyTo header of the initial message regardless of the endpoint's routing configuration. Only the sender of the initial message can influence the routing of a reply. Refer to documentation on sending messages for further details.
When using a message broker, multiple instances of a scaled-out endpoint are consuming from the same address via the competing consumer model.
To address specific instances of a scaled-out endpoint, instances can be configured to be individually addressable by providing a unique discriminator to each instance:
The following queues will be created for endpoint
Sales configured with discriminator
var endpointConfiguration = new EndpointConfiguration("Sales"); endpointConfiguration.MakeInstanceUniquelyAddressable("B");
Uniquely addressable instances are used for callbacks but can be used for other purposes like data partitioning with processing affinity or a form or processing prioritization.
var options = new SendOptions(); options.RouteToThisInstance() options.RouteToSpecificInstance("B"); endpointInstance.Send(new MyMessage(), options);
- Avoid hard-coding the discriminator when sending messages.
- Avoid using
MakeInstanceUniquelyAddressablefor priority queues.
- Consider using routing extensibility for routing to specific instances.