前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >rocketmq-3:rocketmq流控/重试机制与应对

rocketmq-3:rocketmq流控/重试机制与应对

作者头像
千里行走
发布于 2019-07-03 09:59:07
发布于 2019-07-03 09:59:07
2.9K0
举报
文章被收录于专栏:千里行走千里行走

强调:

本文基于rocketmq-4.3.2版本,不同版本是存在机制差异的,请阅读rocketmq源码。

1.异常概述:

producer发送消息报错broker busy.

2.线上影响:

很小,小于rpc同步调用下的失败/超时率:线上单节点每发送1600万+(共6个节点),每个节点大约300条左右produce失败。

3.原因概述:

严格讲这个不算mq的问题。

rocketmq-broker默认情况下(brokerFastFailureEnable=true),rocketmq集群本身对producer的message写请求有流控,这个流控机制在broker端,包含两层:

a.broker的msg request queue中的msgReq的等待时间超过阈值,触发流控。

b.broker向磁盘写入时的lock时间超过阈值,触发流控。

4.解决方案:

方案一(我们选择的方案):

通过分析发生流控的毫秒数分布发现,加重试可以解决(blocking-queue,线程池异步重试即可),queue-size设置200即可。

方案二:

修改rocketmq的配置,比如关闭流控(brokerFastFailureEnable=false),或者调大相关的时间阈值(osPageCacheBusyTimeOutMills, waitTimeMillsInSendQueue, waitTimeMillsInPullQueue, waitTimeMillsInHeartbeatQueue, waitTimeMillsInTransactionQueue)。

没有选择这个方案的原因:mq/我们更关心的是处理速度,不希望隐藏/延迟业务潜在问题;而且默认配置足够支持很高的并发(我们线上峰值单broker是1.5~2W的TPS,其实也不高)。

其他优化措施:

a.后续计划在总成本边的前提下用ssd替换物理磁盘。理由&依据如下: b.成本可以接受:线上使用的是1TB物理磁盘,price(1TB物理磁盘)=price(360GB SSD磁盘)。 c.线上数据不需要这么大容量: 进过线上运行的分析,不需要这么大的磁盘;目前单机只使用了不到10GB磁盘空间,一天至少1亿条消息,单体消息<100B,完全可以使用SSD。 最初估计的1TB不必要。 d.完善监控:需要自己写。

解决后效果预计:

producer消息发送失败次数趋近于0(网络抖动等不可抗拒因素,概率很小)。 注: 完全做到0代价太大,而且没有必要;监控做好根据实际调控资源即可。

(2).rocketmq中broker的流控机制详解

默认情况下,broker开启流控开关:brokerFastFailureEnable=true,broker每隔10毫秒会做一次流控处理,如下图:

流控主体方法,包含两步,commitlog锁时间超过阈值的流控触发,和queue中待处理任务的等待时间超过指定阈值时的流控触发。

1.commitlog锁时间超过阈值的流控触发

从下面两处代码可以看到判断逻辑:

实际的putMessage(写入commitlog操作),上图中isOSPageCacheBusy方法中的getCommitLog().getBeginTimeInLock()在下图中的标注方法中生成,通过这个时间lockTime(commitLog)是否超过既定阈值,从而决定是否触发流控。

当确认要进行流控时,处理很简单(通行操作),从Queue中直接poll,然后设置response后直接返回,注意responseCode是SYSTEM_BUSY,rocketmq-client发现是system_busy,不会重试/重发消息,因为此时broker已经超出负载,rocketmq认为应该直接丢弃(此处没有问题,流控的处理模式)。

2.queue中的task的等待时间超过阈值时的流控触发

如下图,也是类似的处理,有些许不同,先peak,然后stop task,再remove,最后同样直接返回response,responseCode=SYSTEM_BUSY。

3.注意

一旦触发了rocketmq-broker的流控,被remove掉的message直接丢失,这是流控的语义。

(3).我们为何要对流控丢失的消息进行重试

也是通过数据分析,这样做性价比最高。

通过分析峰值时的broker busy的数量与时间分布,数据依据,如下图

重试code,可以看到,有多个prometheus统计指标,我们对send的整个流程的各个节点做了监控:

(4).rocketmq-client的重试机制

如下图:

1.可以看到,client对各种异常进行了处理,发生异常时进行重试。

2.但是,并不是对所有异常都会进行重试,当捕获MQBrokerException时,会判断responseCode的值,当responseCode为一些特定值时,比如前边提到的SYSTEM_BUSY,还有topicNotExist等,是不会进行重试的,这是显然的。

再往下看代码,可以发现,client对broker返回的response做了处理,会包装成MQBrokerException,这也是为什么会出现上图中的逻辑,见下图(代码长,截了两个图):

(5).总结

多看源码,并且一定要多总结。

