再谈 RocketMQ broker busy(实战篇)
本文将在 RocketMQ 消息发送system busy、broker busy原因分析与解决方案 的基础上,结合生产上的日志尝试再次理解 broker busy 以及探讨解决方案。
首先,broker busy 相关的日志关键字如下:
- [REJECTREQUEST]system busy
- too many requests and system thread pool busy
- [PC_SYNCHRONIZED]broker busy
- [PCBUSY_CLEAN_QUEUE]broker busy
- [TIMEOUT_CLEAN_QUEUE]broker busy
上述前面4个关键字在上篇文章中已详细介绍,本文先对出现上述错误进行一个总结,具体的分析过程请查阅上篇文章。
本文先给出一张流程图,展示上述5种 broker busy 分别会在消息发送的哪个阶段抛出,以便大家能够清晰的了解其发生的原因。
针对前4种 broker busy 出现的问题已经在上篇文章中详细介绍,主要是由于 Broker 在追加消息时持有的锁时间超过了设置的1s,Broker 为了自我保护,会抛出错误,客户端会选择其他 broker 服务器进行重试。如果对不是金融级服务,建议将 transientStorePoolEnable = true,可以有效避免前面 4 种 broker ,因为开启这个参数,消息首先会存储在堆外内存中,并且 RocketMQ 提供了内存锁定的功能,其追加性能能得到一定的保障,这样可以做到在内存使用层面的读写分离,即写消息是直接写入堆外内存,消费消息直接从 pagecache中读,然后定时将堆外内存的消息写入 pagecache。但这种方案随之带来的就是可能存在消息丢失,如果对消息非常严谨的话,建议扩容集群,或迁移topic到新的集群。
同时在做 Broker 服务器巡检的时候,可以通过去通过如下命令去查看 broker 一次消息追加是否会超过 500 ms。
在这个图中我们看到在设置了 transientStorePoolEnable 为 true 的情况下,虽然一天只有一条超过500ms的消息,但也值得警惕了,由于对系统内核参数掌握程度不够,这种情况,估计只能走集群扩容的路子了。但如果一天消息量巨大而且出现频率不高的情况,由于有重试机制,倒不会带来太大的问题。如果出现太多的错误,建议集群扩容。
本文接下来想重点探讨一下 [TIMEOUT_CLEAN_QUEUE]broker busy 这种情况。
BrokerFastFailure#cleanExpiredRequest
while (true) {try {if (!this.brokerController.getSendThreadPoolQueue().isEmpty()) {final Runnable runnable = this.brokerController.getSendThreadPoolQueue().peek();if (null == runnable) {break;}final RequestTask rt = castRunnable(runnable);if (rt == null || rt.isStopRun()) {break;}final long behind = System.currentTimeMillis() - rt.getCreateTimestamp();if (behind >= this.brokerController.getBrokerConfig().getWaitTimeMillsInSendQueue()) {if (this.brokerController.getSendThreadPoolQueue().remove(runnable)) {rt.setStopRun(true);rt.returnResponse(RemotingSysResponseCode.SYSTEM_BUSY, String.format("[TIMEOUT_CLEAN_QUEUE]broker busy, start flow control for a while, period in queue: %sms, size of queue: %d", behind, this.brokerController.getSendThreadPoolQueue().size()));}} else {break;}} else {break;}} catch (Throwable ignored) {}
}
可以看出来,抛出这种错误,在 broker 还没有发送“严重”的 pagecache 繁忙,即消息追加到内存中的最大时延没有超过 1s,通常追加是很快的,绝大部分都会低于1ms,但可能会由于出现一个超过200ms的追加时间,导致排队中的任务等待时间超过了200ms,则此时会触发broker 端的快速失败,让请求快速失败,便于客户端快速重试。但是这种请求并不是实时的,而是每隔10s 检查一遍。
值得注意的是,一旦出现 TIMEOUT_CLEAN_QUEUE,可能在一个点会有多个这样的错误信息,具体多少与当前积压在待发送队列中的个数有关。
关于 [TIMEOUT_CLEAN_QUEUE]broker busy 我们也可以适当调整 waitTimeMillsInSendQueue,默认值为200ms,可以适当调整到400ms。
如果大家觉得文章对您有帮助的话,麻烦帮忙点个赞,谢谢。
见文如面,我是威哥,热衷于成体系剖析JAVA主流中间件,关注公众号『中间件兴趣圈』,回复专栏可获取成体系专栏导航,回复资料可以获取笔者的学习思维导图。
再谈 RocketMQ broker busy(实战篇)相关推荐
- cpu要和gpu搭配吗_再谈CPU/GPU搭配 实战老配置显卡升级
对于经常玩游戏的人来说,显卡性能的高低直接影响着游戏中能否开启更多特效;最近几年处理器性能飞涨,使得大多数人的处理器性能都处于过剩状态.加上内存价格持续走低,大容量内存已经成为众多人的标配.因此用户在 ...
- 网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解
目录 前文链接(系列助学, 也为后文学习做铺垫, 可按需读取) 一. 再谈HTTP再理解 二. HTTP对比学习HTTPS HTTP和HTTPS的区别如下: 三.TCP协议 (三次握手四次挥手细节过 ...
- 【网络篇】第十六篇——再谈端口号
再谈端口号 端口号范围划分 认识知名端口号 两个问题 netstat pidof 再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序: 从网络中获取的数据在进行向上交付时,在传输层 ...
- 从零开始学架构5 - 实战篇
从零开始学架构5 - 实战篇 38 | 架构师应该如何判断技术演进的方向? 潮流派? 保守派? 跟风派? 技术演进的动力 1)对于产品类业务,答案看起来很明显:技术创新推动业务发展! 苹果开发智能手机 ...
- 系统重构数据同步利器之Canal实战篇
一.背景 二话不说,先上图 上图来自于官网(https://github.com/alibaba/canal),基本上涵盖了目前生产环境使用场景了,众所周知,Canal做数据同步已经是行业内标杆了.我 ...
- 进阶必看的 RocketMQ ,就这篇了
RocketMQ 整体架构设计 整体的架构设计主要分为四大部分,分别是:Producer.Consumer.Broker.NameServer. 为了更贴合实际,我画的都是集群部署,像 Broker ...
- 进阶必看的 RocketMQ ,就这篇了!
作者 | 是Yes呀 来源 | yes的练级攻略(ID:yes_java) 头图 | CSDN 下载自东方IC 每个时代,都不会亏待会学习的人. 今天和大家一起深入生产级别消息中间件 - Rocke ...
- rocketmq 几种队列_进阶必看的 RocketMQ ,就这篇了
RocketMQ 整体架构设计 整体的架构设计主要分为四大部分,分别是:Producer.Consumer.Broker.NameServer. 为了更贴合实际,我画的都是集群部署,像 Broker ...
- sap 标准委外和工序委外_SAP那些事-实战篇-74-公司间委外的几种方式探讨
我们在<SAP那些事-实战篇-22-关于公司间业务的总结>这一篇中对公司间的转包业务曾经进行过描述,不过这一篇中主要谈到的是SAP中标准的方案,而且是从一方(委托方)的角度来谈,这一篇中我 ...
最新文章
- CUDA Samples: Dot Product
- 关于Ubuntu18版本下新安装Qtcreator编译报错:cannot run compiler clang++ output的解决办法
- Linux / offsetof 和 container_of
- 今晚直播 | 清华大学​高天宇:对比学习及其在NLP中的应用
- python3 -c 和 python3 -m
- [剑指offer]面试题15:链表中倒数第k个结点
- netbeans 添加gif图片_告别PC 用手机完成各种GIF动画编辑
- 17th, Jan 2012 今天的时间表
- validate中remote的用法
- .Net获取URL中文参数值乱码问题
- dell服务器进系统失败,如何解决Dell服务器系统开机提示错误
- 微星显卡拷机测试软件,显卡稳定性测试必备 微星Kombustor工具
- 贫困的苏州(转自新浪)
- 一周热图|杨紫韩国艺匠婚纱大片出炉;易烊千玺代言麦当劳;洛天依音乐综艺节目首秀...
- Hive中的常用函数
- Python3.6中对爬取网页中的/XBB的处理
- zen-cart 开源网店系统
- 物联网三年增长3000000000台的机会,你会错过赚钱的机会吗?
- 每日科创板之729:首批25股全线上涨 晶晨股份柏楚电子申购
- vscode使用合集——python
热门文章
- dcdc降压电路基本原理及设计实例
- shopxo 文件读取(CNVD-2021-15822)
- 计算机键盘可以分为哪几个区,键盘分为哪几个区?分别是什么?
- Go语言下载安装教程|Goland配置教程|2021|Windows
- 算法题_遍历三角矩阵
- python列表写入txt文件中文乱码,python 字典格式的文本写入文件,中文乱码(Unicode)的问题...
- 数据探索与数据预处理的实验报告
- 【笔试】羽毛球场地预定问题
- 关于、、的含义及区别
- 新一轮芯片战的序幕?台积电狂砸两千亿突破2nm