rabbitmq交换机类型,Direct交换机

交换机类型

  • Fanout:广播,将消息交给所有绑定到交换机的队列。我们最早在控制台使用的正是Fanout交换机

  • Direct:订阅,基于RoutingKey(路由key)发送给订阅了消息的队列

  • Topic:通配符订阅,与Direct类似,只不过RoutingKey可以使用通配符

  • Headers:头匹配,基于MQ的消息头匹配,用的较少

在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange

Direct交换机

  • 队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)

  • 消息的发送方在 向 Exchange发送消息时,也必须指定消息的 RoutingKey

  • Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消息

 

创建交换机和队列并绑定

  1. 声明一个名为hmall.direct的交换机

  2. 声明队列direct.queue1,绑定hmall.directbindingKeybludred

  3. 声明队列direct.queue2,绑定hmall.directbindingKeyyellowred

  4. consumer服务中,编写两个消费者方法,分别监听direct.queue1和direct.queue2

  5. 在publisher中编写测试方法,向hmall.direct发送消息

创建两个队列direct.queue1direct.queue2

然后声明一个direct类型的交换机,命名为hmall.direct

然后使用red作为key,绑定direct.queue1hmall.direct(direct.queuel同理)

最终绑定如下

创建消费者 

 消息发生

通过key值red将只会发送到以下2个队列

总结

描述下Direct交换机与Fanout交换机的差异?

  • Fanout交换机将消息路由给每一个与之绑定的队列

  • Direct交换机根据RoutingKey判断路由给哪个队列

  • 如果多个队列具有相同的RoutingKey,则与Fanout功能类似

 

### RabbitMQ 中的不同类型交换机及其功能 #### 1. 直接交换机 (Direct Exchange) 直接交换机按照指定的路由键将消息转发到相应的队列。如果一个队列绑定此交换机并指定了特定的路由键,则只有带有相同路由键的消息会被传递给该队列[^1]。 ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.exchange_declare(exchange='direct_logs', exchange_type='direct') severity = 'error' message = 'This is an error message' channel.basic_publish( exchange='direct_logs', routing_key=severity, body=message) ``` #### 2. 扇形交换机 (Fanout Exchange) 扇形交换机会忽略路由键,会把收到的信息广播至所有已知的队列中。这意味着任何连接到这个交换机上的队列都会获得一份副本[^2]。 ```python channel.exchange_declare(exchange='logs', exchange_type='fanout') result = channel.queue_declare(queue='', exclusive=True) queue_name = result.method.queue channel.queue_bind(exchange='logs', queue=queue_name) ``` #### 3. 主题交换机 (Topic Exchange) 主题交换机允许更复杂的模式匹配来决定哪些消息应该被发送到哪个队列。通过通配符机制可以定义灵活的路由规则。 ```python channel.exchange_declare(exchange='topic_logs', exchange_type='topic') routing_key = "kern.critical" message = "A critical kernel error" channel.basic_publish( exchange='topic_logs', routing_key=routing_key, body=message) ``` #### 4. 头部交换机 (Headers Exchange) 头部交换机不依赖于路由键而是依据消息头属性来进行过滤。当消息到达时,它会检查这些预设条件并将符合条件的消息分发出去。 ```python headers = {"x-match": "all", "header-key": "value"} properties = pika.BasicProperties(headers=headers) channel.basic_publish( exchange="headers_exchange", routing_key="", properties=properties, body="Message with headers") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值