因為框架版本做了升級,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();
