正如Brian所述,交换机不会存储消息,主要负责将消息路由到其他交换机/队列。如果交换机未绑定到队列,则发送到该交换机的所有消息都将“丢失”。
您不应该需要在发布者脚本中声明固定的客户端队列,因为这可能不可扩展。队列可以由您的发布者动态创建,并使用交换到交换绑定在内部路由。
RabbitMQ支持交换到交换绑定,可以实现拓扑灵活性、解耦和其他优点。您可以在此处阅读更多信息:RabbitMQ Exchange to Exchange Bindings [AMPQ]
RabbitMQ Exchange To Exchange Binding
![Example Topology](https://istack.dev59.com/1lX1B.webp)
示例Python代码,使用队列创建具有持久性的交换到交换绑定,如果没有消费者存在。
import pika
import sys
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='data_gateway',
exchange_type='fanout',
durable=True,
auto_delete=False)
channel.exchange_declare(exchange='data_distributor',
exchange_type='topic',
durable=True,
auto_delete=False)
channel.exchange_bind(destination='data_distributor',source='data_gateway')
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)
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')