什么是MQ?
MQ全称是Message Queue,翻译过来就是消息队列。
如下图所示:
在消息队列中,消息的发送者将消息发送到一个队列中,而消息的接收者从队列中获取消息并进行处理,本质就是一个保存消息的队列。
发送者和接收者之间并不直接通信,它们之间通过共享的队列进行间接通信。
MQ的特点
以下是消息队列的几个主要特点:
1.异步通信
消息队列支持异步通信模式,发送方将消息发送到队列中,而不需要等待接收方的即时响应。
这种异步通信模式允许发送方和接收方在处理消息时具有独立的时间表,提高了系统的可伸缩性和性能。
2.解耦和松散耦合
使用消息队列可以实现发送方和接收方之间的解耦,使它们可以独立进行开发和演进。
发送方只需将消息发送到队列,而不需要关心消息的接收方如何处理。,种松散耦合的设计提高了系统的灵活性和可维护性。
3.可靠性
消息队列通常提供持久化机制,确保消息在发送和接收过程中的可靠性。
即使在消息发送后,如果接收方暂时不可用,消息也会被保留在队列中,这种机制可以防止消息丢失,并提供了一种机制来处理系统中的故障和异常情况。
4.缓冲和削峰填谷
消息队列可以用作缓冲区,用于平衡消息的生产者和消费者之间的速度差异。
当消息的生产速度超过消费速度时,消息会在队列中暂时存储,以便消费者能够以自己的速度进行处理。这样可以平滑处理流量峰值,避免系统过载。
MQ类型
消息队列主要包含两种:一个是点对点,一个是发布订阅模型。
1.点对点
点对点队列模型是一种一对一的消息传递模型,其中每个消息只能被一个接收者消费。
如下图所示:
发送者将消息发送到队列中,而接收者从队列中获取消息并进行处理,一旦消息被接收者消费,它将从队列中删除。
这种模型适用于需要可靠传递的消息,以及需要确保消息只被一个接收者处理的场景。
2.发布订阅
发布/订阅模型是一种一对多的消息传递模型,其中消息被发送到一个主题(Topic),而订阅该主题的所有接收者都会接收到该消息。
如下图所示:
发布订阅模型包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。
发送者将消息发布到主题,而订阅者通过订阅感兴趣的主题来接收消息。
这种模型适用于需要将消息广播给多个接收者的场景,如实时广播、事件通知等。
MQ设计
MQ的实现,一般都会涉及到如下核心设计:
1.Producer(生产者)
生产者是消息队列中的消息发送方,它产生消息并将其发送到消息队列中。
2.Consumer(消费者)
消费者是消息队列中的消息接收方。它从消息队列中获取消息并进行处理。
3.Broker(代理)
代理是消息队列系统的核心组件,它负责:接收从生产者发送来的消息,并将其存储在队列中,然后将消息发送给消费者。
消息队列需要一个可靠的存储机制来存储消息,以便在生产者和消费者之间传递。
消息持久化可以通过将消息写入持久化存储介质(如磁盘)来实现,持久化存储通常会涉及到:日志文件、数据库、或者其他持久化存储系统。
4.Queue(队列)
通常,消息队列会使用一种高效的数据结构,如:队列来存储消息。
队列是消息在代理中存储的地方,它保证了消息的顺序性,并且可以根据需要进行持久化。
5.Message(消息)
消息是生产者和消费者之间传递的数据单元,它可以是任何形式的数据,例如:文本、JSON、XML等。
6.消息路由
消息队列需要实现消息的路由机制,即确定消息从生产者发送到哪个消费者。
消息路由可以根据消息的主题、标签或者其他属性来进行路由,通常会有一种发布-订阅(Pub/Sub)模式或者队列(Queue)模式来实现消息的路由。
7.Acknowledgement(确认机制)
确认机制用于确保消息的可靠传递,一旦消息被消费者成功处理,消费者会向代理发送确认消息,代理则会将该消息从队列中删除。
8.高可用性和容错性
消息队列通常需要实现高可用性、和容错性机制,以确保即使在系统故障或者网络故障时,消息队列仍然能够正常运行。
这会涉及到:数据复制、故障转移、负载均衡等技术。
常用的MQ?
以下是一些常用的消息队列系统:
1.RabbitMQ
RabbitMQ 是一个开源的消息队列系统,它实现了 AMQP(Advanced Message Queuing Protocol)协议。
RabbitMQ 提供了多种语言的客户端库,包括:Java、Python、Ruby、C# 等,使得开发者可以方便地与 RabbitMQ 进行集成。
RabbitMQ 支持多种消息模式,包括:点对点模式(队列)、发布-订阅模式(交换机)、主题模式等。
并且,RabbitMQ 提供了多种机制来确保消息的可靠性,包括:持久化、消息确认、发布者确认等,它还支持集群模式和镜像队列,以提高可用性和可靠性。
2.Apache Kafka
Kafka 是一个高吞吐量、可持久化、分布式的消息队列系统。
Kafka 能够处理大规模的数据流,并且具有非常高的吞吐量,每秒常可以达到百万的处理能力。
Kafka 整个系统由多个节点组成,每个节点称为一个 Kafka broker,Kafka 集群中的多个 broker 协作工作,共同承担数据的存储、传输和处理任务。
Kafka 提供了:主题(Topic)、和分区(Partition)的概念,可以根据需求选择合适的模式。
主题是逻辑上的数据流,每个主题可以分成一个或多个分区,分区允许数据水平扩展,并且支持并发读写操作,从而提高了系统的吞吐量和性能。
3.ActiveMQ
ActiveMQ 是一个基于 JMS(Java Message Service)规范的消息队列系统,ActiveMQ 具有可靠性、高性能和可扩展性,并支持多种客户端编程语言。
ActiveMQ 是最早的MQ,如今相对使用较少了。
4.RocketMQ
RocketMQ是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目。
RocketMQ 是一个分布式系统,集群中包含多个 Broker 节点,每个 Broker 负责存储和处理一部分数据,这一点主要是参考Kafka来实现的,所以整体设计类似。
RocketMQ 提供了丰富的功能和特性,包括事务消息、消息过滤、延迟消息、消息重试、消息轨迹等。
RocketMQ 支持顺序消息传递,保证相同分区或者相同队列中的消息按照发送顺序被消费,这对于某些应用场景(如:日志收集、订单处理等)是非常重要的。
5.Apache Pulsar
Pulsar 是一个分布式的消息和流处理平台,它具有高性能、可扩展性和持久化的特性。
支持多租户、持久化存储、多机房跨区域数据复制,是下一代云原生分布式消息流平台。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》