/ blog

# Messaging Queues

There is a large group of technologies called Message-Oriented Middleware (MOM) that includes tech like RPC (Remote Procedure Call) and Messaging Queues.

# Rabbit MQ

# AMQP 0-9-1

AMQP 0-9-1 is the primary protocol supported by rabbit. It allows client applications to communicate with messaging middleware brokers.

Brokers receive messages from publishers (aka producers) and route them to consumers.

At a high level, publishers send messages to a broker managed "exchange", and then the exchange copies each message to specific queues, using a routing rule-set called bindings. Consumers can either be notified of new messages in a queue they subscribe to, or they can poll on demand.

Consumers are responsible for acknowledging to the broker that they got the message. If a message sits for a long time in a queue it can be returned to sender or placed in a dead letter queue.

AMQP exchanges can be durable or transient and come in four types:

Queues bind to exchanges with "bindings", and each queue can have many binding rules.

# Direct Exchange

A direct exchange uses a messages "routing key" to send it to any queue that is bound to the exchange with a matching routing key. If multiple queues are bound to that key then multiple copies of the message are created.

# Fanout Exchange

Fanout routes the message to all queues bound to it. Routing keys are ignored.

# Topic Exchange

Topic exchanges route the message to any queue if the messages routing key fits the binding pattern that the queue used when it was bound.

# Headers Exchange

Headers is like direct but uses multiple headers rather than one routing key.

# Best Practices

Having more queues and clients requires more CPU context switching, so prefer less queues and clients for higher throughput with less resources.

Rabbit will not be a performance bottleneck until > 1000 messages a second. Keep Rabbit empty for best performance.

Small messages are best from a network perspective.

Rabbit uses a "fifth queue" system to write messages to disk as the queue fills up. Pretty cool read here: https://blog.rabbitmq.com/posts/2011/10/performance-of-queues-when-less-is-more/

# Performance tips:

https://www.cloudamqp.com/blog/part1-rabbitmq-best-practice.html