从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
的负载均衡和故障转移