写本文重新梳理时,发现很多细节记不清了,并且发生了对代码的怀疑。一定要对总结落地。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 千里行走 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
iOS开发系列——Storyboard
到目前为止我们还没有解释我们的程序是如何显示默认视图界面的。做过WinForm程序的朋友都知道每个Window窗口界面都有一个设计器(对应一个设计文件),其实在IOS中也可以通过设计工具设计界面不用编写代码,这个工具就是Interface Builder。用Interface Builder编辑的文件在iOS5之前是一个“.xib”文件,从IOS5开始进行了改进,使用“.storyboard”文件进行设计。其实在上面我们已经看到这个文件,这里重点说明一下Storyboard文件的使用。
Kris大鲨
2018/05/05
3.6K2
iOS开发系列——Storyboard
【IOS开发基础系列】Storyboard专题
        如果你的 app 有大量的窗口,故事板能帮你减少许多用于从一个窗口转到另一个窗口的导航代码。与每个viewcontroller一个单独的 nib 文件不同,你的 app 只需用一个故事板文件(其中可以包含所有的viewcontroller 以及它们之间的关系)即可。
江中散人_Jun
2023/10/16
2.1K0
【IOS开发基础系列】Storyboard专题
【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
创建一个 HelloWorld 项目, 在这个 IOS 项目中有四个目录 : 如下图;
韩曙亮
2023/03/27
5.4K0
【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)
iOS中storyboard故事板使用Segue跳转界面、传值
在iOS的开发过程中,不可避免的要设计界面,在android中有xml设置界面和直接使用java代码设置界面控件两种方式,在之前的ios开发中也是类似的有xib文件设置界面及用代码直接设置控件两种方法,但后来又出了一种方式,就是storyboard故事板子,其实storyboard和xib文件很像,最大的不同之处在于一个xib文件对应一个ViewController视图控制器,而storyboard对应多个,基本一个应用只需要一个storyboard就可以了,不再需要为每个控制器创建一个xib文件,从这点上来说,还是很方便的,在storyboard中查看各个界面的跳转也很方便,但之前一直使用xib进行开发,对storyboard的使用不太熟悉,今天好好学习了一下其中的界面跳转和传值,用到了Segue这个东西,这里借着例子说明一下。
Cloudox
2021/11/23
1.8K0
iOS中storyboard故事板使用Segue跳转界面、传值
iOS 9 Storyboard 教程(二上)介绍Segue静态单元格(static cell)
Add Player 最终的设计看上去像下面这样:#接第一部分: 原帖地址 简书地址
hrscy
2018/08/30
3.8K0
iOS 9 Storyboard 教程(二上)介绍Segue静态单元格(static cell)
《iOS UI 开发捷径 利用 Interface Builder 高效、优雅地开发 UI》 读书笔记第1章 Interface Bundle 概要第2章 使用 Interface Builder第3
第1章 Interface Bundle 概要 ---- Bundle 一种标准化的层次结构,保存了可执行代码及代码所需要的资源。 nib Next Interface Builder Interface Builder 的优点 开发和维护效率高 减少大量的 UI 代码和“胶水代码” 适配变得十分简单 IB 也可以做一些非 UI 的事情 利用 IB 学习控件可以达到事半功倍的效果 Interface Builder 的缺点 IB 的执行效率没有纯代码高 使用 IB 开发的过程中容易出现一些小问题 有一定的学
iOSDevLog
2018/05/17
2.7K0
​使用Swift和Xcode开发iOS应用的详细教程
iOS应用开发是一项充满创意和挑战的工作,而Swift作为苹果公司推崇的编程语言,Xcode则是官方提供的集成开发环境。在本篇博客中,我们将一步步地介绍如何使用Swift和Xcode创建一个简单的iOS应用。我们将涵盖项目的创建、界面设计、Swift代码编写以及应用的运行。让我们开始这个令人兴奋的开发之旅!
Echo_Wish
2023/12/19
2.1K0
iOS 关于Interface Building 的一些小技巧
## 1. UIStackView StackView 是iOS9以后才有的,主要解决了组件排列布局复杂的问题,高效快速。
星宇大前端
2020/02/13
2K0
ios入门之界面基础
学习移动app开发,我们常常从讲解基本的控件开始,如UILabel、UISearchBar、UIButton、UITextField等等。在实现一个简单的ios 应用之前,我们首先来看ios开发中一些基本的概念。 视图控制器(View Controllers) 视图控制器是MVC(Modl-View-Controller)模式的逻辑部分。按照字面意思,这个控制器能够控制某个视图。 UIViewController 苹果极力推崇MVC这种开发模式,并且帮我们实现了一个叫做UIViewController的控制
xiangzhihong
2018/02/06
1.9K0
ios入门之界面基础
一步一步,开始上手Mac 开发(一)
通过本文,你可以创建你的第一个Mac Application,编译并指定版本号,而且经过练习,你应该掌握:
代码行者
2018/08/23
4.2K1
一步一步,开始上手Mac 开发(一)
重回iOS应用开发
虽然第一个项目还是2014年那会做的,但同事们都知道我有过iOS项目的经验,公司客户有了iOS版本的需求,自然会想到我来参与这个项目,但具体充当什么角色,我自然是拿不准的,期望来主导,但能力经验又有差距,很微妙的感觉;比方我现在是在架构师的位置上,但在iOS的技能上,却没有充当架构师的能力,如何平衡现实和期望,着实让人纠结的一种状态,重新捡起来,以稍微高一些的视角去定位,还是比之前有了更多的收获 ,尽管由于项目人力配备不齐,正式的iOS开发只有两个,最后可能还是会参与到开发工作中,那就两者都兼顾吧。
呱牛笔记
2023/05/02
4930
重回iOS应用开发
iOS14开发-入门知识
iOS 是由苹果公司开发的移动操作系统 。苹果公司最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统(最初叫 iPhone runs OS X)。该系统最初是设计给 iPhone 使用的(所以后来曾命名为 iPhone OS),之后陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上(所以在 WWDC 2010 上最终宣布更名为 iOS)。
YungFan
2021/01/18
3.3K0
【iOS 开发】基本 UI 控件详解 (UIButton | UITextField | UITextView | UISwitch)
博客地址 : http://blog.csdn.net/shulianghan/article/details/50051499 ;
韩曙亮
2023/03/27
7.4K0
【iOS 开发】基本 UI 控件详解 (UIButton | UITextField | UITextView | UISwitch)
【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )
项目创建流程 : ① 选择 Create a new Xcode project , ② 创建 Single View Application 项目 , ③ 设置项目信息 , ④ 设置代码路径并创建 ;
韩曙亮
2023/03/27
4.4K0
【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )
【 iOS 应用开发 】 UIKit 控件 ( UIView 属性 | storyboard 设置 | 模拟器 | 拖线关联 | tag | 软键盘操作 | 颜色值 | 代码生成控件 | 动画设置 )
LaunchScreen.storyboard 界面 : 该界面不是用于展示应用程序的界面 ;
韩曙亮
2023/03/27
5.3K0
【 iOS 应用开发 】 UIKit 控件 ( UIView 属性 | storyboard 设置 | 模拟器 | 拖线关联 | tag | 软键盘操作 | 颜色值 | 代码生成控件 | 动画设置 )
Xcode:处理故事板的更好方式 享受Interface Builder的提示和技巧
Apple在Xcode 8中对Interface Builder进行了很大的改进。使用大小类变得更加直观,缩放故事板的能力非常方便,Interface Builder中的完整预览功能非常棒。对于那些对使用Interface Builder犹豫不决的人来说,这可能会成为一个交易破坏者。
iOSDevLog
2018/12/28
1.7K0
【IOS开发基础系列】Navigation页面导航专题
        对于父级VC与子级VC分别有navigationController的情况,即不是使用push方式加载子VC,而是通过AddChildViewController的方式添加的场景,则父级导航条会覆盖在子级导航条上面,所以需要在载入时把父级导航条做隐藏处理:
