ElasticsearchTemplate升级到ElasticsearchRestTemplate遇到的负载问题

因为框架版本做了升级,ElasticsearchTemplate已经不能使用,将项目里对应的ElasticsearchTemplate更换为ElasticsearchRestTemplate,修改了对应的查询方法。

测试上只对返回的结果做了对比,做了一下业务测试,然后上线之后几分钟es集群的负载打满,大量连接超时,查询相关接口特别慢。立马回滚,回滚累积的查询释放之后,负载又降了下去,一切正常。

对比了下代码,查询语句没有修改,单独升级一台,几分钟负载又满,日志里看到到es的请求,有:curl -XGET 'localhost:9200/im_xxx_index/_search'  -H 'Content-Type: application/json' -d '{"from":0,"size":10000,"query":{................ 

察觉这个size:10000可能有问题,我没有传过这种参数。优先排查调用量最大的两个接口使用的query和queryForList这种不带分页的查询,查看ElasticsearchTemplate和ElasticsearchRestTemplate的源码,定位到prepareSearch方法,发现对于不分页的查询,处理有差异,贴出:

ElasticsearchTemplate:

 

 

 ElasticsearchRestTemplate:

 

 

猜测在无分页的query和queryList方法,这个10000的默认分页大小有问题,虽然大部分时候查询出来的结果就几条。

因为我的对应查询都是归组或者自由条件查询,原来的查询是没有放分页参数的,于是在对应的查询上加了分页参数,避免默认10000的情况,问题解决。

如:

SearchQuery searchQuery = new  NativeSearchQueryBuilder()
                .withQuery(queryBuilder)
                .withSearchType(SearchType.DEFAULT)
                .withIndices("xxx_index").withTypes("xxx_type")
                .withCollapseField("sessionId").withPageable(PageRequest.of(0,1))//加折叠和分页
                .addAggregation(cardinality("sessionId").field("sessionId"))
                .build();

posted @ 2020-09-11 16:29  柳随风丶丶  阅读(12181)  评论(0编辑  收藏  举报