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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM