Skip to content

Publish With Routing Keys

Routing keys allow messages to be routed selectively.

They are mainly used with:

  • direct exchanges;
  • topic exchanges.

Direct Routing

A direct exchange routes messages when the routing key matches exactly.

graph LR
    Publisher --> Exchange["orders"]
    Exchange -->|"orders.created"| Created["orders.created.queue"]
    Exchange -->|"orders.updated"| Updated["orders.updated.queue"]
var descriptor = new PublisherBoundDescriptor
{
    Exchanges =
    {
        new ExchangeBoundDescriptor
        {
            Name = "orders",
            Type = ExchangeTypes.Direct,
            Durable = true,
            Queues =
            {
                new QueueBoundDescriptor
                {
                    Name = "orders.created.queue",
                    Durable = true,
                    AutoDelete = false,
                    Binder = new BinderDescriptor
                    {
                        RoutingKey = "orders.created"
                    }
                },
                new QueueBoundDescriptor
                {
                    Name = "orders.updated.queue",
                    Durable = true,
                    AutoDelete = false,
                    Binder = new BinderDescriptor
                    {
                        RoutingKey = "orders.updated"
                    }
                }
            }
        }
    }
};

Topic Routing

A topic exchange routes messages using wildcard patterns.

graph TD
    Message["orders.eu.created"]
    Message --> EU["orders.eu.*"]
    Message --> AllOrders["orders.#"]
var descriptor = new PublisherBoundDescriptor
{
    Exchanges =
    {
        new ExchangeBoundDescriptor
        {
            Name = "orders",
            Type = ExchangeTypes.Topic,
            Durable = true,
            Queues =
            {
                new QueueBoundDescriptor
                {
                    Name = "orders.eu.queue",
                    Durable = true,
                    AutoDelete = false,
                    Binder = new BinderDescriptor
                    {
                        RoutingKey = "orders.eu.*"
                    }
                },
                new QueueBoundDescriptor
                {
                    Name = "orders.all.queue",
                    Durable = true,
                    AutoDelete = false,
                    Binder = new BinderDescriptor
                    {
                        RoutingKey = "orders.#"
                    }
                }
            }
        }
    }
};

Routing Key Naming

Prefer meaningful routing keys.

orders.created
orders.updated
payments.authorized
payments.completed

For topic exchanges, prefer hierarchical names.

orders.eu.created
orders.eu.updated
orders.us.created
orders.us.updated

Avoid

event1
event2
test
message

Routing keys should express business intent.