org.elasticsearch.common.util.concurrent.EsRejectedExecutionException 查询超时异常处理记录---一定要用单例模式

鄙人的新书《Elasticsearch权威指南》正式出版发行,欢迎购买!本书由华为、中兴高级技术专家全面审读并撰序,助您挑战百万年薪 购书链接: 在这里插入图片描述

《Elasticsearch权威指南》
欢迎关注鄙人公众号,技术干货随时看!
在这里插入图片描述

鄙人的新书《elasticsearch7完全开发指南》,欢迎订阅!

https://wenku.baidu.com/view/8ff2ce94591b6bd97f192279168884868762b8e7

《kibana权威指南》

https://wenku.baidu.com/view/24cfee1ce43a580216fc700abb68a98270feac21

elasticsearch client 即TransportClient(最常用的一个实现),一定要使用单例模式,不懂单例模式的自己去学!不用单例模式的代价是残酷的,鄙人作为开发经理,曾被一个二笔开发坑得一塌糊涂,原因就是这个二笔把client封装成了线程池(越是二笔往往 越以为自己是大神,鄙人还没见过几个能自己写线程池的大神)!鄙人下面讲述下事故的过程。鄙认作为工学硕士,自知不才,但鄙人通读lucene、solr、elasticsearch源码,有自信elasticsearch稳定性极高,一般的并发量绝不会挂机,事实证明也从来没挂过机!但是,鄙认就遇到了并发一秒并发20的请况下,客户那边反馈查询全部超时, elasticsearch集群报出了如下错误:
在这里插入图片描述
有经验的人不难看出,是连接数超出了elasticsearch等待队列的长度1000(默认设置,官方强烈建议不要修改),打开header集群依然是绿色,但已经不再接受客户端请求(http服务类的程序一般会有三个线程池,等待、监听和处理线程池,无论是tomcat、jetty,当然elasticsearch也不例外,当等待请求超过等待队列的线程上限时,就直接返回超时)。鄙人当时查看了并发量,一秒不到20,根据经验绝对不是并发过高问题。因为是线上问题,快速回复服务是第一位的,重启所有机器无效,然后把服务从f5下线,重启集群,f5拉上线后,依然是大面积超时!迫于无奈,当时用物理机临时扩容硬抗。接下来,鄙人为了查明原因,从头到尾把二笔的es接口代码和client源码读了一遍,最终怀疑是client创建过多造成了,这位二笔开发自己把client写成了线程池,频繁的创建释放client。下面看下client的源码:
在这里插入图片描述
我们可以看到,client本身就是线程池,一个cient会占用大量的线程。elasticsearch集群报错的就是标红的那一行代码,
等待请求超过了1000。鄙人把elasticsearch接口代码client改成了单例模式,然后进行对比压测,出现大量超市时,并发量相差100倍。 client一定要用单例模式,或者更好的方式是使用restful接口,因为官方已经声明elasticsearch后续会deprecated client。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿童木-atom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值