Ответ
Основное различие в том, что Exchange (обменник) отвечает за маршрутизацию сообщений, а Queue (очередь) — за их хранение до момента обработки.
Продюсер всегда отправляет сообщения в Exchange, а не напрямую в очередь. Exchange, на основе своего типа и правил (bindings), решает, в какие очереди направить сообщение.
-
Exchange (Обменник)
- Принимает сообщения от продюсеров.
- Маршрутизирует их в одну или несколько очередей.
- Логика маршрутизации определяется типом обменника:
direct
,fanout
,topic
,headers
.
-
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 — это почтовый ящик, где письма ждут своего получателя.