
从0到1开始RabbitMQ
提示
最好的学习文档是🍒官方。
RabbitMQ是什么
RabbitMQ是一个由erlang语言开发的基于AMQP协议的开源消息队列中间件。
RabbitMQ的特点
- 可靠性:使用一些如持久化、传输确认及发布确认等机制来保证可靠性。
- 灵活路由:在消息进入队列之前,通过交换器来路由消息。
RabbitMQ提供了一些内置的交换器实现了典型的路由功能。对于复杂的路由功能,可以将多个交换器绑定在一起,亦可使用插件机制实现自己的交换器。 - 扩展性:多个
RabbitMQ节点可以组成一个集群,亦可根据实际业务情况动态扩展集群中的节点。 - 高可用性:队列可以再集群中的集群上设置镜像,使得在部分节点出现问题的情况下队列仍可用。
- 多种协议:除原生支持
AMQP协议外,还支持STOMP、MQTT等多种消息中间件协议。 - 多语言客户端:几乎支持所有常用语言,如
Java、Python、Ruby、PHP、C#、JavaScript等。 - 管理界面:提供了易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。
- 插件机制:提供许多插件以满足多方面的需求,同时用户可以自编写自己的插件。
RabbitMQ原理图和基础概念

工作原理
- 生产者将消息发送到交换器。
- 交换器根据路由键将消息路由到一个或多个队列中。
- 消费者从队列中获取消息并进行处理。
- 消费者处理完消息后,将确认信息发送给
RabbitMQ。 RabbitMQ收到确认信息后,从队列中删除该消息。
基础概念
实例(Broker)
RabbitMQ 服务器实例,它接收来自生产者的消息并将其路由到一个或多个消费者。Broker 还负责管理队列、交换机和绑定等组件,以确保消息能够正确地传递到目标消费者。
连接(Connection)
应用程序与RabbitMQ Broker之间建立的TCP连接。可以用于发送或接收AMQP帧,包括创建、删除队列、交换器、绑定等操作,以及发送、接收消息等操作。
信道(Channel)
在一个TCP连接上建立的一个独立的逻辑通道,用于进行AMQP操作。通过Channel,应用程序可以在一个Connection上发送和接收多个AMQP帧,每个Channel都是一个独立的逻辑通道,可以进行独立的AMQP操作。
虚拟主机(Virtual Host)
逻辑上的概念,用于将RabbitMQ的资源(如队列、交换器和绑定等)划分为不同的逻辑组。每个Virtual Host都是一个独立的消息路由器,可以有自己的权限和策略,不同的Virtual Host之间相互隔离,可以避免资源冲突和安全问题。
作用:
- 逻辑隔离:
Virtual Host可以将RabbitMQ的资源进行逻辑隔离,不同的应用程序或团队可以使用各自独立的Virtual Host,避免资源冲突和干扰。 - 权限控制:
Virtual Host可以为不同的用户或应用程序提供不同的权限,以控制对RabbitMQ资源的访问和使用。 - 策略管理:
Virtual Host可以为不同的资源设置不同的策略,如消息过期时间、队列长度限制和消息优先级等,以满足不同的业务需求。
默认会创建"/"的Virtual Host。
消息(Message)
RabbitMQ中的基本单位,包含一个消息体和一些元数据,如路由键、交换器等。
交换器(Exchange)
接收生产者发送的消息,并将其路由到一个或多个队列中。交换器有四种类型:direct、fanout、topic和headers。
direct
含义:直接交换器。根据消息的路由键将消息路由到指定的队列中。
使用场景:适用于一对一的消息传递模式。例如,发送给特定用户的消息。
fanout
- 含义:扇形交换器。将消息广播到所有绑定的队列中。
- 使用场景:适用于发布/订阅模式。例如,向多个消费者发送同一份消息。
topic
- 含义:主题交换器。根据通配符匹配路由键将消息路由到一个或多个队列中。
- 使用场景:适用于灵活的消息传递模式。例如,根据商品类别和地区将消息路由到不同的队列中。
headers
- 含义:头交换器。根据消息头中的键值对匹配将消息路由到一个或多个队列中。
- 使用场景:适用于复杂的匹配规则。例如,根据消息头中的IP地址和协议类型将消息路由到不同的队列中。
队列(Queue)
存储消息的缓冲区,生产者将消息发送到交换器,交换器再将消息路由到队列中。消费者从队列中获取消息。
绑定(Binding)
用于将交换器和队列连接起来,绑定规则由路由键控制。
路由键(Routing Key)
由生产者设置,用于指定消息的路由规则。
消费者(Consumer)
从队列中获取消息并进行处理的应用程序。
生产者(Producer)
将消息发送到RabbitMQ的应用程序。
RabbitMQ为什么需要Channel,而不直接使用Connection通信?
RabbitMQ安装和配置
本地方式
docker方式
安装和配置
- 下载并安装
RabbitMQ - 配置
RabbitMQ,比如设置用户权限、虚拟主机等
RabbitMQ使用入门
- 使用
RabbitMQ的命令行工具进行简单的消息发送和接收 - 通过代码使用
RabbitMQ进行消息发送和接收
快速开始之“Hello World”

新建一个Maven项目,添加rabbitmq客户端依赖库和slf4j简单实现库
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
</dependency>Producer端
package com.xiaoshengsheng.rabbitmq.helloworld;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* @author Julius Wong
* @date 2020/8/4 4:42 下午
*/
public class Sender {
private static final String QUEUE_NAME = "hello";
public static void main(String[] args) 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());
}
}
}几种工作模式
Work Queues模式

Publish/Subscribe模式

Routing模式

Topics模式

Header模式
RPC模式

整合SpringBoot使用
Spring AMOP是将Spring核心思想应用于基于AMQP的消息传递解决方案的开发,提供了一个发送接收消息的高级抽象的模板。
新建一个SpringBoot项目,依赖amqp的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>配置application.properties
# 方式一:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
# 方式二:
# spring.rabbitmq.addresses=amqp://guest:guest@localhost常见场景
消息优先级
延迟消息
RabbitMQ高级特性
- 学习如何使用
RabbitMQ的高级特性,如Exchange类型、Queue参数、消息确认机制等 - 学习如何处理
RabbitMQ的异常情况,如网络故障、持久化问题等
RabbitMQ集群和高可用性
- 学习如何搭建
RabbitMQ集群,提高可用性 - 学习如何进行
RabbitMQ的负载均衡和故障转移