一、什么是消息队列?
消息队列是一种用于在分布式系统中进行通信的技术。它是一种存储和转发消息的中间件,可以用
于将应用程序之间的通信解耦,从而实现高效的异步通信。消息队列允许发送者将消息发送到队列
中,而接收者则可以从队列中获取消息并进行处理。这种方式可以帮助系统实现高可用性、高性
能、松耦合和可伸缩性。消息队列通常包括生产者(发送消息的应用程序)、消费者(接收消息的
应用程序)和队列(存储消息的缓冲区)。
RabbitMQ:是由erlang语言开发,基于AMQP(高级消息队列协议)协议实现的一种消息队列。市面
上还有很多消息队列,比如Kafka、RocketMQ、Redis等,各有优劣,本文主要介绍RabbitMQ。
官方文档:RabbitMQ Tutorials | RabbitMQ
二、消息队列的作用(优点)
1、解耦
应用程序解耦,通过引入消息队列,不同的应用程序之间可以通过消息队列进行通信,而无需直接
调用对方的接口或方法。这样可以降低系统中各个应用程序之间的耦合度,使得它们可以独立演化
和扩展,而不会因为对方的变化而受到影响。
2、流量削峰
消息队列可以作为一个缓冲区,暂时存储流入的消息,直到系统有足够的资源来处理它们。当系统
出现流量高峰时,消息队列可以暂时存储过多的消息,以平滑处理流量的波动,避免系统被突发的
高负载压垮。
3、异步
发送者在发送消息后可以立即继续执行其他操作,而不需要等待接收者的响应。这样可以提高系统
的并发性和响应速度。也可以帮助提高系统的吞吐量,特别是在面对大量请求或处理复杂计算时。
发送者可以并行地向多个接收者发送消息,而不会因为等待接收者的响应而阻塞。
4、顺序性
虽然并不是所有消息队列都能保证消息的绝对顺序性,但是在许多情况下,消息队列可以保证消息
的相对顺序性。即按照发送顺序进行处理,对某些场景要求顺序执行很适合。
三、RabbitMQ基本结构
名称 描述
Connection(连接 ) 连接是生产者和消费者与RabbitMQ之间的连接。每个生产者和消费者都需要与RabbitMQ建立一个连接,以便发送和接收消息。连接通常是长连接,可以重用以提高性能和效率。
Channel(信道) Channel是连接(Connection)内的逻辑通道,用于完成大部分 AMQP 操作,如声明队列、发送和接收消息等。在 RabbitMQ 中引入 Channel(信道)的主要目的是为了提高系统的性能、灵活性和效率。使用 Channel 可以避免频繁地创建和销毁连接,因为一个连接可以包含多个 Channel。这样可以减少连接的开销,节省系统资源,并提高性能。
Exchange(交换机)
交换机是消息的接收和分发中心,负责接收生产者发送的消息,并根据指定的路由规则发送到一个或多个队列中。
(Exchange相当于Queue的代理,可以设置不同的写入策略,写入到对应的队列中。对于队列的写入,更加灵活)
交换机的类型有:fanout扇出、topic主题、direct直接
Queue(队列) 队列是消息的缓存区,用于存储交换机发送的消息。生产者发送的消息最终会被存储在队列中,等待消费者进行消费。队列可以持久化到磁盘,以确保消息不会在RabbitMQ宕机或重启后丢失。
Producer(生产者) 生产者是发送消息到RabbitMQ的应用程序。生产者负责创建消息并将其发送到RabbitMQ的消息队列中。
Consumer(消费者) 消费者是从RabbitMQ队列中接收消息并进行处理的应用程序。消费者可以订阅一个或多个队列,并在消息到达队列时接收并处理它们。消费者负责监听队列中的消息,并将其取出进行处理。
四、RabbitMQ队列模式
基于Exchange交换机,RabbitMQ截至目前有七种队列模式。
1、简单队列模式
一个消息生产者,一个消息消费者,一个队列。也称为点对点模式。
图中P代表生产者,C代表消费者,Queue是队列名称。
我们看到是没有Exchange的,但是RabbitMQ也会有一个默认的交换机。这个默认的交换机通常被
称为"amq.default"或者""(空字符串),是RabbitMQ自动创建的,用于在没有指定交换机的情况
下将消息发送到队列。
此时就会生产者发送一条消息,消费者就会接收一条消息。
2、工作队列模式
工作队列又叫做任务队列,正常会按顺序把消息发送给每一个订阅的消费者,平均而言,每个消费
者将获得相同数量的消息。(不是P发送一条消息,C1和C2都会收到,而是第一条C1消费,第二
条C2消费。每个消息只会被一个消费者接收和处理)。
这样的好处是可以提高吞吐量,因为生产者发送了很多消息,但是消费者只有一个,消费者处理很
慢,就会造成消息积压。
3、发布/订阅模式
发布/订阅模式是一种消息传递模式,它允许发送者(发布者)将消息发布到多个接收者(订阅
者)。消息传递模型的核心思想是生产者从不直接向队列发送任何消息。实际上,生产者通常根本
不知道消息是否会被传递到任何队列。
所以消息传递模式,发布者不需要指定队列。
发布/订阅模式交换机类型为Fanout。