MQ消息队列(万字图文详解)

MQ消息队列(万字图文详解)-mikechen

什么是MQ消息队列?

MQ消息队列全称是Message Queue,翻译过来就是消息队列,指保存消息的一个容器,本质是个队列。

如下图所示:

MQ消息队列(万字图文详解)-mikechen

MQ消息队列是一种用于在应用程序之间进行异步通信的通信模式,它通过在发送方和接收方之间引入一个中间件,即消息队列,来实现解耦、异步和可靠的消息传递。

 

MQ消息队列特点

MQ消息队列作为一种通信模式,具有以下特点:

MQ消息队列(万字图文详解)-mikechen

1.解耦性

消息队列实现了发送方和接收方的解耦,发送方只需要将消息发送到消息队列中,而不需要直接知道接收方的存在或状态。

2.异步通信

消息队列支持异步通信模式,发送方将消息发送到队列后即可继续执行其他任务,而不需要等待接收方的即时响应,这种异步通信提高了系统的响应速度和吞吐量。

3.可靠性

消息队列通常提供可靠性保证机制,确保消息的可靠传递,消息队列通常支持消息确认和重试机制,确保消息不会丢失。

4.缓冲和削峰填谷

消息队列可以作为缓冲区,平衡消息的生产者和消费者之间的速度差异。

当消息的生产速度超过消费速度时,消息会在队列中暂时存储,以便消费者能够以自己的速度进行处理,这样可以平滑处理流量峰值,避免系统过载。

 

MQ消息队列设计

以下是消息队列的一些重要概念和详细解释:

1. 整体架构

MQ消息队列(万字图文详解)-mikechen

上图为整体架构,会涉及三类角色:

1)Producer 消息生产者:负责产生和发送消息到 Broker;

2)Broker 消息处理中心:负责消息存储、确认、重试等,一般其中会包含多个 queue;

3)Consumer 消息消费者:消费者是消息的接收方,它负责从消息队列中获取消息,并处理或消费这些消息。

 

2.消息队列(Message Queue)

消息队列是消息的中间存储区域,它允许生产者将消息发送到队列中,并允许消费者从队列中获取消息进行处理。

 

3.消息队列类型

1)点对点模型

在点对点模型中,生产者将消息发送到一个队列,而消费者从该队列中获取消息,每条消息只能被一个消费者接收和处理。

MQ消息队列(万字图文详解)-mikechen

点对点模式包含三个角色:

  •  消息队列(Queue)
  •  发送者(Sender)
  •  接收者(Receiver)

 

2)订阅-发布模型(Publish-Subscribe Model)

在订阅-发布模型中,一个生产者将消息发布到一个主题(topic),而多个消费者可以订阅该主题并接收相应的消息,这种模型支持广播式的消息传递。

MQ消息队列(万字图文详解)-mikechen

发布订阅模型包含三个角色:

  •  主题(Topic)
  •  发布者(Publisher)
  •  订阅者(Subscriber)

多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

3)点对点和发布订阅的区别

生产者发送一条消息到队列queue,只有一个消费者能收到。

发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。

 

4.消息持久化(Message Persistence)

消息队列通常支持消息的持久化存储,确保即使在消息队列重启或故障恢复后,消息也不会丢失。

 

5.消息确认(Message Acknowledgement)

消息确认是指消费者在成功处理一条消息后向消息队列发送确认消息。

消息队列根据确认消息来确认该消息已经被成功消费,然后将其从队列中删除。

 

6.消息传输协议(Message Transport Protocol)

消息队列使用特定的协议来传输消息,例如:AMQP(Advanced Message Queuing Protocol)、MQTT(Message Queuing Telemetry Transport)、STOMP(Simple Text Oriented Messaging Protocol)等。

 

MQ消息队列有哪些

1.ActiveMQ
MQ消息队列(万字图文详解)-mikechen

ActiveMQ是一个基于Java的开源消息中间件,实现了JMS(Java Message Service)规范。

ActiveMQ官网地址:activemq.apache.org

ActiveMQ是Apache出品,最早使用的消息队列产品,时间比较长了,最近版本更新比较缓慢,性能在万级/秒。

 

2.RabbitMQ
MQ消息队列(万字图文详解)-mikechen

RabbitMQ是一个开源的消息队列系统,实现了AMQP(Advanced Message Queuing Protocol)标准。

RabbitMQ官网地址:www.rabbitmq.com

RabbitMQ是erlang语言开发,结合erlang语言本身的并发优势,支持很多的协议:AMQP,XMPP, SMTP, STOMP,性能在万级/秒。

MQ消息队列(万字图文详解)-mikechen

3.Kafka
MQ消息队列(万字图文详解)-mikechen

Kafka是一个高吞吐量、分布式、持久化的消息队列系统,Kafka最初是由LinkedIn开发,并于2011年初开源。

Kafka官网地址:kafka.apache.org

Kafka是一个高吞吐量、分布式、持久化的消息队列系统,性能在百万级/秒。

MQ消息队列(万字图文详解)-mikechen

4.RocketMQ
MQ消息队列(万字图文详解)-mikechen

RocketMQ是阿里开源的消息中间件,纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。

RocketMQ官网地址:rocketmq.apache.org

RocketMQ参考Kafka而设计的,性能在十万级/秒,主要用于金融等场景。

MQ消息队列(万字图文详解)-mikechen

 5.Pulsar

MQ消息队列(万字图文详解)-mikechen

Pulsar是一个分布式的消息和流处理平台,由Apache软件基金会开发和维护。

Pulsar官网地址:pulsar.apache.org

Pulsar是下一代云原生分布式消息流平台,它支持多租户、持久化存储、扩展性和高吞吐量,适用于大规模实时数据处理。

MQ消息队列(万字图文详解)-mikechen

6.消息队列选型

广泛来说,电商、金融等对事务性要求很高的,可以考虑RocketMQ。

技术挑战不是特别高,用 RabbitMQ 是不错的选择。

如果是大数据领域的实时计算、日志采集等场景可以考虑 Kafka。

评论交流
    说说你的看法