江中散人_Jun
2023/10/16
7230
【IOS开发基础系列】Navigation页面导航专题
iOS各种调试技巧豪华套餐
前言 最近博主临近毕业季,为了完美的写一篇毕业论文,真是:“锄禾日当午,汗滴禾下土”<—— 这句诗跟毕业我写毕业论文没任何一毛钱关系,我就是突然想吟湿了。不过博主作为网络工程专业的好青年,曾经的愿望和理想就是在下水道干出一番轰轰烈烈的大事业,没错是就是下水道,我们的征途在下水道!!不过大家别误会,我不是忍者龟的脑残粉!听我继续说!我想的是等我在各大排水系统各大下水道功成名就的时候,我就可以指着一个井盖对我的孙子说:“诺 那个下面的通信光缆是爷爷我接的!!” 我满脸自豪地接受着这孙子的敬仰!但是啊,曾经的愿
王大锤
2018/05/17
2K0
OS X 上使用.NET开发应用程序
MonoMac是面向Mac OSX API的C#绑定,其API设计主要受到了MonoTouch的启发,后者可以基于Mono开发原生的iOS应用程序。MonoMac套件的目标之一,也是发布独立的 .app应用程序,让最终用户摆脱对Mono的依赖。MonoTouch的成功则是一个良好的基础,于是Mono开始将Cocoa API使用C#和.NET世界中的模式与惯例用法表现出来,并提供开发人员整套Cocoa应用程序的开发工具。 Mono之父Miguel de Icaza表示,.NET从一开始便设计成为一个易于互操作
张善友
2018/01/19
1.6K0
OS X 上使用.NET开发应用程序
【IOS开发基础系列】UISearch专题
        UISearchBar是由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField.
江中散人_Jun
2023/10/16
8700
【IOS开发基础系列】UISearch专题
推荐阅读
相关推荐
iOS开发系列——Storyboard
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档