RocketMQ概述
一、什么是消息队列?
消息队列(Message Queue),从广义上讲是一种消息队列服务中间件,提供一套完整的信息生产、传递、消费的软件系统。从字面意思看,由2部分组成,我们先讲Queue,再讲Message。
队列(Queue):是一种先进先出(First in First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头,如下:
消息(Message):就是上面a1,a2,a3……an 的消息块。
把数据放到消息队列叫做生产者
从消息队列里边取数据叫做消费者
二、消息队列到底解决了什么问题?
- 程序解耦
传统模式:每次有新系统接入,都需要调整代码。
消息队列模式:将消息写入消息队列服务,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。
- 异步处理
传统模式:一些非必要的业务逻辑以同步的方式运行,太耗费时间。
消息队列模式: 将消息写入消息队列,异步方式运行。
- 削峰填谷
传统模式模式:并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常。
消息队列模式:系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。
- 数据的最终一致性(非事务消息,跨行转账)
三、常见消息队列
消息队列名字 | Apache ActiveMQ | Apache Kafka | Apache RocketMQ | Apache Pulsar |
产生时间 | 2007 | 2012 | 2017 | 2018 |
贡献公司 | Apache | Kafka,ActiveMQ | RocketMQ,Kafka | |
特性 |
(1) 支持协议众多:AMQP,STOMP,MQTT,JMS (2) 消息是持久化的JDBC |
(1) 超高写入速率 (2) end-to-end 耗时毫秒级 |
(1) 万亿级消息支持 (2) 万级Topic数量支持 (3) end-to-end 耗时毫秒级 |
(1) 存储计算分离 (2) 支持SQL数据查询 |
管理后台 | 自带 | 独立部署 | 独立部署 | 无 |
多语言客户端 | 支持 | 支持 |
Java C++ Python Go C# |
Java C++ Python Go |
数据流支持 | 不支持 | 支持 | 支持 | 支持 |
消息丢失 | 理论上不会丢失 | 理论上不会丢失 | 理论上不会丢失 | 理论上不会丢失 |
文档完备性 | 好 | 极好 | 极好 | 社区不断完善中 |
商业公司实践 | 国内部分企业 | 阿里巴巴 | 雅虎、腾讯、智联招聘 | |
容错 | 无重试机制 | 无重试机制 | 支持重试,死信消息 | 支持重试,死信消息 |
顺序消息 | 支持 | 支持 | 支持 | 支持 |
定时消息 | 不支持 | 不支持 | 支持 | 支持 |
事务消息 | 不支持 | 支持 | 支持 | 支持 |
消息轨迹 | 不支持 | 不支持 | 支持 | 自己实现简单 |
消息查询 | 数据库中查询 | 不支持 | 支持 | 支持SQL |
重放消息 | 不清楚 | 暂停重放 | 实时重放 | 支持 |
宕机 | 自动切换 | 自动选主 | 手动重启 | 自动切换 |