什么是RabbitMQ
AMQP(高级消息队列协议)是一个通用的应用层协议,提供主要的消息服务的协议,为面向消息服务的中间件.基于此协议的客户端和消息队列进行传递消息,不会受客户端,中间件,开发语言等因素影响,后面RabbitMQ中定义的交换机,队列等概念都是这个协议中的提出的,AMQP的模型结构和rabbitMQ是一样的.
rabbitMQ是基于AMQP协议的消息服务的中间件,是主流的消息中间件之一.
同步与异步通信
MQ(message queue)字面理解就是一个队列,但是里面存储的是消息,消息可以非常简单,可以是文本字符串也可以是JSON.
同步通信就是客户端在发送完消息后,服务端就直接接收到消息.
异步通信就是将消息先转发到RabbitMQ中,再由MQ broker转发到服务端.
RabbitMQ的工作流程
Connection和Channel
Connection(连接)表示连接当创建一个connection时,此时就相当于客户端和消息队列之间创建了一个TCP连接,此时数据的传输和信息控制都基于它.
Channel(通道)是连接上的一个抽象层,一个连接上可以存在多个channel,消息的接收和发送都基于通道.
简单理解就是一个连接表示一个TCP连接,传输数据都是依赖它,但是每次发送消息都需要创建一个连接过于消耗资源,所以在连接的基础上创建一个更加小的单位来表示一次连接,一个连接有多个信道.
Virtual Host ,Queue 和 exchange
Virtual Host(虚拟主机)是mq中的一种数据隔离机制,类似于MySQL中的表,当有多个用户同时使用一个borkerserver时,就可以使用virtual host表示每一个用户,每一个虚拟机上都可以有多个交换机和队列.
Queue(队列)是真正用于存储消息的空间.
Exchange(交换机)表示当消息传到虚拟机上时,此时交换机就会根据一定规则来进行分配消息给队列.
那么一次消费信息其实就可以分为:生产者发送消息 , 开启一个连接,再开启一条信道 , 通过这个信道传到交换机上 , 交换机将任务分配到相应的队列上 , 消费者将信息从队列中取出.
交换机类型:
1)Direct直接交换机:生产者发送消息的时候会指定一个目标队列的名字,交换机就会看看绑定的队列中有没有匹配的队列,会将队列中添加消息.
2)Fanout扇出交换机:交换机会将所有绑定本交换机的队列中都添加一份消息.
3)Topic主题交换机:生产者在发送消息的时候会指定一个rountingkey,队列和交换机绑定的时候也会指定一个bindingkey,如果rountingkey和bindingkey相同此时这条消息就发给对应的队列.
RabbitMQ的管理界面
我们可以使用rabbitMQ的服务器IP地址加默认端口号(15672)来访问rabbitMQ的管理界面.

可以通过管理界面更加清楚的观察到虚拟机,队列,交换机之间的关系.
也可以对其中的配置进行权限的设置,这在后面使用代码操作rabbitMQ后观察效果尤其重要.
RabbitMq的七种工作模式
引入依赖:
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.20.0</version>
</dependency>
在RabbitMQ的官方文档中一共有七种工作模式,接下来分别介绍并使用Java模拟实现.
1)simple(简单模式)
一个消费者一个生产者一个消息队列
生产者:

创建一个通信工厂,以此设定rabbitmq的服务器IP,端口,登录所需的密码和用户名,还有虚拟机,从连接中取出一个信道,接下来需要根据这个信道进行通信,接下来需要声明交换机和队列,可以不设定交换机,当不声明交换机时,接下来就会使用默认的交换机.
最后使用basicpublish发送消息.
消费者:
消费者同样需要将从信道连接到队列,与生产者不同的是这里的消费消息需要使用basicconsume,同时需要创建一个defaultconsume回调函数得到队列中的消息.
运行结束后需要将连接关闭,信道是建立在连接上的,先关闭连接再关闭信道就会报错.
2)Work工作模式:

来自MQ官方的解释,工作模式就是多个消费者同时订阅一个队列.
消费者1,2:


生产者:

两个消费者需要进行同时订阅同一个队列.
3)publish(发布订阅模式)

生产者:

生产者中需要声明交换机,同时声明交换机的类型,因为使用的是扇出模式的交换机,所以不需要指出两个key,交换机会将消息发送给所有绑定交换机的队列.
同时需要将两个队列绑定到声明的交换机.
消费者:


4)Rounting(路由模式)

生产者:

direct类型的交换机类型需要指定rounting和bindingkey,此时队列获取消息就需要匹配.
消费者:


5)Topic(分配法模式)
生产者:

这里的rountingkey和bingingkey匹配是以通配符的形式匹配的.
6)Publisher confirms(发布确认模式)
发布确认模式其实是rabbit MQ的一钟应答机制,属于RMQ的一种工作模式.
在MQ发送消息的过程中可能会出现一些错误,而发布确认模式就是针对生产者向RMQ服务器发送过程中进行一个保障机制.
⽣产者将信道设置成confirm(确认)模式, ⼀旦信道进⼊confirm模式, 所有在该信道上⾯发布的消息都 会被指派⼀个唯⼀的ID(从1开始), ⼀旦消息被投递到所有匹配的队列之后, RabbitMQ就会发送⼀个确认 给⽣产者(包含消息的唯⼀ID), 这就使得⽣产者知道消息已经正确到达⽬的队列了, 如果消息和队列是可 持久化的, 那么确认消息会在将消息写⼊磁盘之后发出. RMQ回传给⽣产者的确认消息中.
发布确认有三种策略:单独确认,批量确认,异步确认.
单独确认:发送一条消息之后就等待服务端的返回,是一种串行同步的等待方式.
批量确认:发送一批的消息后再等待服务端确认.
异步确认:提供一个回调方法,服务端确认了⼀条或者多条消息后客⼾端会回这个⽅法进⾏处理.