В чем разница между Exchange и Queue в RabbitMQ

Ответ

Основное различие в том, что Exchange (обменник) отвечает за маршрутизацию сообщений, а Queue (очередь) — за их хранение до момента обработки.

Продюсер всегда отправляет сообщения в Exchange, а не напрямую в очередь. Exchange, на основе своего типа и правил (bindings), решает, в какие очереди направить сообщение.

  1. Exchange (Обменник)

    • Принимает сообщения от продюсеров.
    • Маршрутизирует их в одну или несколько очередей.
    • Логика маршрутизации определяется типом обменника: direct, fanout, topic, headers.
  2. Queue (Очередь)

    • Хранит сообщения, полученные от Exchange.
    • Является буфером, из которого консьюмеры забирают сообщения для обработки.

Связь между ними устанавливается через Binding — правило, которое указывает Exchange, в какую очередь отправлять сообщения с определенным ключом маршрутизации (routing_key).

Пример на Python с pika:

import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# 1. Объявляем Exchange типа 'fanout' (отправляет всем подписчикам)
channel.exchange_declare(exchange='logs', exchange_type='fanout')

# 2. Объявляем временную очередь с уникальным именем
result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.method.queue

# 3. Создаем Binding: связываем нашу очередь с Exchange 'logs'
channel.queue_bind(exchange='logs', queue=queue_name)

# 4. Продюсер публикует сообщение в Exchange, а не в очередь
channel.basic_publish(exchange='logs', routing_key='', body='Hello World!')

# Консьюмер будет читать сообщения из 'queue_name'

Таким образом, Exchange — это почтовое отделение, сортирующее письма, а Queue — это почтовый ящик, где письма ждут своего получателя.