Search code examples
spring-bootrabbitmqamqprabbitmq-exchange

Why shouldn't I use rabbitmq topic exchanges for everything?


It seems like the worker pattern, fanout, and filtered topics can all be implemented with topic exchanges. Why would I ever use a direct or fanout exchange instead?

We would like to codify common patterns found in our org in a library that abstracts the infinite flexibility of amqp (naming conventions, defaulting to durable, sending common headers, expirations etc.). Should we leverage the different exchange types or implement all patterns with topics; why?

(We have consumers/publishers in Java via spring boot, in golang, and in php)


Solution

  • Why shouldn't I use rabbitmq topic exchanges for everything?

    nothing says you shouldn't. if it works for you, have fun with it!

    From my RabbitMQ: Layout ebook:

    The truth about exchange types is that there is no “master” type - not one to be used as a default, or most of the time. Sure, a given application may have its needs served by a single exchange or exchange type, but this will not always be the case. Even with in a single system, there may be a need to route messages in different ways and have them end up in the same queue.

    If you find yourself in a situation where choosing one of the above exchange types will preclude a needed set of routing behaviors for your messages, use more than one exchange. You can route from any number of exchanges to a single queue, or from a single exchange to any number of queues.

    Don’t limit your systems routing needs to a single exchange type for any given message or destination. Take advantage of each one, as needed.

    On the different exchange types (again, from my ebook)

    Direct:

    A direct exchange allows you to bind a queue to an exchange with a routing key that is matched, case sensitively. This may be the most straight-forward exchange of them all, as there is no pattern matching or other behavior to track and consider. If a routing key from a message matches the routing key of a binding in the exchange, the message is routed.

    Fanout:

    Fanout exchanges allow you to broadcast a message to every queue bound to an exchange, with no way to filter which queues receive the message. If a queue is bound to a fanout exchange, it will receive any message published through that exchange.

    and topic exchanges:

    A topic exchange is similar to a direct exchange in that it uses routing keys. Unlike a direct exchange, though, the routing keys do not have to match exactly for a message to be routed. Topic exchanges allow you to specify wild-card matching of “topics” (routing keys) in your bindings. This lets you receive messages from more than one routing key and provides a level of flexibility not found in the other exchange types.