【RabbitMQ】直连交换机_扇形交换机_主题交换机

一、直连交换机(Direct Exchange)

1. 特点
  • 精确匹配:直连交换机要求消息的路由键与队列的绑定键完全匹配,才能将消息路由到该队列。
  • 简单高效:由于只需进行简单的字符串匹配,直连交换机的路由效率较高。
  • 一对一或多对一:适用于一对一或多对一的消息传递场景,即一个消息对应一个队列或多个队列通过相同的路由键接收同一消息。
2. 应用场景
  • 任务分发:在任务分发系统中,可以将不同的任务分配给不同的处理队列,每个队列对应一个或多个消费者。
  • 日志处理:根据日志的级别或类型,将日志消息路由到不同的处理队列中。
  • 订单处理:在电商系统中,根据订单号将订单消息路由到特定的处理队列,以便进行后续的订单处理流程。
3. 工作原理
  • 绑定:当队列与直连交换机绑定时,需要指定一个绑定键(Binding Key)。这个绑定键是队列与交换机之间的“纽带”,用于匹配消息的路由键。
  • 发送消息:生产者发送消息到直连交换机时,需要指定一个路由键。交换机将根据这个路由键来查找与之匹配的队列。
  • 路由消息:如果找到与路由键完全匹配的队列,交换机就会将消息路由到该队列中。如果没有找到匹配的队列&#
### RabbitMQ 扇形交换机 (Fanout Exchange) 的使用和配置 #### 定义与特性 扇形交换机是一种特殊的交换机类型,其工作原理非常简单:它接收消息并将这些消息广播到所有绑定的队列中。这意味着发送给该类型的交换机的消息会被复制并分发至每一个与其关联的队列里。 #### 配置方法 为了创建一个fanout类型的exchange,在声明时指定`'fanout'`作为type参数即可: ```java // Java示例代码 AMQP.Exchange.DeclareOk declareExchange = channel.exchangeDeclare("logs", "fanout"); ``` 对于Python客户端而言,则可以这样定义: ```python # Python示例代码 channel.exchange_declare(exchange='logs', exchange_type='fanout') ``` 一旦建立了这样的交换机之后,任何连接到此交换机上的消费者都将接收到相同的数据流副本[^1]。 #### 发布消息 向这个特定名称的交换机发布一条新消息只需要指明目标exchange的名字以及不需要设置routing key因为在这个模式下路由键被忽略掉了: ```java // Java示例代码 String message = "Hello World!"; channel.basicPublish("logs", "", null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); ``` 对应的Python版本如下所示: ```python # Python示例代码 message = 'hello world' channel.basic_publish( exchange='logs', routing_key='', body=message, ) print(f" [x] Sent {message}") ``` #### 接收端处理逻辑 在消费侧,每个监听者都需要独立地建立自己的临时匿名queue并与上述提到过的exchange进行绑定操作以便于能够捕获到来自生产者的每条记录: ```java // Java示例代码 QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume(queueName, true, consumer); while (true) { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String msg = new String(delivery.getBody()); System.out.println("Received Message: " + msg); } ``` 而用Python实现同样的功能则更为简洁直观一些: ```python # Python示例代码 def callback(ch, method, properties, body): print(f" Received {body}") channel.basic_consume(queue=queue_name, on_message_callback=callback, auto_ack=True) print(' [*] Waiting for messages.') channel.start_consuming() ``` 以上就是关于如何利用RabbitMQ中的fanout exchange来构建简单的日志收集系统的介绍[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值