简介
RabbitMQ 是一种流行的消息队列系统,用于在应用程序之间可靠地传递消息。它完全支持 AMQP(高级消息队列协议),并提供了丰富的特性来实现可靠的消息传递。
1、基本概念:
消息队列是一种用于在应用程序之间传递消息的通信机制。它包括以下基本概念:
- 生产者(Producer)
:生产者是发送消息到消息队列的应用程序或服务。它们生成数据并将其发布到队列中。
- 消费者(Consumer)
:消费者是从消息队列接收消息的应用程序或服务。它们订阅(或监听)队列,并在有新消息到达时处理它们。
- 队列(Queue)
:队列是消息在消息队列系统中的存储区域。它们按照先进先出(FIFO)的原则存储消息,确保消息按照顺序进行处理。
- 交换机(Exchange)
:交换机是消息队列系统中的组件,负责将消息路由到一个或多个队列。它根据特定的路由规则将消息分发到相应的队列。
- 绑定(Binding)
:绑定指定了队列和交换机之间的关联关系,定义了消息如何从交换机路由到队列。
AMQP(高级消息队列协议)是一种网络协议,用于在应用程序之间传递消息。它定义了生产者、消费者、队列、交换机和绑定之间的通信规范,以及消息如何被发布、路由和接收。RabbitMQ 是一个流行的消息队列系统,它完全支持 AMQP 协议,并提供了丰富的特性来实现可靠的消息传递。
2、安装 RabbitMQ:
2.1、准备工作
下载erlang:http://www.erlang.org/downloads/
下载RabbitMQ:Installing RabbitMQ | RabbitMQ
2.2、安装Erlang
RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang,双击otp\_win64\_21.1.exe直接安装,选择默认配置即可,如果不安装Erlang或安装错误而直接安装RabbitMQ会弹出如下错误提示;
2.3、设置环境变量:
设置Erlang的环境变量和path路径
默认情况下安装程序会生成一个系统环境变量,如果没有生成就自己添加一个
添加到Path中,
配置好之后,打开CMD,输入erl然后回车键,会弹出版本信息,表示Erlang安装成功。
2.4、安装RabbitMQ
直接双击rabbitmq-server-3.7.8.exe进行安装,选择默认配置即可
2.5、安装管理插件
安装Web网页管理插件RabbitMQ-Plugins
安装RabbitMQ-Plugins,这个相当于是一个管理界面,方便我们在浏览器界面查看RabbitMQ各个消息队列以及exchange的工作情况。程序安装好之后默认情况下服务是开启的,这一点可以打开Windows的服务界面查看,
此时再次打开Windows的服务管理界面,可以看见RabbitMQ服务已停止,
然后打开CMD窗口,切换到RabbitMQ安装路径的sbin目录下,
输入指令:“rabbitmq-plugins enable rabbitmq\_management”
安装完rabbitmq插件,开启服务,打开开始菜单,RabbitMQ Server->RabbitMQ Service-start开启服务,
3、创建队列
6、然后打开IE浏览器,可以通过访问http://localhost:15672进行测试,默认的登陆账号为:guest,密码为:guest。
成功登陆之后,如下所示
7、添加一个队列
选择Queues页面,打开“Add a new queue”,为队列命名,如“MQ\_Test”,其它选择可以默认,然后点击“Add queue”按钮,
添加成功之后,在“All queues”选项下面会列出刚才创建的队列信息,
8、发送“Hello world!!!”测试
在“All queues”列表中选择刚刚创建的队列“MQ\_Test”,会显示“MQ\_Test”的信息页面,主要显示了该队列的网络状态以及速率监控等,然后选择“Publish message”,在“Payload”中输入”Hello world!!!”,
然后点击“Publish message”按钮,就可以发送消息,发送完之后在“Overview”中显示了实时的网络状态,
9、然后选择“Get messages”下拉框,会弹出接收消息的显示界面,点击“Get message”按钮,接收到来自服务器的消息,也就是刚刚发送的“Hello world”,
4、创建交换机
在 RabbitMQ Management 界面中,转到 "Exchanges" 页面。
点击 "Add a new exchange" 按钮。
输入交换机的名称、类型(例如 direct、fanout、topic、headers)等信息,然后点击 "Add exchange" 按钮。
5、创建绑定:
- 转到 "Bindings" 页面。
- 选择要绑定的交换机和队列。
- 输入绑定的相关信息,然后点击 "Bind" 按钮。
6、常见RabbitMQ传递模式
关于消息传递模式,RabbitMQ支持多种消息传递模式,其中常见的包括:
- 点对点(Point-to-Point)
:在点对点模式中,一个生产者发送消息到一个队列,然后一个消费者从该队列中接收消息。消息在队列中按照先进先出的顺序被处理。
- 发布/订阅(Publish/Subscribe)
:在发布/订阅模式中,一个生产者发送消息到一个交换机,然后多个队列通过绑定到该交换机来接收消息。每个队列都有自己的消费者来处理消息。消息被交换机广播到所有绑定的队列。
- 路由(Routing)
:在路由模式中,消息的路由是根据消息的路由键(routing key)来确定的。交换机根据消息的路由键将消息路由到与之匹配的队列。这种模式允许消息根据指定的规则被路由到不同的队列。
每种模式都有其适用的场景和优势,根据实际需求选择合适的模式来实现消息传递。
7、示例代码(Java 实现)
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.14.0</version> <!-- 替换为你需要的版本 -->
</dependency>
7.1 生产者
public class RabbitMQProducer {
/**
* 生产者
*/
private static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// RabbitMQ 服务器地址
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// 声明队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello, RabbitMQ!";
// 发布消息到队列
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
}
}
7.2 消费者
public class RabbitMQConsumer {
/**
* 消费者
*/
private static final String QUEUE_NAME = "hello";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// RabbitMQ 服务器地址
factory.setHost("localhost");
try (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 -> { });
}
}
}
8、RabbitMQ环境使用
RabbitMQ 在以下情况下非常适用:
- 异步任务处理
- :当你的应用程序需要处理大量的异步任务时,例如发送电子邮件、生成报告、处理数据等,可以使用 RabbitMQ 来实现任务队列,确保任务被可靠地分发和处理。
- 微服务架构
- :在微服务架构中,各个服务之间需要进行异步通信。RabbitMQ 可以作为微服务之间的消息传递系统,实现服务之间的解耦和灵活性。
- 事件驱动架构
- :RabbitMQ 可以用于实现事件驱动架构,其中各个组件可以发布和订阅事件,从而实现松耦合的系统设计。
- 日志处理
- :将日志消息发送到 RabbitMQ 中,然后由消费者进行处理和分析,可以实现高效的日志处理系统,以及实时监控和分析。
- 分布式系统
- :在分布式系统中,各个节点之间需要进行通信和协调。RabbitMQ 可以作为分布式系统的消息传递中间件,实现节点之间的通信和数据交换。
- 削峰填谷
- :当系统面临突发流量时,可以使用 RabbitMQ 来缓冲请求,避免系统过载。生产者可以将请求发送到队列中,消费者按照自身的处理能力逐个处理请求,从而实现流量控制。
简单比喻
当你需要让不同的程序或服务之间进行通信时,就可以使用 RabbitMQ。想象一下你在一个繁忙的餐馆工作,服务员收集顾客的订单然后将它们交给厨房。RabbitMQ 就像一个虚拟的服务员,负责接收订单(消息),然后将它们传递给厨房(程序或服务)去处理。
为什么要使用 RabbitMQ 呢?因为有时候厨房可能很忙,如果服务员立刻将订单都送过去,可能会导致混乱。所以,服务员可以先将订单放在服务台上(队列),等待厨房有空的时候再取。这样,服务员和厨房之间的工作就可以更加有序,不会出现太多的混乱。
在这个例子中,订单就是消息,服务员就是生产者(负责发送消息的程序),厨房就是消费者(负责接收并处理消息的程序),服务台就是队列(用来暂时存放消息的地方)。通过 RabbitMQ,你可以确保消息被安全、可靠地传递,并且能够有效地控制消息的流量,避免系统负载过大。