xuxueli / xxl-rpc

A high performance, distributed RPC framework.(分布式服务框架XXL-RPC)
http://www.xuxueli.com/xxl-rpc/
Apache License 2.0
620 stars 404 forks source link

创建链接超时,导致线程池堆积任务 #42

Open shellingford37 opened 4 years ago

shellingford37 commented 4 years ago

项目中使用了xxljob,xxljob依赖了xxlrpc(1.4.1版本),发现在特定情况下调度线程池堆积任务,最终拒绝新的调度任务。 查询来原因有2个,第一NettyHttpConnectClient没有链接超时时间(这个问题我查看1.6版本已经加上了,默认写死10秒)。 第二个问题是在com.xxl.rpc.core.remoting.net.common.ConnectClient#getPool这个方法中,使用了synchronized加锁。假设xxljob每秒触发一次同一个任务,调用getPool方法频率为每秒1次,而获取client超时10秒才释放,如此每秒会阻塞9个线程,最终导致线程池任务堆积满。 Snipaste_2020-09-02_10-34-26

07DB81B3-53FC-4428-A897-4877DF973CEB

复现方法: 在xxljob上设置手动执行器指定ip,设置任务每秒触发一次(理论上频率低于10秒一次就会出现来不及释放的情况)。当这个执行器的机器直接从局域网中移除(拔网线),就会出现任务堆积,线程被锁在getPool 94行。

建议优化这块加锁逻辑,可以采用trylock+超时时间来防止线程阻塞在这里。

ismaike commented 3 years ago

👍

MagicalFool commented 3 years ago

请问有解决方案吗?