dubbo项目报错解决:com.alibaba.dubbo.remoting.ExecutionException 线程池爆满错误

背景:公司商城项目上线双十一活动期间,运营第二天后台服务突然崩溃,然后故事开始。。。

一、追踪问题

1)首先查看日志,抓取到以下这下这些错误信息

com.alibaba.dubbo.remoting.ExecutionException: class com.alibaba.dubbo.remoting.transport.dispatcher.message.MessageOnlyChannelHandler error when process received event .
  at com.alibaba.dubbo.remoting.transport.dispatcher.message.MessageOnlyChannelHandler.received(MessageOnlyChannelHandler.java:43)
  at com.alibaba.dubbo.remoting.exchange.support.header.HeartbeatHandler.received(HeartbeatHandler.java:90)
  at com.alibaba.dubbo.remoting.transport.MultiMessageHandler.received(MultiMessageHandler.java:25)
  at com.alibaba.dubbo.remoting.transport.AbstractPeer.received(AbstractPeer.java:123)
  at com.alibaba.dubbo.remoting.transport.netty.NettyHandler.messageReceived(NettyHandler.java:91)
  at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:302)
  at com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter$InternalDecoder.messageReceived(NettyCodecAdapter.java:148)
  at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
  at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)
  at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:349)
  at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:280)
  at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:200)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.concurrent.RejectedExecutionException: Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-192.168.101.79:20887, Pool Size: 500 (active: 500, core: 500, max: 500, largest: 500), Task: 5564 (completed: 5064), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://192.168.101.79:20887!
  at com.alibaba.dubbo.common.threadpool.support.AbortPolicyWithReport.rejectedExecution(AbortPolicyWithReport.java:53)
  at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
  at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
  at com.alibaba.dubbo.remoting.transport.dispatcher.message.MessageOnlyChannelHandler.received(MessageOnlyChannelHandler.java:41)
  ... 14 more

二、真相迷踪

1)一眼看到这个错误:‘Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-192.168.101.79:20887, Pool Size: 500 (active: 500, core: 500, max: 500, largest: 500)’;顿时自己以为找到了问题本质,于是采取下一步解决方案。。。

2)找到dubbo配置文件,发现threads(线城池连接数)这个属性值配了500,于是当下决定把它改成1000,发版。

3)发版后,项目可以正常访问了,但是因为一般配置到500是可以支撑百万以上的并发的,而我们并发绝对没有这么高,所以进一步排查问题,怀疑是被恶意攻击。因为不确定连接数是否还会被占满,果不其然。。。

4)在项目运行了四个小时左右后,项目再次崩溃,这次没有再随意更改线程池连接数大小,找运维同学一起协助排查问题,最后定位到线城池连接数配置上。

三、解决问题

1)去dubbo官网详细了解,再吸取下网上一些道友的分享,发现dubbo连接数的真实用法,一般1个连接数是可以支持10-100个请求的,而且dubbo是使用的长连接,每次请求执行后都没有释放,而且每次消费者增加,他都会成倍增加,都不建议把dubbo连接数设置太大,所以怀疑可能是线城池连接数配置的太大,导致dubbo提供者的崩溃。

2)然后我们经过计算觉得如果把dubbo连接数调到50,三台服务器可以支持1万左右的并发应该是没问题的,也极大降低dubbo提供者的压力,所以修改之后发版。

3)问题解决,请求最大连接数也降为正常状态

原来线程池数量为500
解决方案:把线程池数量调为50




*觉得有用可以关注博主哦,如果再不能相遇,祝你早午晚都安。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值