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();