BROKABROKA
Sign inDownload CommunityPricing
Documentation120 pagesOlder version — go to 1.3.2
Guides

Bindings and routing

Updated 2 October 2026 · applies to 1.0.0 · Commercial

A binding is the rule that connects an exchange to a queue — or to another exchange. The Routing screen draws them all at once, together with every exchange in the virtual host — including one that nothing is bound to, because that is the exchange discarding what is published to it.

The graph

Exchanges and queues are laid out left to right, with one curve per binding and the routing key written on it. Horizontal distance is hop count: every arrow runs left to right, and an object sits one column right of its furthest predecessor.

That is what makes an exchange-to-exchange hop visible as a shape rather than as a detail you have to reconstruct — a message entering on the left and arriving two columns over has passed through something on the way.

A graph has a size it is drawn at. Above a thousand bindings or objects nothing is drawn, and the page says how many there are and to pick an exchange under Publish through: a graph cut off part way would show exchanges whose arrows were dropped as exchanges that route nowhere.

Reading it

Routing keys are drawn on their own curves, and the ? beside the page title explains the two wildcards in prose rather than assuming them: a * matches one word, a # matches zero or more. A fanout exchange's arrows carry no label, because it ignores the key; a headers exchange's read headers; and (auto) marks a key the broker generated for its own wiring, such as a federation link's. An (auto) label is drawn only while you point at its arrow or at its exchange, and the arrow carries the full key on hover. Pointing at an exchange lights up its arrows and fades the rest. The count of bindings and objects drawn sits at the right of the controls.

Three controls narrow what you are looking at:

Publish through takes one exchange and keeps everything reachable from it, following exchange-to-exchange hops. It answers "if I publish here, where can it end up". The graph opens on one exchange — the first by name that someone declared, not the default exchange, an amq.* one or an internal one — and Everything draws the whole virtual host.

Include the default exchange is off by default, and the reason is stated: the broker binds every queue to the default exchange automatically, under the queue's own name. Nobody configured those, and drawing them hides the routing that somebody did.

Show internal is off by default too, and counts what it leaves out: the amq.* exchanges the broker creates in every virtual host, and the internal exchanges a federation link or shovel declares for itself, are left out unless asked for, and each one drawn carries the Internal badge. A binding an operator made from an amq.* exchange is still drawn.

The Routing graph for the broka.dev vhost with Publish through set to the topic exchange trades, Include the default exchange clear and Show internal (7) beside it: 7 bindings across 8 objects in three columns — trades on the left; in the middle the fanout exchange notifications and the queues trade.allocations, trade.confirmations and trade.corrections, reached by curves labelled trade.allocate.comple…, trade.confirm.*, trade.allocate.* and trade.correct.*; and on the right the three client.notifications queues that notifications fans out to, on unlabelled arrows.
Drawn one vhost at a time, because two vhosts can each hold an exchange called orders with nothing in common.

One vhost at a time

Routing is drawn per virtual host, and the screen refuses to combine them: with All vhosts selected in the header it asks you to pick one. Two vhosts can each hold an exchange called orders with nothing in common, so a combined graph would join names that never meet.

From a queue's side

A queue's own page answers the other direction — where these messages come from — listing each source exchange and its routing key.

Three renderings, because an empty routing key means three different things depending on where it is: the key itself, matched on headers where the binding carries arguments, and (no routing key) where it genuinely has none.

Adding a binding

A binding is added from the exchange it starts at: Bindings in the exchange's row menu, then New binding. Choose whether the destination is a queue or another exchange — a stream is bound as a queue — pick it from the queues or exchanges in the exchange's virtual host — the search box narrows a long list — and give the routing key; the ? beside it says how this exchange's type reads the key. On a headers exchange you also choose x-match — all, any, all-with-x or any-with-x — and give the arguments as a JSON object. Under all and any the broker ignores arguments whose names start with x-, and a headers binding left with nothing to match on routes every message, so the dialog warns before you create one.

Bind to orders over the Exchanges list: the sentence that a binding is the routing rule itself, Destination set to queue and Name to orders.audit, the routing key order.cancelled, Arguments an empty JSON object, a help mark beside Destination, Routing key and Arguments, and Cancel beside Bind.
The help beside the key is this exchange's own: orders is a topic exchange, so the key is a pattern.

Nothing can be bound to the default exchange: the broker binds every queue to it automatically and refuses anything else, and the dialog says so rather than letting the refusal arrive as an access error.

Removing a binding

A binding can be removed from the same dialog, with Unbind in its row's ⋯ menu, once a reason is given below the list. The audit entry ends with the consequence rather than the parameters: messages matching it are no longer routed there.

Both appear only for someone allowed to change this cluster, and not in a read-only environment or on a read-only connection; otherwise New binding is locked, with the reason on hover.

← PreviousExchangesNext →Dead-letter flows