2022Apache RocketMQ 从入门到实战.docx
《2022Apache RocketMQ 从入门到实战.docx》由会员分享,可在线阅读,更多相关《2022Apache RocketMQ 从入门到实战.docx(164页珍藏版)》请在课桌文档上搜索。
1、ApacheRoCketMO从入门到实战I目录开篇:我的另一种参与RocketMQ开源社区的方式61.1 RocketMQ核心概念扫盲篇101.2 生产环境中,autoCreateTopicEnable为什么不能设置为true181.3 实战:RoCketMQ学习环境搭建指南篇281.4 RocketMQHA核心工作机制391.5 踩坑记:roCketmq-ConSole消费TPS为0,但消息积压数却在降低是个什么“鬼”491.6 RocketMQ一个新的消费组初次启动时从何处开始消费呢?641.7 一次RocketMQ进程自动退出排查经验分享781.8 RocketMQ主题扩分片后遇到的坑8
2、21.9 RocketMQ消息发送systembusy、brokerbusy原因分析与解决方案坑911.10 再谈RocketMQbrokerbusy1041.11 从年末生产故隙解锁RocketMQ集群部署的最佳实践1081.12 RocketMQ一行代码造成大量消息丢失1151.13 RocketMQD1.edger多副本即主从切换实战1211.14 RocketMQmsgld与OffsetMsgId释疑1311.15 RocketMQAC1.使用指南1411.16 RocketMQ消息轨迹-设计篇1511551.17 消息发送常见问题与解决方案开篇:我的另一种参与RocketMQ开源社区
3、的方式夕ROCfcetMQYwnMthful2019OlTSTAM)INGCOVnUBlTORCERTIFICATElU卜torrrtihthl&dinwmz:iRfvQ-姆CkHiyiPu-3AX”2WeXE1.洸,1.bjgFi.Z*m,uIhw说到参与开源项目,很多人都理解为成为一名Committer才能算式参与到开源社区的建设?但其实这个就是参与开源项目有代码层面的贡献,也有非代码贡献层面的如技术布道、社区运营(线上直播、线下活动、文档编辑)等。如何参与一个开源项目,容我慢慢道来。-、与RocketMQ相识、相知到在一起在2017年听到阿里巴巴将RocketMQ捐赠给Apache基金会
4、成为Apache的顶级项目,我内心是无比激动,因为终于可以一睹一款高性能的消息中间件的实现原理。通过阅读了RocketMQ官方,以下几个特别的点更是吸引了我的注意,让我下定决心深入研究一番。.RocketMQ为什么性能高效,到底运用了什么“厉害”的技术?.RocketMQ如何实现刷盘(可以类比一下数据库方面的刷盘、red。、undo日志)?.RocketMQ文件存储设计理念、基于文件的Hash索引是怎么实现的?.定时消息、消息过滤等实现原理。.如何进行网络编程(Netty实战)?下定决心后便开始了我的源码分析RocketMQ之旅,大概在4个多月的时间中连续发表了30余篇文章,从Nameserv
5、er,消息发送高可用设计、消息存储、消息消费、消息过滤、事务消息等各个方面对其进行了体系化的剖析,边写边分享,边分享边传播,终于得到了机械工业出版社华章分社的杨福川老师的认可,邀请我出书。在杨老师和张工的帮助与指点下,经过将近半年的努力,书稿基本完稿。由于我当时是位名不经传的新人,按照出版行业的惯例,需要找一些该领域内专家大牛帮忙做序或写写推荐语。当时我也是初生牛犊不怕虎,蹦出了一个非常大胆的想法,是不是可以联系到RockaMQ官方的一些大佬,最终我直接锁定了RocketMQ创始人冯嘉大神,希望他能帮我作序推荐,令人惊喜的是冯嘉大神非常平易见人,得知我的来意后,他说了这样一句话:“我是非常愿意
6、为写书的朋友作序,但需要评估一下书稿的质量,如果质量OK,非常愿意效劳”。我备受鼓舞,在和出版社初步沟通后,将试读稿件再加上消息存储整章的内容发给冯嘉大神后,经冯嘉大神认真审稿后,决定帮忙推荐作序,真的非常受鼓舞。随着RockeiMQ技术内幕一书的正式出版上市,并得到广大读者朋友的认可,与官方的联系也越来越多,后面在RocketMQ中国社区负责人青峰大佬的筹备下,我还参与了RockotMQ官方社区的源码解析直播活动、官方文档审稿等工作,并在社区得到了不错的反响。说到这里大家是不是觉得非常奇怪,是不是都认为你只是在写文章,写书,没有真正参与开源社区呀,没有贡献代码,这个算哪门子参与开源社区?其实
7、我一开始连我自己也没有意识到我正在参与一个开源项目,直到我在冯嘉大神为我写的序言中给了我一个新的称号:RockotMQ布道师,从而才真正了解到参与开源的另外一种方式:做一个开源项目的传播者,让更多人更容易的应用它,即降低大众对它的使用门槛。有了新的称号,那就得更加努力,朝着优秀努力,在2019年我又陆续发表了20几篇关于ROCketMQ相关的文章,这些文章含金量极高,不仅及时跟进了RocketMQ4.3,0之后的新特性:消息轨迹、AC1.主从切换等机制,更是发表了数篇实战类文章,详细指出在生产环境下一些使用误区,更是输出了几篇生产环境真实故障与解决方案。最终于2019年RocketMQ官方社区
8、授予我优秀布道师荣誉称号。RocketMQ成就了我,我也会继续努力,为传播RocketMQ尽一份力所能及的力量。2020年,继续努力。二、如何成为开源项目的Committer有一些粉丝在问我,您对RockctMQ研究的这么深入,为什么不考虑贡献代码,成为一名Committer呢?这是因为参与开源项目需要具备一些基本条件,当下我的实际情况不符合,那成为一个开源项目的Committer有些什么条件呢?1 .扎实的JaVa基础功底一个开源项目的底层都会涉及到存储,这就要求具备一定的数据结构基础,JAVA集合框架中的类自然成为了我们突破数据结构最好的老师,其次是java并发,即多线程、并发容器、锁等课
9、题,这方面可以好好学习一下JUC框架。最后最好是具备一些网络方面的知识,例如NlO、Nettyo2 .持续输出能力成为一个开源项目的contributions非常容易,提交一个PR并被通过即可,甚至于提交一个文档被接受也同样可以,难的是持续贡献,最终被开源项目的PMC认为对该项目有着突出贡献。我比较“苦逼”,在带娃方面我的资源只有我老婆,父母在老家无法分身,故下班后我没有连续的空闲时间专心投入一项任务中,而开源最需要的是精益求精,不只是需要完成功能,而是要编写结构优良的代码,设计所占据的时间比代码开发时间要多的多,故我个人认为我暂时不方便走代码贡献这条道路。但我零碎时间还是充足的,故现阶段我会
10、好好利用这些零碎时间,继续通过写文章的方式为开源项目贡献自己的一份力量。接下来我们回到本节的主题,那如何参与一个开源项目呢?在参与一个开源项目之前,我觉得第一个最基本的步骤还是要打牢基础,这里的基础至少要包括JAVA集合、JAVA并发(JUC)这两项,只是最最基本的,至少要阅读其源码,理解其设计理念,至于NlO,Netty这些可以后续在需要使用时再去专门学习,有针对性的学习,有使用需求,或许学习动力更强劲,学习效率更高效。当具备一定的基础后,如何从零开始参与进开源项目呢?通常有如下几个方法:.看看官方文档,特别是设计手册,从整体上把握其设计理念。写写源码分析类文章,从整体上把控这个框架,这个花
11、费时间较多,如果框架正在起步。阶段,不建议该方法;如果框架比较成熟,非常建议采用该方法。.尝试看看开源项目中的issues,看能不能解决,从问题入手,快速融入该项目。.尝试谢谢单元测试用例,测试驱动开发,借此学习该框架。后面的事情就是坚持不懈,朝着目标不断前进,中途可以放慢速度,但千万别放弃,因为只有坚持,才能胜利,只要前进,就离目标更近。参与开源,一个最基本的条件是拥有大量的连续时间,想要成为一个开源框架的Commder,唯有坚持不懈,持续投入,持续产出。最后再次感谢RocketMQ社区对我的认可,我会尽努力做出更大的贡献,也希望广大读者朋友们,积极参与开源社区,贡献一份自己的力量,同事打造
12、自身影响力,助力职场步步高升。1.1RocketMQ核心概念扫盲篇在正式进入RocketMQ的学习之前,我觉得有必要梳理一下RockotMQ核心概念,为大家学习RQCkelMQ打下牢固的基础。-、RocketMQ部署架构在RockelMQ主要的组件如下:1. NameserverNameserver集群,topic的路由注册中心,为客户端根据Topic提供路由服务,从而引导客户端向BrC)ker发送消息。NameSerVer之间的节点不通信。路由信息在Nameserver集群中数据一致性采取的最终一致性。2. Broker消息存储服务器,分为两种角色:Master与Slave,上图中呈现的就是
13、2主2从的部署架构,在RockeiMQ中,主服务承担读写操作,从服务器作为一个备份,当主服务器存在压力时,从服务器可以承担读服务(消息消费)。所有Broker,包含Slave服务器每隔30s会向Nameserver发送心跳包,心跳包中会包含存在在Broker上所有的topic的路由信息。3. Client消息客户端,包括ProdUCer(消息发送者)和CQnSUmer(消费消费者).客户端在同一时间只会连接一台nameserver,只有在连接出现异常时才会向尝试连接另外一台。客户端每隔30s向Nameserver发起topic的路由信息查询。温馨提示:Nameserver是在内存中存储Topi
14、c的路由信息,持久化Topic路由信息的地方是在RrOker中,即$ROCKETMQ_HOME)/store/config/topics.jsono在RocketMQ4.5.0版本后引入了多副本机制,即一个复制组(m-s)可以演变为基于raft协议的复制组,复制组内部使用raft协议保证broker节点数据的强一致性,该部署架构在金融行业用的比较多。二、消息订阅模型在RocketMQ的消息消费模式采用的是发布与订阅模式。topic:一类消息的集合,消息发送者将一类消息发送到一个主题中,例如订单模块将订单发送到OrdeJlopic中,而用户登录时,将登录事件发送到user_.og:ntopic中
15、。consumegroup:消息消费组,一个消费单位的“群体”,消费组首先在启动时需要订阅需要消费的topic0一个topic可以被多个消费组订阅,同样一个消费组也可以订阅多个主题。一个消费组拥有多个消费者。术语解释起来有点枯燥晦涩,接下来我举例来阐述。例如我们在开发一个订单系统,其中有一个子系统:Order-SerViCe-app,在该项目中会创建一个消费组Order_consumer来订阅Ordor_tOPic,并且基于分布式部署,order-service-app的部署情况如下:ordcr-servicc-appordcr-scrvicc-appordcr-servicc-app192.
16、168.1.16192.168.1.17192.168.1.18orderconsumerorderconsumerorderconsumer即order-service-app部署了3台服务器,每一个jvm进程可以看做是消费组order_consumer消费组的其中一个消费者。1 .消费模式那这三个消费者如何来分工来共同消费Orderjopic中的消息呢?在R。CketMQ中支持广播模式与集群模式。广播模式:一个消费组内的所有消费者每一个都会处理topic中的每一条消息,通常用于刷新内存缓存。集群模式:一个消费组内的所有消费者共同消费个topic中的消息,即分工协作,一个消费者消费一部分数据
17、,启动负载均衡,集群模式是非常普遍的模式,符合分布式架构的基本理念,即横向扩容,当前消费者如果无法快速及时处理消息时,可以通过增加消费者的个数横向扩容,快速提高消费能力,及时处理挤压的消息。2 .消费队列负载算法与重平衡机制那集群模式下,消费者是如何来分配消息的呢?例如上面实例中order_topic有16个队列,那一个拥有3个消费者的消费组如何来分配队列中。在MQ领域有一个不成文的约定:同一个消费者同一时间可以分配多个队列,但一个队列同一时间只会分配给一个消费者。RocketMQ提供了众多的队列负载算法,其中最常用的两种平均分配算法。AnocateMessageQueueAveragely-
18、平均分配ABocatcMessageQueuoAveragelyByCircle.轮流平均分配为了说明这两种分配算法的分配规则,现在对16个队列,进行编号,用qql5表示,消费者用COc2表示。A.ocatcMossagoQueueAveragely分配算法的队列负载机制如下:cO:qqlq2q3q4q5cl:q6q7q8q9qlc2:qllql2ql3ql4ql5其算法的特点是用总数除以消费者个数,余数按消费者顺序分配给消费者,故c会多分配一个队列,而且队列分配是连续的。ADocateMessageQueueAverageIyByCircle分配算法的队列负载机制如下:cO:qq3q6q9q
19、l2ql5cl:qlq4q7qlql3该分配算法的特点就是轮流一个一个分配。温馨提示:如果topic的队列个数小于消费者的个数,那有些消费者无法分配到消息。在RocketMQ中一个topic的队列数直接决定了最大消费者的个数,但topic队列个数的增加对RocketMQ的性能不会产生影响。在实际过程中,对主题进行扩容(增加队列个数)或者对消费者进行扩容、缩容是一件非常寻常的事情,那如果新增一个消费者,该消费者消费哪些队列呢?这就涉及到消息消费队列的重新分配,即消费队列重平衡机制。在RocketMQ客户端中会每隔20s去查询当前topic的所有队列、消费者的个数,运用队列负载算法进行重新分配,然
20、后与上一次的分配结果进行对比,如果发生了变化,则进行队列重新分配;如果没有发生变化,则忽略。例如采取的分配算法如下图所示,现在增加一个消费者c3,那队列的分布情况是怎样的呢?AlIoCateMeSSageQUeUeAVeragely分配算法的队列负载机制如下:c:qq1q2q3q4q5d:q6q7q8q9q10c2:q11q12q13q14q15根据新的分配算法,其队列最终的情况如下:cO:qqlq2q3cl:q4q5q6q7c2:q8q9qlqllc3:ql2ql3ql4ql5上述整个过程无需应用程序干预,由RocketMQ完成。大概的做法就是将将原先分配给自己但这次不属于的队列进行丢弃,新
21、分配的队列则创建新的拉取任务。3 .消费进度消费者消费一条消息后需要记录消费的位置,这样在消费端重启的时候,继续从上一次消费的位点开始进行处理新的消息。在RocketMQ中,消息消费位点的存储是以消费组为单位的。集群模式下,消息消费进度存储在broker端,$ROCKETMQHOME)storeconfigconsumerffsel.json是其具体的存储文件,其中内容截图如下:OffsetTable:“TopicTest部IeaSerenameuniquegroupname4;0:1,1:1,2:1,3:2).%RETRY%please_ren)in_unlque_roup_nane_4pl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022Apache RocketMQ 从入门到实战 2022 Apache 入门 实战

链接地址:https://www.desk33.com/p-1422154.html