文章目录
- 消息队列是什么?
- 消息队列关键概念
- 消息队列优点
- 消息队列的应用场景
- 异步处理
- 应用解耦
- 流量削峰
- 消息通讯
- 常用消息队列中间件的对比
消息队列是什么?
- 消息队列(Message Queue)是一种用于在软件系统之间传递消息的通信机制。其本质是一个保存数据的队列,它通常被用于解耦不同组件或模块之间的通信,以实现异步通信、提高系统的可伸缩性和可靠性。
- 消息中间件是利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的构建。
- 消息中间件是分布式系统中重要的组件,主要解决应用解耦、异步消息、流量削峰等问题,实现高性能、高可用、可伸缩和最终一致性的系统架构。目前常见的消息队列系统包括
Apache Kafka
、RabbitMQ
、RocketMQ
、ActiveMQ
等。
消息队列关键概念
- 消息生产者(Producer):负责产生消息并将其发送到消息队列中。
- 消息队列(Message Queue):用于存储消息的缓冲区或中介。消息队列可以是内存中的数据结构,也可以是持久化的存储系统。
- 消息消费者(Consumer):从消息队列中获取消息,并进行相应的处理。消费者负责处理消息的逻辑,通常是异步地从队列中拉取消息。
- 消息:要在系统中传递的数据单元。消息可以是任何形式的数据,如文本、
JSON
、XML
等。
消息队列优点
- 解耦性:生产者和消费者之间通过消息队列进行通信,彼此不需要直接连接,降低了耦合度。
- 异步通信:生产者和消费者可以独立运行,不需要等待对方的响应。
- 增强系统可靠性:即使一个组件或模块不可用,消息仍然可以被存储在队列中,待组件恢复后继续处理。
- 缓冲能力:消息队列可以作为缓冲,处理高峰时段的突发流量,以及平滑系统的负载。
消息队列的应用场景
异步处理
将一些非核心的业务流程以异步并行的方式执行,从而减少请求响应时间,提高系统吞吐量。
应用解耦
就是接触应用系统之间的耦合依赖,通过消息队列,使每个应用系统不必受其他系统影响,可以更独立自主。
流量削峰
流量削峰一般在秒杀和团抢活动中使用广泛,在应用前端加入消息队列,秒杀业务处理系统根据消息队列中的请求信息,再做后续处理。
消息通讯
消息通讯是指应用间的数据通信。消息队列一般都内置了高效的通信机制,因此可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等对点通讯。
常用消息队列中间件的对比
目前常见的消息队列系统包括 Apache Kafka
、RabbitMQ
、RocketMQ
、ActiveMQ
等,选择合适的消息队列取决于应用的需求、性能要求以及可用的基础设施。
kafka | RabbitMQ | RocketMQ | ActiveMQ | |
---|---|---|---|---|
资料文档 | 中等 | 多 | 少 | 多 |
开发语言 | Scala | Eriang | Java | Java |
支持协议 | 自定义(基于TCP) | AMQP | 自定义 | OpenWire、STOMP、RESR、XMPP、AMQP |
消息存储 | 内存、磁盘、数据库;支持大量堆积 | 内存、磁盘;支持少量堆积 | 磁盘;支持大量堆积 | 内存,磁盘,数据库;支持少量堆积 |
消息事务 | 支持 | 支持 | 支持 | 支持 |
负载均衡 | 支持 | 支持 | 支持 | 可基于zk实现负载均衡 |
集群管理 | leader-slave | 支持简单集群 | master-slave | 支持简单集群 |
管理界面 | 一般 | 好 | 很好 | 一般 |
可用性 | 非常高 | 高 | 非常高 | 高 |
吞吐TPS | 极大 | 比较大 | 大 | 比较大 |
顺序消息 | 支持 | 不支持 | 支持 | 不支持 |
消息确认 | 支持 | 支持 | 支持 | 支持 |
消息回调 | 支持指定分区offset位置回调 | 不支持 | 支持指定时间点的回调 | 不支持 |
消息重试 | 不支持 | 不支持 | 支持 | 不支持 |
并发度 | 高 | 极高 | 高 | 高 |