Как упомянул Брайан, обмен не хранит сообщения и в основном отвечает за маршрутизацию сообщений либо в другой обмен, либо в очередь. Если обмен не привязан к очереди, все сообщения, отправленные на этот обмен, будут «потеряны»
Вам не нужно объявлять фиксированные клиентские очереди в скрипте издателя, поскольку это может не масштабироваться. Ваши издатели могут динамически создавать очереди и маршрутизировать их с помощью привязки обмена к обмену.
RabbitMQ поддерживает привязки обмена к обмену, что обеспечивает гибкость топологии, развязку и другие преимущества. Вы можете прочитать больше здесь на RabbitMQ Exchange для биржевых привязок [AMPQ]
Связывание RabbitMQ Exchange to Exchange
Пример кода Python для создания привязки обмена к обмену с сохранением, если в очереди нет ни одного потребителя.
#!/usr/bin/env python
import pika
import sys
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
#Declares the entry exchange to be used by all producers to send messages. Could be external producers as well
channel.exchange_declare(exchange='data_gateway',
exchange_type='fanout',
durable=True,
auto_delete=False)
#Declares the processing exchange to be used.Routes messages to various queues. For internal use only
channel.exchange_declare(exchange='data_distributor',
exchange_type='topic',
durable=True,
auto_delete=False)
#Binds the external/producer facing exchange to the internal exchange
channel.exchange_bind(destination='data_distributor',source='data_gateway')
##Create Durable Queues binded to the data_distributor exchange
channel.queue_declare(queue='trade_db',durable=True)
channel.queue_declare(queue='trade_stream_service',durable=True)
channel.queue_declare(queue='ticker_db',durable=True)
channel.queue_declare(queue='ticker_stream_service',durable=True)
channel.queue_declare(queue='orderbook_db',durable=True)
channel.queue_declare(queue='orderbook_stream_service',durable=True)
#Bind queues to exchanges and correct routing key. Allows for messages to be saved when no consumer is present
channel.queue_bind(queue='orderbook_db',exchange='data_distributor',routing_key='*.*.orderbook')
channel.queue_bind(queue='orderbook_stream_service',exchange='data_distributor',routing_key='*.*.orderbook')
channel.queue_bind(queue='ticker_db',exchange='data_distributor',routing_key='*.*.ticker')
channel.queue_bind(queue='ticker_stream_service',exchange='data_distributor',routing_key='*.*.ticker')
channel.queue_bind(queue='trade_db',exchange='data_distributor',routing_key='*.*.trade')
channel.queue_bind(queue='trade_stream_service',exchange='data_distributor',routing_key='*.*.trade')