Apache RocketMQ 从入门到实战.pdf
《Apache RocketMQ 从入门到实战.pdf》由会员分享,可在线阅读,更多相关《Apache RocketMQ 从入门到实战.pdf(164页珍藏版)》请在咨信网上搜索。
1、作者简介作者简介作者简介丁威,RocketMQ 技术内幕作者,RocketMQ 官方社区优秀布道师,荣获CSDN2020 博客之星亚军;担任中通快递研发中心资深架构师,维护中间件兴趣圈公众号,主打成体系剖析 Java 主流中间件,尝试从源码分析、架构设计、实战、故障分析等维度深刻揭晓中间件技术,已覆盖 RocketMQ、Dubbo、Sentienl、Kafka、Canal、MyCat、ElasticJob、ElasticSearch 等。推荐人及推荐序推荐人推荐人杜恒,Apache RocketMQ PMC Member/committer,Linux OpenMessaging TSCMem
2、ber,目前负责 RocketMQ 专有云商业化以及开源技术生态构建。具有多年分布式系统、中间件研究及工程经验。目前对分布式中间件、K8s、微服务、物联网、Serverless 感兴趣。推荐序推荐序Apache RocketMQ 作为一款高吞吐,抗万亿消息堆积的云原生消息平台,目前已经被国内 75%以上互联网、金融等公司所采用,逐渐成为企业 IT 架构的核心基础设施。丁威老师作为资深架构师,在分布式架构、存储方面功底深厚,目前在企业内部负责着日均千亿级消息流转的 RocketMQ 集群。本书不仅由浅入深的介绍了 RocketMQ 的架构与实现,而且包含了多年线上超大规模集群开发运维经验的总结,
3、通过本书不仅能够掌握分布式消息平台的设计原理,对线上疑难问题排查分析、性能调优与架构设计也大有帮助。目录开篇:我的另一种参与 RocketMQ 开源社区的方式61.1 RocketMQ 核心概念扫盲篇101.2 生产环境中,autoCreateTopicEnable 为什么不能设置为 true181.3 实战:RocketMQ 学习环境搭建指南篇281.4 RocketMQ HA 核心工作机制391.5 踩坑记:rocketmq-console 消费 TPS 为 0,但消息积压数却在降低是个什么“鬼”491.6 RocketMQ 一个新的消费组初次启动时从何处开始消费呢?641.7 一次 Ro
4、cketMQ 进程自动退出排查经验分享781.8 RocketMQ 主题扩分片后遇到的坑821.9 RocketMQ 消息发送 system busy、broker busy 原因分析与解决方案坑911.10 再谈 RocketMQ broker busy1041.11 从年末生产故障解锁 RocketMQ 集群部署的最佳实践1081.12 RocketMQ 一行代码造成大量消息丢失1151.13 RocketMQ DLedger 多副本即主从切换实战1211.14 RocketMQ msgId 与 offsetMsgId 释疑1311.15 RocketMQ ACL 使用指南1411.16
5、RocketMQ 消息轨迹-设计篇1511.17 消息发送常见问题与解决方案155本文来自中间件兴趣圈公众号,仅作技术交流,未授权任何商业行为。开篇:我的另一种参与 RocketMQ 开源社区的方式开篇:我的另一种参与 RocketMQ 开源社区的方式RocketMQ 为什么性能高效,到底运用了什么“厉害”的技术?RocketMQ 如何实现刷盘(可以类比一下数据库方面的刷盘、redo、undo 日志)?RocketMQ 文件存储设计理念、基于文件的 Hash 索引是怎么实现的?定时消息、消息过滤等实现原理。如何进行网络编程(Netty 实战)?下定决心后便开始了我的源码分析 RocketMQ
6、之旅,大概在 4 个多月的时间中连续发表了 30 余篇文章,从 Nameserver、消息发送高可用设计、消息存储、消息消费、消息过滤、事务消息等各个方面对其进行了体系化的剖析,边写边分享,边分享边传播,终于得到了机械工业出版社华章分社的杨福川老师的认可,邀请我出书。在杨老师和张工的帮助与指点下,经过将近半年的努力,书稿基本完稿。由于我当时是一位名不经传的新人,按照出版行业的惯例,需要找一些该领域内专家大牛帮忙做序或写写推荐语。当时我也是初生牛犊不怕虎,蹦出了一个非常大胆的想法,是不是可以联系到RocketMQ 官方的一些大佬,最终我直接锁定了 RocketMQ 创始人冯嘉大神,希望他能帮我作
7、序推荐,令人惊喜的是冯嘉大神非常平易见人,得知我的来意后,他说了这样一句话:“我是非常愿意为写书的朋友作序,但需要评估一下书稿的质量,如果质量 OK,非常愿意效劳”。我备受鼓舞,在和出版社初步沟通后,将试读稿件再加上消息存储整章的内容发给冯嘉大神后,经冯嘉大神认真审稿后,决定帮忙推荐作序,真的非常受鼓舞。随着RocketMQ 技术内幕一书的正式出版上市,并得到广大读者朋友的认可,与官方的联系也越来越多,后面在 RocketMQ 中国社区负责人青峰大佬的筹备下,我还参与了 RocketMQ 官方社区的源码解析直播活动、官方文档审稿等工作,并在社区得到了不错的反响。说到这里大家是不是觉得非常奇怪,
8、是不是都认为你只是在写文章,写书,没有真正参与开源社区呀,没有贡献代码,这个算哪门子参与开源社区?其实我一开始连我自己也没有意识到我正在参与一个开源项目,直到我在冯嘉大神为我写的序言中给了我一个新的称号:RocketMQ 布道师,从而才真正了解到参与开源的另外一种方式:做一个开源项目的传播者,让更多人更容易的应用它,即降低大众对它的使用门槛。本文来自中间件兴趣圈公众号,仅作技术交流,未授权任何商业行为。开篇:我的另一种参与 RocketMQ 开源社区的方式开篇:我的另一种参与 RocketMQ 开源社区的方式接下来我们回到本节的主题,那如何参与一个开源项目呢?在参与一个开源项目之前,我觉得第一
9、个最基本的步骤还是要打牢基础,这里的基础至少要包括 JAVA 集合、JAVA 并发(JUC)这两项,只是最最基本的,至少要阅读其源码,理解其设计理念,至于 NIO,Netty 这些可以后续在需要使用时再去专门学习,有针对性的学习,有使用需求,或许学习动力更强劲,学习效率更高效。当具备一定的基础后,如何从零开始参与进开源项目呢?通常有如下几个方法:看看官方文档,特别是设计手册,从整体上把握其设计理念。写写源码分析类文章,从整体上把控这个框架,这个花费时间较多,如果框架正在起步。阶段,不建议该方法;如果框架比较成熟,非常建议采用该方法。尝试看看开源项目中的 issues,看能不能解决,从问题入手,
10、快速融入该项目。尝试谢谢单元测试用例,测试驱动开发,借此学习该框架。后面的事情就是坚持不懈,朝着目标不断前进,中途可以放慢速度,但千万别放弃,因为只有坚持,才能胜利,只要前进,就离目标更近。参与开源,一个最基本的条件是拥有大量的连续时间,想要成为一个开源框架的Committer,唯有坚持不懈,持续投入,持续产出。最后再次感谢 RocketMQ 社区对我的认可,我会尽努力做出更大的贡献,也希望广大读者朋友们,积极参与开源社区,贡献一份自己的力量,同事打造自身影响力,助力职场步步高升。本文来自中间件兴趣圈公众号,仅作技术交流,未授权任何商业行为。1.1 RocketMQ 核心概念扫盲篇1.1 Ro
11、cketMQ 核心概念扫盲篇3.3.ClientClient消息客户端,包括 Producer(消息发送者)和 Consumer(消费消费者)客户端在同一时间只会连接一台 nameserver,只有在连接出现异常时才会向尝试连接另外一台。客户端每隔 30s 向 Nameserver 发起 topic 的路由信息查询。温馨提示:Nameserver 是在内存中存储 Topic 的路由信息,持久化 Topic 路由信息的地方是在 Broker 中,即$ROCKETMQ_HOME/store/config/topics.json。在 RocketMQ4.5.0 版本后引入了多副本机制,即一个复制组(
12、m-s)可以演变为基于 raft 协议的复制组,复制组内部使用 raft 协议保证 broker 节点数据的强一致性,该部署架构在金融行业用的比较多。二二、消息订阅模型、消息订阅模型在 RocketMQ 的消息消费模式采用的是发布与订阅模式。topic:一类消息的集合,消息发送者将一类消息发送到一个主题中,例如订单模块将订单发送到 order_topic 中,而用户登录时,将登录事件发送到 user_login_topic 中。consumegroup:消息消费组,一个消费单位的“群体”,消费组首先在启动时需要订阅需要消费的 topic。一个 topic 可以被多个消费组订阅,同样一个消费组也
13、可以订阅多个主题。一个消费组拥有多个消费者。术语解释起来有点枯燥晦涩,接下来我举例来阐述。术语解释起来有点枯燥晦涩,接下来我举例来阐述。例如我们在开发一个订单系统,其中有一个子系统:order-service-app,在该项目中会创建一个消费组 order_consumer 来订阅 order_topic,并且基于分布式部署,order-service-app 的部署情况如下:本文来自中间件兴趣圈公众号,仅作技术交流,未授权任何商业行为。1.1 RocketMQ 核心概念扫盲篇1.1 RocketMQ 核心概念扫盲篇在在 MQMQ 领域有一个不成文的约定:同一个消费者同一时间可以分配多个队列,
14、但一个领域有一个不成文的约定:同一个消费者同一时间可以分配多个队列,但一个队列同一时间只会分配给一个消费者。队列同一时间只会分配给一个消费者。RocketMQ 提供了众多的队列负载算法,其中最常用的两种平均分配算法。AllocateMessageQueueAveragely平均分配AllocateMessageQueueAveragelyByCircle轮流平均分配为了说明这两种分配算法的分配规则,现在对 16 个队列,进行编号,用 q0q15 表示,消费者用 c0c2 表示。AllocateMessageQueueAveragely 分配算法的队列负载机制如下:c0:q0 q1 q2 q3
15、q4 q5c1:q6 q7 q8 q9 q10c2:q11 q12 q13 q14 q15其算法的特点是用总数除以消费者个数,余数按消费者顺序分配给消费者,故 c0 会多分配一个队列,而且队列分配是连续的。AllocateMessageQueueAveragelyByCircle 分配算法的队列负载机制如下:c0:q0 q3 q6 q9 q12 q15c1:q1q4 q7 q10 q13c2:q2q5 q8 q11 q14本文来自中间件兴趣圈公众号,仅作技术交流,未授权任何商业行为。1.1 RocketMQ 核心概念扫盲篇1.1 RocketMQ 核心概念扫盲篇上述整个过程无需应用程序干预,由
16、 RocketMQ 完成。大概的做法就是将将原先分配给自己但这次不属于的队列进行丢弃,新分配的队列则创建新的拉取任务。3.3.消费进度消费进度消费者消费一条消息后需要记录消费的位置,这样在消费端重启的时候,继续从上一次消费的位点开始进行处理新的消息。在 RocketMQ 中,消息消费位点的存储是以消费组为单位的。集群模式集群模式下,消息消费进度存储在 broker 端,$ROCKETMQ_HOME/store/config/consumerOffset.json 是其具体的存储文件,其中内容截图如下:可见消费进度的 Key 为:topicconsumeGroup,然后每一个队列一个偏移量。广播
17、模式广播模式的消费进度文件存储在用户的主目录,默认文件全路劲名:$USER_HOME/.rocketmq_offsets。4.4.消费模型消费模型RocketMQ 提供了并发消费、顺序消费两种消费模型。并发消费并发消费:对一个队列中消息,每一个消费者内部都会创建一个线程池,对队列中的消息多线程处理,即偏移量大的消息比偏移量小的消息有可能先消费。顺序消费顺序消费:在某一项场景,例如 MySQL binlog 场景,需要消息按顺序进行消费。在RocketMQ 中提供了基于队列的顺序消费模型,即尽管一个消费组中的消费者会创建一个多线程,但针对同一个 Queue,会加锁。温馨提示:并发消费模型中,消息
18、消费失败默认会重试 16 次,每一次的间隔时间不一样;而顺序消费,如果一条消息消费失败,则会一直消费,直到消费成功。故在顺序消费的本文来自中间件兴趣圈公众号,仅作技术交流,未授权任何商业行为。1.1 RocketMQ 核心概念扫盲篇1.1 RocketMQ 核心概念扫盲篇RocketMQ 目前支持指定级别的延迟,其延迟级别如下:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h五五、消息过滤、消息过滤消息过滤是指消费端可以根据某些条件对一个 topic 中的消息进行过滤,即只消费一个主题下满足过滤条件的消息。RocketMQ 目
19、前主要的过滤机制是基于 tag 的过滤与基于消息属性的过滤,基于消息属性的过滤支持 SQL92 表达式,对消息进行过滤。六六、小结、小结本文的主要目的是介绍 RocketMQ 常见的术语,例如 nameserver、broker、主题、消费组、消费者、队列负载算法、队列重平衡机制、并发消费、顺序消费、消费进度存储、定时消息、事务消息、消息过滤等基本概念,为后续的实战系列打下坚实基础。从下一篇开始,将正式开始 RocketMQ 之旅,开始学习消息发送。本文来自中间件兴趣圈公众号,仅作技术交流,未授权任何商业行为。1.2 生产环境中,autoCreateTopicEnable 为什么不能设置为 t
20、rue1.2 生产环境中,autoCreateTopicEnable 为什么不能设置为 true默认读写队列的个数为 4。我们再来看一下 RocketMQ 默认 topic 的路由信息截图如下:从图中可以默认 Topic 的路由信息为 broker-a、broker-b 上各 8 个队列。二二、思考、思考默认 Topic 的路由信息是如何创建的?Topic 的路由信息是存储在哪里?Nameserver?broker?RocketMQ Topic 默认队列个数。三三、原理、原理1.1.RocketMQRocketMQ 基本路由规则基本路由规则本文来自中间件兴趣圈公众号,仅作技术交流,未授权任何商
21、业行为。1.2 生产环境中,autoCreateTopicEnable 为什么不能设置为 true1.2 生产环境中,autoCreateTopicEnable 为什么不能设置为 true但问题就来了,默认 Topic 在集群的每一台 Broker 上创建 8 个队列,那问题来了,为啥新创建的 Topic 只在一个 Broker 上创建 4 个队列?2.2.探究探究 autoCreateTopicEnableautoCreateTopicEnable 机制机制默认默认 TopicTopic 路由创建时机路由创建时机温馨提示:本文不会详细跟踪整个整个源码创建过程,只会点出代码的关键入口点,如想详
22、细了解 NameServer 路由消息、消息发送高可用的实现原理,建议查阅笔者的书籍RocketMQ 技术内幕第二、三章。Step1:在 Broker 启动流程中,会构建 TopicConfigManager 对象,其构造方法中首先会判断是否开启了允许自动创建主题,如果启用了自动创建主题,则向 topicConfigTable 中添加默认主题的路由信息。TopicConfigManager 构造方法:本文来自中间件兴趣圈公众号,仅作技术交流,未授权任何商业行为。211.2 生产环境中,autoCreateTopicEnable 为什么不能设置为 true备注:该 topicConfigTabl
23、e 中所有的路由信息,会随着 Broker 向 Nameserver 发送心跳包中,Nameserver 收到这些信息后,更新对应 Topic 的路由信息表。注意:BrokerConfig 的 defaultTopicQueueNum 默认为 8。两台 Broker 服务器都会运行上面的过程,故最终 Nameserver 中关于默认主题的路由信息中,会包含两个Broker 分别各 8 个队列信息。Step2:生产者寻找路由信息生产者首先向 NameServer 查询路由信息,由于是一个不存在的主题,故此时返回的路由信息为空,RocketMQ 会使用默认的主题再次寻找,由于开启了自动创建路由信息
24、,NameServer 会向生产者返回默认主题的路由信息。然后从返回的路由信息中选择一个队列(默认轮询)。消息发送者从 Nameserver 获取到默认的 Topic 的队列信息后,队列的个数会改变吗?答案是会的,其代码如下:MQClientInstance#updateTopicRouteInfoFromNameServer本文来自中间件兴趣圈公众号,仅作技术交流,未授权任何商业行为。1.2 生产环境中,autoCreateTopicEnable 为什么不能设置为 true22温馨提示:消息发送者在到默认路由信息时,其队列数量,会选择 DefaultMQProducer#defaultTop
25、icQueueNums 与 Nameserver 返回的的队列数取最小值,DefaultMQProducer#defaultTopicQueueNums 默认值为 4,故自动创建的主题,其队列数量默认为 4。Step3:发送消息DefaultMQProducerImpl#sendKernelImpl在消息发送时的请求报文中,设置默认 topic 名称,消息发送 topic 名称,使用的队列数量为 DefaultMQProducer#defaultTopicQueueNums,即默认为 4。Step4:Broker 端收到消息后的处理流程服务端收到消息发送的处理器为:SendMessagePro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Apache RocketMQ 从入门到实战 入门 实战
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【Stan****Shan】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【Stan****Shan】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。