消息队列MQ最全详解(万字图文总结)
来源:mikechen的互联网架构
消息队列MQ是互联网架构的基石,大量应用于类似:阿里双11等并发场景,下面我就全面来详解MQ消息队列
消息队列MQ
消息队列(Message Queue,简称MQ)是一种用于在软件系统之间传递消息的通信方式。
如下图所示:
消息通常包含了:要传递的信息,可以是文本、二进制数据、JSON、XML等格式。
可以是任何形式的信息,例如:订单信息、日志记录、事件等,都可以进行传输。
消息队列MQ如今在互联网的应用非常广泛,下面我会全面来详解消息队列MQ@mikechen
消息队列MQ架构
一.整体架构
消息队列MQ的整体架构,如下图所示:
主要会包含:生产者Producer、Broker、消费Consumer。
1.生产者Producer
生产者:是系统中负责创建,并发送消息到消息队列的组件。
生产者的主要责任包括:
创建消息:构造消息体并添加必要的元数据,例如:消息标识、时间戳等。
将消息发送到消息队列:将消息发送到指定的队列或主题,将消息传递给中间件。
2.消息体
消息体是消息中的实际数据,它包含了:需要在生产者和消费者之间传递的信息。
消息体的内容可以是:文本、JSON、二进制数据等,具体格式取决于应用的需求。
3.Broker
Broker中间件:负责接收、存储和传递消息。
如下图所示:
Broker,充当了生产者和消费者之间的中介。
主要职责包括:
1)接收消息
从生产者接收消息,并将其存储在消息队列中。
2)管理消息
维护消息队列的元数据,确保消息按照规定的顺序传递。
3)将消息传递给消费者
将消息传递给,订阅了相关队列或主题的消费者
总之,Broker是消息队列(Message Queue)中的一个重要组件,它充当了消息的中间人,负责协调和管理消息的传递。
4.消费者Consumer
消费者(Consumer)是消息队列系统中的一个重要组件,其主要责任是订阅消息队列中的消息,并进行处理。
以下是一些常见的消息队列中的消费方式:
1.Push模式
在Push模式中,消息队列主动将消息推送给消费者。
一旦消息队列接收到消息,它立即将消息推送给已经订阅了该队列或主题的消费者, 这样的方式使得消费者能够即时地获取消息。
2.Pull模式
在Pull模式中,消费者主动从消息队列中拉取消息。,消费者根据需要向消息队列请求消息,然后进行处理。
3.批量拉取
一些消息队列系统支持批量拉取消息,即消费者可以一次性获取多个消息。
4.定时拉取
消费者可以定时地按照一定的频率拉取消息,而不是实时处理,这种方式适用于一些场景,例如:需要按照固定间隔处理消息的情况。
消息队列MQ类型
消息队列类型,主要会包含:点对点模型和订阅-发布模型。
1.点对点模型
点对点模型,是一对一关系,如下图所示:
在点对点模型中,一条消息只会被一个消费者消费, 即使有多个消费者订阅了同一个队列,每条消息也只会被其中一个消费者接收。
适用于任务分发模式,每个任务只被一个消费者执行的场景,这种模型常见于一些任务分配、请求-响应等场景。
2.订阅-发布模型
订阅-发布模型,全称是Publish-Subscribe Model,是消息队列中一种常见的消息传递模型,也被称为发布订阅模型。
如下图所示:
特点:
一对多关系: 每条消息可以被多个消费者接收。
主题(Topic): 消息被发布到一个主题,而订阅者可以选择订阅特定的主题。
发布者(Publisher): 生产者或发布者,负责将消息发布到一个或多个主题。
订阅者(Subscriber): 消费者或订阅者,可以选择订阅一个或多个主题,以接收发布到这些主题的消息。
流程:
发布消息: 发布者将消息发布到一个特定的主题,如"新闻"或"实时通知"。
订阅主题: 订阅者,选择订阅感兴趣的主题,比如:订阅"新闻"主题。
消息传递: 当发布者发布与订阅者已订阅的主题相关的消息时,订阅者将接收到这些消息。
应用场景:
实时广播: 适用于需要将消息广播给多个消费者的场景,例如:实时通知、广播消息等。
事件驱动: 用于实现事件驱动架构。
分布式系统集成: 在分布式系统中,发布-订阅模型可以用于实现组件之间的松耦合通信,提高系统的灵活性和可扩展性。
3.点对点和发布订阅的区别
点对点模型适用于一对一的场景,关注直接连接的点对点关系,而发布订阅模型适用于一对多的场景。
点对点模型
着重于消息的直接传递,消息的生产者和消费者之间直接连接。
这种模型通常强调点对点的关系,消息的生产者和消费者之间是一对一的。
发布订阅模型
着重于消息的广播和分发,消息的发布者和订阅者之间通过主题进行间接连接。
这种模型通常强调一对多的关系,一个消息可以被多个订阅者接收。
5大常用消息队列MQ
1.ActiveMQ
特点:
支持JMS规范,实现了Java语言的消息中间件。
提供点对点(P2P)和发布-订阅(Pub/Sub)两种消息传递模型。
提供高级特性,如事务、持久性、消息过滤、消息导向等。
多语言支持,适用于Java、C++, .NET等。
应用:
适用于Java环境下的分布式系统,企业级应用中的消息传递和异步通信。
性能:
性能在万级/秒。
2.RabbitMQ
特点:
实现AMQP(Advanced Message Queuing Protocol)标准。
提供灵活的消息路由和交换机模型,支持多种消息模式。
具有高可用性和可扩展性,支持集群配置。
提供事务和持久性,支持消息确认机制。
架构:
RabbitMQ采用基于代理的架构,包括Exchange(交换机)、Queue(队列)、Binding(绑定)等核心组件。
如下图所示:
应用:
适用于微服务通信、任务队列、实时通信等各种场景。
3.Kafka
特点:
高吞吐量,适用于大规模数据流处理。
持久性存储,支持消息的持久化。
分布式设计,可扩展性强,支持水平扩展。
提供多分区和多副本的特性。
架构:
Kafka采用分布式发布-订阅模型,包括Producer(生产者)、Broker(代理服务器)、Consumer(消费者)等组件。
如下图所示:
应用:
在大数据领域和实时数据处理中得到广泛应用,处理大规模数据流的场景。
性能:
具有极高的吞吐量,能够每秒处理数百万条消息,适用于高频率的数据流处理。
4.RocketMQ
特点:
阿里巴巴开发,支持分布式、高可用性和可伸缩性。
提供顺序消息、事务消息等高级特性。
高度可定制化,支持分布式事务。
架构:
RocketMQ包括Namesrv(名称服务)、Broker(代理服务器)、Producer(生产者)、Consumer(消费者)等组件。
如下图所示:
性能:
能够处理十万级别的消息传递,支持大规模分布式部署。
5.Pulsar
特点:
云原生设计,支持分布式、多租户和可伸缩。
提供水平扩展,支持多数据中心部署。
支持多种消息传递模型和协议。
提供强大的流式处理和事件驱动支持。
架构:
Pulsar的架构包括Broker(代理服务器)、ZooKeeper等组件。
应用:
适用于新一代的云原生分布式消息流平台,特别适用于处理大规模数据流的场景。
MQ消息队列应用
1.解耦性
发送积分、发短信等任务,可以通过消息队列实现解耦,可以极大提升性能。
2.异步通信
在需要后台处理的任务中,发送方可以将任务信息发送到队列,然后继续执行其他操作,而不必等待任务的实时处理。
3.日志
Kafka等消息队列系统常被用于日志收集,实现大规模、实时的日志处理和分析。
日志场景,包含:日志的集中存储、分析和监控等等,Kafka就是典型的使用者。
4.削峰
消息队列可以平滑处理流量峰值,防止系统过载。
在大型购物活动,如阿里双11期间,消息队列用于平滑处理大量的交易请求,确保系统的可伸缩性和稳定性。
扫一扫,关注我们