原文:https://www.cnblogs.com/enenen/p/10138511.html

推荐阅读:https://juejin.im/post/5d996285f265da5bad40523c

  这个文章从源码上分析了原因,并给出了解决方案。

  文章解决方案一:在broker.config中将transientStorePoolEnable=true。

  文章解决方案二:扩容broker服务器。

  具体解决方案说明,可自行阅读文章。

------------------------以下为原内容--------------------------------------

  之前写的解决方案,都是基于测试环境测试的.到生产环境之后,正常使用没有问题,生产环境压测时,又出现了system busy异常(简直崩溃).最后在rocketmq群里大佬指导下,终于解决(希望是彻底解决).

下面直接给出结果:

目前通过生产环境各种参数修改测试得出:

broker busy异常: 可通过增大 waitTimeMillsInSendQueue 解决

system busy异常:可通过增大 osPageCacheBusyTimeOutMills 解决

#发送队列等待时间
waitTimeMillsInSendQueue=3000
#系统页面缓存繁忙超时时间(翻译),默认值 1000
osPageCacheBusyTimeOutMills=5000

  个人猜测,出现异常的原因是因为我们同一台服务器部署的多个应用造成的.我们一台服务器上部署了 三个ES、八个redis、一个rocketmq ,压力测试时这些都在使用,虽然cpu、内存都还有很大剩余,但是磁盘io和内存频率毕竟只有那么多可能已经占满,或者还有其他都会有影响。

  之前测试环境测试其他东西时,发现mq和redis同时大量使用时,redis速度会降低三到四倍,由此可见应用分服务器部署的重要性。以前知道会有影响,没想到影响这么大。

  最终结解决方案:应该给rocketmq单独部署性能较高的服务器.

下面给下我们完整的配置:

  

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 上面是最新更新 2019-06-13 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

记一次 rocketmq 使用时的异常。

  这里就不说什么rocketmq 源码啥的了,因为没看过。网上一搜这两个异常 大部分都是什么源码解读,也没说出现后的解决办法(蓝瘦香菇)。

大量测试发现:

1、system busy , start flow control for a while

  该异常会造成 消息丢失。

2、broker busy , start flow control for a while

  该异常不会造成消息丢失。(这是最坑的,都异常了消息竟然是正常发送了的。)

解决过程:

1、最开始时候 ,测试发现在性能好的服务器上 只会出现system busy,也就是说出现异常就会消息丢失。

  所以:业务代码进行处理,出现异常就会重发到当前topic的 bak队列,当时想的是既然这个topic busy了,就换到另外的topic去发,总不能都 busy吧。

也算是临时解决了。

2、运行一年后,可能是服务器上运行的东西多了,或者其他原因。发现有消息重复的现象。不用想肯定是报broker busy异常,重发到topic的 bak队列了。又因为broker busy可能不会造成消息丢失,所以消息重复就出现了。

3、无奈,找新的解决方法。本来想的是判断异常,如果是broker busy就不重发了。

报着试一试的态度,又去百度了一下,还是搜出来一堆源码解读。搭上梯子,google一下,还真找到了。

https://stackoverflow.com/questions/47749906/rocketmq-throw-exception-timeout-clean-queuebroker-busy-start-flow-control-f

https://www.cnblogs.com/cs99lzzs/p/9181555.html

想到不知道在哪看的的一句话,在stackoverflow上能找到和你一样的问题,那问题已经解决了百分之90了。这他喵的真实至理名言啊。

==============吐槽完=================

又经过大量测试验证:

解决方案:

修改rocketmq配置文件:

方案一:sendMessageThreadPoolNums 改成 1 ,没有的话新增一行。

  sendMessageThreadPoolNums=1

方案二(推荐):useReentrantLockWhenPutMessage改成true,没有的话新增一行。

  sendMessageThreadPoolNums=32

  useReentrantLockWhenPutMessage=true

说明:

  sendMessageThreadPoolNums这个属性是发送线程池大小, rocketmq4.1版本之后默认为 1,之前版本默认什么不知道但是肯定大于1。这个属性改成1的话,就不用管useReentrantLockWhenPutMessage这个属性了;

  如果改成大于1,就需要将useReentrantLockWhenPutMessage这个属性设置为 true;

  目前测试 未发现这两个方案有什么区别,sendMessageThreadPoolNums=1 时也支持多线程发送,发送速度感觉和 sendMessageThreadPoolNums大于1没有区别,都能跑满100M的网卡。

  感觉如果useReentrantLockWhenPutMessage=true的时候,就是打开锁(属性名翻译一下也大概是这个意思),然后关键代码其实还是单线程处理;

  有闲功夫的话去翻翻源码看看去。

  最后 我是选择的方案二,毕竟看着好看点。

最新文章

  1. MarkdownPad 2 在win10下出错:HTML 渲染错误(This view has crashed) 的解决办法 + MarkdownPad2.5 注册码
  2. Javascript 面向对象编程(一):封装
  3. accp7.0优化MySchool数据库设计内测笔试题总结
  4. 【leetcode】Remove Duplicates from Sorted List II (middle)
  5. 资料下载:敏捷个人的成长思考.pptx(第1次线下活动2011.04)
  6. MVC1
  7. HTML::Entities 编码或解码 HTML 实体的字符串
  8. CodeForces 605B Lazy Student
  9. 深入理解HTTP协议(转)
  10. mysql主键约束和唯一性约束
  11. Nmap简单扫描
  12. curl请求
  13. Angular刷新浏览器 404 问题
  14. Spark思维导图之资源调度
  15. caffe报错:cudnn.hpp:86] Check failed: status == CUDNN_STATUS_SUCCESS (3 vs. 0) CUDNN_STATUS_BAD_PARAM 原因
  16. sqlplus 执行 sql 文件
  17. JavaScript中如何对一个对象进行深度clone
  18. 简单谈谈JS数组中的indexOf方法
  19. Linux内核第一节
  20. mac 打开整个系统的隐藏文件

热门文章

  1. 9. [mmc subsystem] host(第三章)——sdhci-pltfm说明
  2. LSB MSB
  3. 004-OpenStack-计算服务
  4. echarts-带面积的折线图
  5. 很不错的python 机器学习资源
  6. 13 opencv训练器
  7. A1037 Magic Coupon (25 分)
  8. CSS换行知识
  9. [LeetCode] 63. Unique Paths II 不同的路径之二
  10. thinkphp5.0 - 安装