RocketMQ 入门必读
消息队列(MQ)
消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。
消息队列主要解决了应用耦合、异步处理、流量削锋等问题。当前使用较多的消息队列有 ActiveMQ、RabbitMQ、RocketMQ、Kafka等。
RocketMQ 是啥?
RocketMQ 是由阿里捐赠给 Apache 的一款低延迟、高并发、高可用、高可靠的分布式消息中间件。经历了淘宝双十一的洗礼。RocketMQ 既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。
RocketMQ 功能特性
- 订阅与发布
- 消息顺序
- 消息过滤
- 消息可靠性
- 至少一次
- 回溯消费
- 事务消息
- 定时消息
- 消息重试
- 消息重投
- 流量控制
- 死信队列
RocketMQ 的不足
- 支持的客户端语言不多,目前是 Java 及 c++,其中 c++ 不成熟;
- 没有在 mq 核心中去实现 JMS 等接口,有些系统要迁移需要修改大量代码;
- RocketMQ 社区关注度及成熟度也不及 RabbitMQ 等;
RocketMQ 的使用场景
- 削峰填谷:诸如秒杀、抢红包、企业开门红等大型活动时皆会带来较高的流量脉冲,或因没做相应的保护而导致系统超负荷甚至崩溃,或因限制太过导致请求大量失败而影响用户体验,消息队列 RocketMQ 可提供削峰填谷的服务来解决该问题。
- 异步解耦:交易系统作为淘宝和天猫主站最核心的系统,每笔交易订单数据的产生会引起几百个下游业务系统的关注,包括物流、购物车、积分、流计算分析等等,整体业务系统庞大而且复杂,消息队列 RocketMQ 可实现异步通信和应用解耦,确保主站业务的连续性。
- 顺序收发:细数日常中需要保证顺序的应用场景非常多,例如证券交易过程时间优先原则,交易系统中的订单创建、支付、退款等流程,航班中的旅客登机消息处理等等。与先进先出 FIFO(First In First Out)原理类似,消息队列 RocketMQ 提供的顺序消息即保证消息 FIFO。
- 分布式事务一致性:交易系统、支付红包等场景需要确保数据的最终一致性,大量引入消息队列 RocketMQ 的分布式事务,既可以实现系统之间的解耦,又可以保证最终的数据一致性。
- 分布式缓存同步:天猫双11大促,各个分会场琳琅满目的商品需要实时感知价格变化,大量并发访问数据库导致会场页面响应时间长,集中式缓存因带宽瓶颈,限制了商品变更的访问流量,通过消息队列 RocketMQ 构建分布式缓存,实时通知商品数据的变化。
RocketMQ 与其他 MQ 对比表
特性 | ActiveMQ | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|---|
单机吞吐量 | 万级,吞吐量比RocketMQ 和Kafka 要低了一个数量级 | 万级,吞吐量比 RocketMQ 和 Kafka 要低了一个数量级 | 10万级,RocketMQ 也是可以支撑高吞吐的一种MQ | 10万级别,这是 Kafka 最大的优点,就是吞吐量高。一般配合大数据类的系统来进行实时数据计算、日志采集等场景 |
topic数量对吞吐量的影响 | topic 可以达到几百,几千个的级别,吞吐量会有较小幅度的下降这是 RocketMQ 的一大优势,在同等机器下,可以支撑大量的 topic | topic 从几十个到几百个的时候,吞吐量会大幅度下降所以在同等机器下,Kafka 尽量保证 topic 数量不要过多。如果要支撑大规模 topic,需要增加更多的机器资源 | ||
时效性 | ms 级 | 微秒级,这是 RabbitMQ 的一大特点,延迟是最低的 | ms 级 | 延迟在 ms 级以内 |
可用性 | 高,基于主从架构实现高可用性 | 高,基于主从架构实现高可用性 | 非常高,分布式架构 | 非常高,Kafka 是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用 |
消息可靠性 | 有较低的概率丢失数据 | 经过参数优化配置,可以做到0丢失 | 经过参数优化配置,消息可以做到0丢失 | |
功能支持 | MQ 领域的功能极其完备 | 基于 erlang 开发,所以并发能力很强,性能极其好,延时很低 | MQ 功能较为完善,还是分布式的,扩展性好 | 功能较为简单,主要支持简单的 MQ 功能,在大数据领域的实时计算以及日志采集被大规模使用,是事实上的标准 |
优劣势总结 | 非常成熟,功能强大,在业内大量的公司以及项目中都有应用;偶尔会有较低概率丢失消息;而且现在社区以及国内应用都越来越少,官方社区现在对 ActiveMQ 5.x维护越来越少,几个月才发布一个版本,而且确实主要是基于解耦和异步来用的,较少在大规模吞吐的场景中使用 | erlang 语言开发,性能极其好,延时很低;吞吐量到万级,MQ 功能比较完备;而且开源提供的管理界面非常棒,用起来很好;用社区相对比较活跃,几乎每个月都发布几个版本;在国内一些互联网公司近几年用 RabbitMQ 也比较多一些但是问题也是显而易见的,RabbitMQ 确实吞吐量会低一些,这是因为他做的实现机制比较重。而且 erlang 开发,国内有几个公司有实力做 erlang 源码级别的研究和定制?如果说你没这个实力的话,确实偶尔会有一些问题,你很难去看懂源码,你公司对这个东西的掌控很弱,基本职能依赖于开源社区的快速维护和修复bug。而且 RabbitMQ 集群动态扩展会很麻烦,不过这个我觉得还好。其实主要是 erlang 语言本身带来的问题。很难读源码,很难定制和掌控。 | 接口简单易用,而且毕竟在阿里大规模应用过,有阿里品牌保障;日处理消息上百亿之多,可以做到大规模吞吐,性能也非常好,分布式扩展也很方便,社区维护还可以,可靠性和可用性都是 ok 的,还可以支撑大规模的 topic 数量,支持复杂 MQ 业务场景;而且一个很大的优势在于,阿里出品都是 Java 系的,我们可以自己阅读源码,定制自己公司的 MQ,可以掌控;社区活跃度相对较为一般,不过也还可以,文档相对来说简单一些,然后接口这块不是按照标准 JMS 规范走的有些系统要迁移需要修改大量代码;还有就是阿里出台的技术,你得做好这个技术万一被抛弃,社区黄掉的风险,那如果你们公司有技术实力我觉得用 RocketMQ 挺好的 | Kafka 的特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms 级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展;同时 Kafka 最好是支撑较少的topic数量即可,保证其超高吞吐量 ;而且 Kafka 唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略;这个特性天然适合大数据实时计算以及日志收集 |
RocketMQ 基本概念
中文 | 英文 | 说明 |
---|---|---|
消息模型 | Message Model | RocketMQ 主要由 Producer、Broker、Consumer 三部分组成,其中 Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个 Topic 的消息,每个 Topic 的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个Topic中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个 Consumer 实例构成。 |
消息生产者 | Producer | 负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到 broker 服务器。RocketMQ 提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要 Broker 返回确认信息,单向发送不需要。 |
消息消费者 | Consumer | 负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从 Broker 服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。 |
主题 | Topic | 表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是 RocketMQ 进行消息订阅的基本单位。 |
代理服务器 | Broker Server | 消息中转角色,负责存储消息、转发消息。代理服务器在 RocketMQ 系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。 |
名字服务 | Name Server | 名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的 Broker IP列表。多个 Namesrv 实例组成集群,但相互独立,没有信息交换。 |
拉取式消费 | Pull Consumer | Consumer 消费的一种类型,应用通常主动调用 Consumer 的拉消息方法从 Broker 服务器拉消息、主动权由应用控制。一旦获取了批量消息,应用就会启动消费过程。 |
推动式消费 | Push Consumer | Consumer 消费的一种类型,该模式下 Broker 收到数据后会主动推送给消费端,该消费模式一般实时性较高。 |
生产者组 | Producer Group | 同一类 Producer的集合,这类 Producer 发送同一类消息且发送逻辑一致。如果发送的是事务消息且原始生产者在发送之后崩溃,则Broker服务器会联系同一生产者组的其他生产者实例以提交或回溯消费。 |
消费者组 | Consumer Group | 同一类 Consumer 的集合,这类 Consumer 通常消费同一类消息且消费逻辑一致。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。要注意的是,消费者组的消费者实例必须订阅完全相同的 Topic。RocketMQ 支持两种消息模式:集群消费(Clustering)和广播消费(Broadcasting)。 |
集群消费 | Clustering | 集群消费模式下,相同 Consumer Group 的每个 Consumer 实例平均分摊消息。 |
广播消费 | Broadcasting | 广播消费模式下,相同 Consumer Group 的每个 Consumer 实例都接收全量的消息。 |
普通顺序消息 | Normal Ordered Message | 普通顺序消费模式下,消费者通过同一个消息队列( Topic 分区,称作 Message Queue) 收到的消息是有顺序的,不同消息队列收到的消息则可能是无顺序的。 |
严格顺序消息 | Strictly Ordered Message | 严格顺序消息模式下,消费者收到的所有消息均是有顺序的。 |
消息 | Message | 消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。RocketMQ 中每个消息拥有唯一的Message ID,且可以携带具有业务标识的 Key。系统提供了通过 Message ID 和 Key 查询消息的功能。 |
标签 | Tag | 为消息设置的标志,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化 RocketMQ 提供的查询系统。消费者可以根据 Tag 实现对不同子主题的不同消费逻辑,实现更好的扩展性。 |
安装与使用
安装
Docker安装RocketMQ
使用
RocketMQ 开发常用地址:
- Apache RocketMQ 项目官网
- Apache RocketMQ 开发者指南 - 中文
RocketMQ 入门必读相关推荐
- Flink 基本原理与生产实践分享【入门必读,概念清晰】
Flink 基本原理与生产实践分享[入门必读,概念清晰] https://zh.wikipedia.org/zh-hans/Apache_Flink Apache Flink是由Apache软件基金会 ...
- rocketmq 顺序消费_必须先理解的RocketMQ入门手册,才能再次深入解读
推荐阅读一下下 2020年后想跳槽?MQ.ZK.Nginx.Kafk等分布式技术你都掌握了? 阿里架构师推荐学习的<RabbitMQ实战指南>,渣渣的你都看过吗? RocketMQ入门手册 ...
- 云容器实例服务入门必读
云容器实例服务入门必读 华为云容器实例(Cloud Container Instance)服务是基于Kubernetes的Serverless Container(无服务器容器)引擎,兼容Kubern ...
- LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用
LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用. ...
- 【每周CV论文】深度学习文本检测与识别入门必读文章
欢迎来到<每周CV论文推荐>.在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的. 文本检测和识别是计算机视觉的一个非常重要的应 ...
- 《HTML5+CSS3网页设计入门必读》——1.7 使用FTP传输文件
本节书摘来自异步社区<HTML5+CSS3网页设计入门必读>一书中的第1章,第1.7节,作者: [美]Julie Meloni更多章节内容可以访问云栖社区"异步社区"公 ...
- Spring Boot 消息队列 RocketMQ 入门
转载自 芋道 Spring Boot 消息队列 RocketMQ 入门 摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/RocketMQ/ 「芋道源码」欢迎转载 ...
- rocketmq 订阅组_必须先理解的RocketMQ入门手册,才能再次深入解读
推荐阅读一下下 2020年后想跳槽?MQ.ZK.Nginx.Kafk等分布式技术你都掌握了? 阿里架构师推荐学习的<RabbitMQ实战指南>,渣渣的你都看过吗? RocketMQ入门手册 ...
- 《HTML5+CSS3网页设计入门必读》——2.8 转变(CH-CH变化)
本节书摘来自异步社区<HTML5+CSS3网页设计入门必读>一书中的第2章,第2.8节,作者: [英]Jeremy Keith , [美]Dan Cederholm 更多章节内容可以访问云 ...
最新文章
- Python3中 对local和nonlocal 关键字的改善认识(新手向)
- 猪和兔子的玻璃体给人用(仅仅是个人想法)
- 如何选择python书籍_如何选择一本优质的数据科学书籍
- PHP中的__get()和__set()方法获取设置私有属性
- PyTorch 中如何指定GPU
- Python datetime 格式化字符串:strftime()
- double bottoms
- 黑马程序员—因为感恩,所以我也来深圳黑马当班主任
- java地狱门方块,我的世界如何制作一个独特的“地狱门”? 赶快放弃你的方盒子吧...
- xwork配置文件: 新配置文件覆盖旧文件中的同名Action
- 黑电行业越来越难,海信、TCL、创维、康佳、长虹急需破局
- mysql 主从1146_MySQL5.7主从复制slave报Last_Errno: 1146错误解决
- CVPR2017-如何在无标签数据集上训练模型
- PS四种扁平化设计风格
- 从消息推送来看,华为、小米做得最好
- Windows远程桌面卡顿问题(包含网络调优)
- 商用厨房设备公司利邦国际申请纳斯达克IPO上市,募资2500万美元
- C语言补漏:字符串指针与字符数组传参
- 转业费计算器2019_士官复员费标准来了!附转业明细对比表
- state和status的区别
热门文章
- Rust开发——Vec与Struct的使用示例
- 天际线,楼宇轮廓问题
- MES 工厂建模以及对工厂功能的理解
- 重新开始学习编程系列Day10——超全的MySQL核心原理,从底层剖析MySQL
- Springboot+vue的医院门诊管理系统的设计与实现(也有SpringCloud版本)
- 网络分析——路径分析
- 如何在 SAP 中计算物料在某期的库存数量和金额?
- 才上架不久的超级玛丽3号max要停售保70岁版本?这对我们消费者有什么影响,一文解析
- java散点世界地图,踩坑ECharts(GL)地理位置散点图
- 2022年危险化学品经营单位主要负责人新版试题及危险化学品经营单位主要负责人考试技巧