消息队列是一种常用的软件架构,有必要了解和学习它。
基本知识
定义
消息队列(Message Queue,简称MQ)是一种在计算机系统中用于在不同应用程序或服务之间进行异步通信的中间件技术,它通过一个存储消息的队列作为中间人,允许发送者(生产者)将消息放入队列,接收者(消费者)则在准备好时从队列中取出并处理,从而实现系统解耦、异步处理和流量削峰等目标。消息队列的出现解决了分布式系统中数据丢失、服务故障、处理能力不足以及业务系统间强耦合等问题。
核心概念
- 生产者(Producer):负责创建和发送消息到消息队列的应用程序或服务。
- 消费者(Consumer):负责从消息队列中接收消息并进行处理的应用程序或服务。
- 消息(Message):在应用程序之间传递的数据包,可以是简单的文本或复杂的数据结构。
- 消息队列(Message Queue):一个存储消息的容器,它本身是一个队列(先进先出)数据结构。
- 代理(Broker):消息队列的核心组件,负责存储消息、确认消息的传递和重试等。
主要作用
- 系统解耦:生产者和消费者之间不需要直接通信,降低了系统之间的依赖性。
- 异步通信:消息的发送和接收不需要同时发生,大大提高了系统的吞吐量和响应速度。
- 削峰填谷:在高并发场景下,消息队列能够缓冲瞬时的大量请求,将高并发的流量“削峰”,让后端系统有足够的时间处理。
- 流量控制:通过控制消费者对消息的处理速度,可以有效避免后端服务因过载而崩溃。
- 可靠投递:消息队列能够持久化存储消息,即使接收者暂时不可用,消息也不会丢失,保证了数据的安全。
常见用例
- 分布式事务::实现不同服务之间的数据最终一致性。
- 日志处理::将日志数据异步地从各个服务发送到集中的日志处理系统。
- 实时数据处理::在流处理和大数据场景下,用于数据流的缓冲和转发。
主流技术
- RabbitMQ:一个老牌的开源消息队列,功能强大,支持多种消息协议。
- Kafka:由LinkedIn开发,以高性能和高吞吐量著称,常用于大数据流式处理场景。
- RocketMQ:由阿里巴巴开发,是轻量级的高性能分布式消息中间件。
- ActiveMQ:一个由Apache开发的开源消息中间件,支持多种传输协议。
与模型对比
消息队列与发布/订阅的对比
消息队列使用点对点消息传递模式,在该模式中,一个应用程序(称为“发送者”)向队列提交消息,另一个应用程序(称为“接收者”)则从队列中获取并使用消息。发送者和使用者之间存在紧密耦合的一对一关系,并且每条消息只能使用一次。
如果您的应用程序需要将消息分发给多方,则可以组合多个消息队列,或者使用发布/订阅 (pub/sub) 消息传递模型。
在发布/订阅消息传递中,生成消息的应用程序称为发布者,而使用该消息的应用程序称为订阅者。每条消息都会发布到一个主题,订阅该主题的每个应用程序都会获得发布到它的所有消息的副本。
大多数消息传递中间件解决方案都支持消息队列(点对点)和发布/订阅消息模型。
消息队列与消息总线的对比
消息总线是一种企业服务总线 (ESB),它允许服务随处访问数据,同时确保它们在分布式系统架构中保持解耦和独立运行。当使用消息总线时,所有服务或应用程序必须共用通用数据类型、通用命令集和通用通信协议(尽管它们可能用不同的语言编写)。使用者可以决定如何使用信息。
如果解耦的应用程序要通过消息总线进行通信,则必须转换消息以使其归属于同一类型。相反,消息队列可传输各类消息,无论其类型是否相同。
参考链接
- Kafka、ActiveMQ、RabbitMQ、RocketMQ 区别以及高可用原理,by 爱撸猫的杰.
- 消息队列,by wikipedia.
- 什么是消息队列?,by ibm.
- 消息总线和消息队列有何区别?,by kimmking.
- 企业服务总线,by wikipedia.