RabbitMQ消息队列(四):分发到多Consumer(Publish/Subscribe)

本文详细介绍了RabbitMQ中的Exchange概念,重点讲解了fanout类型的Exchange如何实现消息广播到多个Consumer。通过创建无名的临时queue,并结合Bindings绑定,实现了Producer通过exchange发布消息到所有Consumer的功能。最终展示了数据流图和emit_log.py脚本的使用,以帮助理解RabbitMQ的消息分发机制。

 <===  RabbitMQ消息队列(三):任务分发机制     

      上篇文章中,我们把每个Message都是deliver到某个Consumer。在这篇文章中,我们将会将同一个Message deliver到多个Consumer中。这个模式也被成为 "publish / subscribe"。
    这篇文章中,我们将创建一个日志系统,它包含两个部分:第一个部分是发出log(Producer),第二个部分接收到并打印(Consumer)。 我们将构建两个Consumer,第一个将log写到物理磁盘上;第二个将log输出的屏幕。

1. Exchanges

    关于exchange的概念在《RabbitMQ消息队列(一): Detailed Introduction 详细介绍》中有详细介绍。现在做一下简单的回顾。

    RabbitMQ 的Messaging Model就是Producer并不会直接发送Message到queue。实际上,Producer并不知道它发送的Message是否已经到达queue。

   Producer发送的Message实际上是发到了Exchange中。它的功能也很简单:从Producer接收Message,然后投递到queue中。Exchange需要知道如何处理Message,是把它放到那个queue中,还是放到多个queue中?这个rule是通过Exchange 的类型定义的。


   我们知道有三种类型的Exchange:direct,

RabbitMQ 是一种广泛使用的消息中间件,主要用于实现应用程序之间的异步通信和解耦。它基于 AMQP(Advanced Message Queuing Protocol)协议,支持种消息传递模式,适用于分布式系统中的消息队列需求。对于新手来说,理解 RabbitMQ 的基础知识和掌握其入门操作是迈向消息队列开发的第一步。 ### RabbitMQ 的核心概念 RabbitMQ 的核心架构包括生产者(Producer)、消费者(Consumer)、交换机(Exchange)、队列(Queue)和绑定(Binding)等组件。生产者将消息发送到交换机,交换机根据绑定规则将消息路由到一个或个队列,消费者则从队列中获取并处理消息。这种机制实现了生产者和消费者之间的松耦合[^1]。 ### RabbitMQ 的安装与配置 RabbitMQ 是基于 Erlang 语言开发的,因此在安装 RabbitMQ 之前需要先安装 Erlang 运行环境。在 Ubuntu 系统上,可以通过以下命令安装 RabbitMQ: ```bash sudo apt-get update sudo apt-get install rabbitmq-server ``` 安装完成后,可以使用以下命令启动 RabbitMQ 服务: ```bash sudo systemctl start rabbitmq-server ``` 为了便于管理,RabbitMQ 提供了 Web 管理插件,可以通过以下命令启用: ```bash sudo rabbitmq-plugins enable rabbitmq_management ``` 启用插件后,可以通过浏览器访问 `http://localhost:15672` 来打开 RabbitMQ 的管理界面,默认用户名和密码为 `guest`/`guest`[^1]。 ### RabbitMQ 的六种工作模式 RabbitMQ 支持消息队列模式,主要包括以下六种: 1. **简单模式(Simple)**:最基础的消息队列模式,只有一个生产者、一个队列和一个消费者。 2. **工作队列模式(Work Queue)**:一个生产者发送消息到队列,个消费者共同消费队列中的消息,适用于任务分发场景。 3. **发布/订阅模式(Publish/Subscribe)**:生产者将消息发送到交换机,所有绑定到该交换机的队列都会收到消息。 4. **路由模式(Routing)**:根据路由键(Routing Key)将消息发送到特定队列。 5. **主题模式(Topics)**:类似于路由模式,但支持通配符匹配路由键。 6. **RPC 模式(Remote Procedure Call)**:用于实现远程过程调用,客户端发送请求并等待服务端返回结果[^1]。 ### RabbitMQ 的使用场景 RabbitMQ 广泛应用于需要异步处理、解耦和流量削峰的场景中。例如,在电商平台中,订单系统可以将下单请求发送到消息队列,后续的库存扣减、物流通知等操作可以异步执行,从而提高系统的响应速度和稳定性。此外,RabbitMQ 还可以用于日志处理、消息广播等场景[^5]。 ### RabbitMQ 的 Java API 使用示例 RabbitMQ 提供了丰富的客户端库,支持种编程语言,其中 Java 是最常用的开发语言之一。以下是一个简单的 Java 示例,展示如何使用 RabbitMQ 的 Java API 发送和接收消息: **生产者代码示例:** ```java import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel; public class Send { private final static String QUEUE_NAME = "hello"; public static void main(String[] argv) throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8")); System.out.println(" [x] Sent '" + message + "'"); } } } ``` **消费者代码示例:** ```java import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel; import com.rabbitmq.client.DeliverCallback; public class Recv { private final static String QUEUE_NAME = "hello"; public static void main(String[] argv) throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); DeliverCallback deliverCallback = (consumerTag, delivery) -> { String message = new String(delivery.getBody(), "UTF-8"); System.out.println(" [x] Received '" + message + "'"); }; channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {}); } } ``` 上述代码展示了如何使用 RabbitMQ 的 Java 客户端库发送和接收消息。生产者通过 `basicPublish` 方法将消息发送到指定队列,消费者通过 `basicConsume` 方法监听队列并处理接收到的消息[^2]。 ###
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值