什么是消息队列?
消息队列是一种在应用程序之间或不同组件之间传递消息的通信模式,本质就是一个保存消息的队列。
如下图所示:
在消息队列中,消息的发送者将消息发送到一个队列中,而消息的接收者从队列中获取消息并进行处理。
发送者和接收者之间并不直接通信,它们之间通过共享的队列进行间接通信。
消息队列的特点
以下是消息队列的几个主要特点:
1.异步通信
消息队列支持异步通信模式,发送方将消息发送到队列中,而不需要等待接收方的即时响应。
这种异步通信模式允许发送方和接收方在处理消息时具有独立的时间表,提高了系统的可伸缩性和性能。
2.解耦和松散耦合
使用消息队列可以实现发送方和接收方之间的解耦,使它们可以独立进行开发和演进。
发送方只需将消息发送到队列,而不需要关心消息的接收方如何处理。,种松散耦合的设计提高了系统的灵活性和可维护性。
3.可靠性
消息队列通常提供持久化机制,确保消息在发送和接收过程中的可靠性。
即使在消息发送后,如果接收方暂时不可用,消息也会被保留在队列中,这种机制可以防止消息丢失,并提供了一种机制来处理系统中的故障和异常情况。
4.缓冲和削峰填谷
消息队列可以用作缓冲区,用于平衡消息的生产者和消费者之间的速度差异。
当消息的生产速度超过消费速度时,消息会在队列中暂时存储,以便消费者能够以自己的速度进行处理。这样可以平滑处理流量峰值,避免系统过载。
消息队列类型
消息队列主要包含两种:一个是点对点,一个是发布订阅模型。
1.点对点
点对点队列模型是一种一对一的消息传递模型,其中每个消息只能被一个接收者消费。
如下图所示:
发送者将消息发送到队列中,而接收者从队列中获取消息并进行处理,一旦消息被接收者消费,它将从队列中删除。
这种模型适用于需要可靠传递的消息,以及需要确保消息只被一个接收者处理的场景。
2.发布订阅
发布/订阅模型是一种一对多的消息传递模型,其中消息被发送到一个主题(Topic),而订阅该主题的所有接收者都会接收到该消息。
如下图所示:
发布订阅模型包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。
发送者将消息发布到主题,而订阅者通过订阅感兴趣的主题来接收消息。
这种模型适用于需要将消息广播给多个接收者的场景,如实时广播、事件通知等。
常用的消息队列?
以下是一些常用的消息队列系统:
1.RabbitMQ
RabbitMQ 是一个开源的消息队列系统,它实现了 AMQP(Advanced Message Queuing Protocol)协议。
它具有可靠性、灵活性和丰富的功能,支持点对点和发布/订阅模型,提供持久化、消息确认、消息路由等特性。
2.Apache Kafka
Kafka 是一个高吞吐量、可持久化、分布式的消息队列系统,它被设计用于处理实时数据流和大规模数据处理,并具有高可用性和可扩展性。
Kafka 使用发布/订阅模型,将消息以日志的形式持久化,并支持分区和副本机制。
3.ActiveMQ
ActiveMQ 是一个基于 JMS(Java Message Service)规范的消息队列系统,ActiveMQ 具有可靠性、高性能和可扩展性,并支持多种客户端编程语言。
它提供了多种传输协议和消息模式的支持,包括点对点、发布/订阅和请求/应答模型。
4.RocketMQ
RocketMQ是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目。
5.Apache Pulsar
Pulsar 是一个分布式的消息和流处理平台,它具有高性能、可扩展性和持久化的特性。Pulsar 支持点对点和发布/订阅模型,并提供了多租户、多协议、容错性等功能。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》