
什么是MQ消息队列?
MQ,全称是Message Queue,简称就是MQ消息队列。
MQ消息队列,是一种在分布式系统中用于消息传递的通信方式。
如下图所示:

MQ中的消息是数据单元,可以包含任何形式的信息,比如:文本、二进制数据等。
MQ消息队列,允许不同的应用程序或组件,在系统之间异步地传递消息,提供了一种解耦的方式。
MQ消息队列,如今在互联网的应用非常广泛,也是很多大厂最重要的中间件,下面我会全面来详解MQ消息队列@mikechen
MQ消息队列设计
一.整体架构
MQ(消息队列)的整体架构通常包括以下主要组件:
分别是:生产者(Producer)、消息队列(Message Queue)、消费者(Consumer)。
如下图所示:

2.生产者
角色:
- 生产者是:消息队列系统中的消息创建者和发送者。
- 它负责:生成消息并将其发送到消息队列中。
功能:
- 创建消息:生产者负责创建包含所需信息的消息。
- 发送消息:将创建的消息发送到消息队列中,选择合适的队列或主题。
特点:
- 生产者和消息队列之间是松散耦合的关系,生产者无需关心消息的最终目的地,只需将消息发送到消息队列即可。
3.消息队列(Message Queue)
消息队列:是消息的中转站,负责存储、管理和传递消息。
消息队列,主要会涉及到:
- 存储消息:接收来自生产者的消息并存储在队列中。
- 管理消息:管理消息的传递、顺序、持久性等特性。
- 传递消息:将消息传递给已订阅或已注册的消费者。
4.消费者(Consumer)
消费者:是消息队列系统中的消息接收者和处理者。
主要会涉及到:
- 订阅消息:选择感兴趣的队列或主题进行订阅。
- 接收消息:从消息队列中接收消息,通常按照先进先出(FIFO)的原则。
- 处理消息:对接收到的消息进行处理,执行相应的业务逻辑。
二.消息队列类型
1)点对点模型
在点对点模型中,消息的发送者(生产者),将消息发送到一个特定的队列。
如下图所示:

应用场景:
- 任务分发:适用于任务分发模式,每个任务只被一个消费者执行。
- 点对点通信:适用于直接的点对点通信场景,例如请求和响应。
2)订阅-发布模型(Publish-Subscribe Model)
在发布/订阅模型中,消息的发送者(生产者)将消息发布到一个主题(Topic)。
如下图所示:

订阅发布模型,主要包含如下2大特点:
- 一对多关系:每条消息可以被多个消费者接收。
- 主题:消息被发布到一个主题,多个消费者可以订阅该主题。
应用场景:
- 实时广播:适用于需要将消息广播给多个消费者的场景,例如实时通知。
- 事件驱动:用于实现事件驱动架构,各个组件可以通过订阅感兴趣的主题来获取相关事件。
3)点对点和发布订阅的区别
点对点:
- 一对一关系,每条消息只有一个消费者能够接收。
- 消息的接收,导致该消息从队列中被移除。
- 适用于直接的、一对一的通信场景。
发布/订阅:
- 一对多关系,每条消息可以被多个消费者接收。
- 消息的接收并不导致消息从主题中被移除,允许多个消费者独立接收相同的消息。
- 适用于广播和一对多的通信场景,比如:实时通知、事件驱动等场景。
三.消息传输协议(Message Transport Protocol)
消息传输协议,是用于在不同系统或设备之间进行消息传递的规范和约定。
这些协议定义了:消息的格式、传递方式、数据结构和交互规则,以确保消息的可靠传递。
常用的协议,包含:AMQP、MQTT、STOMP等。
1.AMOP
AMQP,全称是Advanced Message Queuing Protocol,是一种开放的、标准化的消息传递协议。
AMQP支持点对点(Queue)和发布/订阅(Exchange)两种主要的消息模型。
AMQP,广泛应用于企业级系统,如RabbitMQ作为AMQP协议的实现。
AMOP它允许应用程序通过消息队列进行异步通信,还广泛应用于分布式系统、企业集成、微服务架构等场景。
2.MQTT
MQTT,全称是Message Queuing Telemetry Transport,是一种轻量级、开放的消息传输协议。
主要应用于物联网领域,用于连接和通信各种设备。
3.STOMP
STOMP,全称是Simple Text Oriented Messaging Protocol。
STOMP,设计为一种简单的、文本导向的消息传递协议,易于实现和理解。
STOMP通常用于简单的消息传递场景,不如AMQP和MQTT功能丰富,但在一些特定应用中能够提供足够的灵活性。
4.JMS
JMS,全称是Java Message Service,是Java平台上用于实现消息驱动规范。
JMS定义了一套用于创建、发送、接收和处理消息的标准接口,使得Java应用程序能够与不同消息中间件进行交互。
MQ消息队列有哪些
1.ActiveMQ

ActiveMQ:是一个基于Java的开源消息中间件。
实现了JMS(Java Message Service)规范。
支持多种消息传递模型,包括点对点和发布/订阅。
提供了高级特性,如事务、持久性、消息过滤等。
ActiveMQ是Apache出品,是消息队列的祖师爷,性能在万级/秒。
2.RabbitMQ

RabbitMQ是一个开源的消息队列系统,实现了AMQP标准。
RabbitMQ支持灵活的消息路由和交换机模型,还可靠性强,支持事务和持久性。
RabbitMQ,适用于各种应用场景,包括微服务通信、任务队列、实时通信等。

3.Kafka

Kafka是由LinkedIn开发,并作为开源项目贡献给Apache软件基金会。
Kafka设计用于处理大量数据,并能够实现每秒数百万条消息的高吞吐量。
这是Kafka与别的消息队列,有很大不一样的地方,就是能处理大数据,性能在百万级/秒。

Kafka在大数据领域和实时数据处理中得到了广泛应用,其设计和特性使其适用于处理大规模数据流的各种场景。
4.RocketMQ

RocketMQ,是阿里巴巴开发,并捐赠给 Apache 软件基金会。
支持分布式、高可用性和可伸缩性。
提供顺序消息、事务消息等高级特性。
RocketMQ参考Kafka而设计的,性能在十万级/秒。

RocketMQ,适用于分布式系统、电商平台、金融领域等。
5.Pulsar

Pulsar,是下一代云原生分布式消息流平台。

支持:分布式、多租户、可伸缩,支持水平扩展。
适用于:高吞吐量、低延迟、可伸缩性强的场景。
MQ消息队列应用
MQ消息队列应用场景,如下图所示:

1.解耦性
发送方通过将消息发送到消息队列,不需要知道接收方的具体信息,实现了解耦,这是第一大应用场景。
比如:发送积分、发短息等等,都可以采用。
2.异步通信
消息队列,支持异步通信模式,发送方将消息发送到队列后,即可继续执行其他任务,而无需等待即时响应。
3.日志
日志场景,包含:日志的集中存储、分析和监控等等,Kafka就是典型的使用者。
4.削峰
平滑处理流量峰值,防止系统过载,提高系统的可伸缩性和稳定性,比如:阿里双11,就是典型的场景。
作者简介
陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注作者「mikechen」公众号,获取更多技术干货!
后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》