亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Elasticsearch Java High-Level REST Client 建立一堆 TCP

Elasticsearch Java High-Level REST Client 建立一堆 TCP

RISEBY 2022-06-23 17:24:15
我有一個每秒運行一次的定期作業(這是可配置的)。在這項工作中,我首先創建一個到 Elasticsearch 服務器的連接:RestHighLevelClient client = new RestHighLevelClient(                    RestClient.builder(new HttpHost(address, port, "http")));然后我檢查是否存在一個名為test. 如果它不存在,我先創建它。GetIndexRequest indexRequest = new GetIndexRequest();indexRequest.indices("test");boolean testIndexIsExists = false;try {                testIndexIsExists = client.indices().exists(indexRequest, RequestOptions.DEFAULT);     } catch (IOException ioe) {    logger.error("Can't check the existence of test index in Elasticsearch!");  }if(testIndexIsExists) {     // bulk request...} else {    CreateIndexRequest testIndex = new CreateIndexRequest("test");    try {           testIndex.mapping("doc", mappingConfiguration);        client.indices().create(testIndex, RequestOptions.DEFAULT);        // bulk request...      } catch (IOException ioe) {         logger.error("Can't create test index in Elasticsearch");    }   }在執行了一個包含近 2000 個文檔的批量請求后,我關閉了 Elasticsearch 客戶端連接:client.close();Java 高級 REST 客戶端版本:<dependency>    <groupId>org.elasticsearch.client</groupId>    <artifactId>elasticsearch-rest-high-level-client</artifactId>    <version>6.4.0</version></dependency>我的問題是一堆 TCP 連接已經建立并且沒有關閉。這些 TCP 連接隨著時間的推移占用所有操作系統 TCP 連接。另一方面,我有點困惑。實例應該RestHighLevelClient是整個應用程序的單例對象,還是我必須在每個作業運行周期中創建一個新實例并在完成該作業后關閉該實例?
查看完整描述

2 回答

?
達令說

TA貢獻1821條經驗 獲得超6個贊

高級客戶端已經為您維護了一個連接池,所以我會將它用作單例。不斷創建和關閉連接池的成本很高,而且客戶端和底層 HTTP 連接池都是線程安全的。此外,對客戶端的調用close()只是委托給 Apache HTTP 客戶端shutdown()方法,因此您將受制于它們如何處理清理和釋放資源。


如果您使用 Spring 或其他一些 DI 框架,則可以輕松創建可以根據需要注入的客戶端單例實例。您可以將調用添加client.close()為 bean 關閉/銷毀生命周期階段的一部分。


使用 Spring Boot 的快速示例:


@Configuration

@ConditionalOnClass(RestHighLevelClient.class)

public class ElasticSearchConfiguration {


    @Value("${elasticsearch.address}")

    String address;


    @Value("${elasticsearch.port}")

    int port;


    @Bean(destroyMethod = "close")

    public RestHighLevelClient restHighLevelClient() {

        return new RestHighLevelClient(

                RestClient.builder(new HttpHost(address, port, "http")));

    }

}

注意:在這種情況下,Spring 會自動檢測 bean 有一個close方法,并在 bean 被銷毀時為您調用它。其他框架可能要求您指定應如何處理關閉。


查看完整回答
反對 回復 2022-06-23
?
回首憶惘然

TA貢獻1847條經驗 獲得超11個贊

RestHighLevelClient通常應該是單例的,除非你有充分的理由。例如,如果您的作業每小時而不是一分鐘運行,那么創建新實例并在作業后關閉它可能是有意義的。

如果您確定close()在所有情況下都在調用(例如,您沒有錯過任何異常),那么我的下一個猜測是彈性客戶端中的錯誤。

看起來他們忘記在 exists 調用中使用響應: https ://github.com/elastic/elasticsearch/blob/v6.4.0/client/rest-high-level/src/main/java/org/elasticsearch /client/RestHighLevelClient.java#L1419

你能在沒有exists電話的情況下進行測試嗎?


查看完整回答
反對 回復 2022-06-23
  • 2 回答
  • 0 關注
  • 256 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號