2016-11-21 77 views
0

我是Elasticsearch的新成員,並且與彈性搜索服務器的連接有問題。與Elasticsearch 5.x的連接需要很長時間。 NEST 5.0 rc

我使用Elasticsearch 5.0.1,我在.NET 4.5.2下運行我的代碼。 我正在使用NEST 5.0 RC lib。

我還在我的電腦上安裝了Kibana和x-pack。

我的代碼連接到elasticsearch:

var nodes = new Uri[] { new Uri("http://localhost:9200") }; 
var pool = new StaticConnectionPool(nodes); 
var settings = new ConnectionSettings(pool).DefaultIndex("visitor_index");    
var client = ElasticClient(settings); 

我的搜索代碼:

var result = client.Search<VisitorTest>(s => s.Index("visitor_index") 
    .Query(q => q.Match(mq => mq.Field(f => f.Name).Query("Visitor 1")))); 

基本上,我遇到的問題是,每次我創建一個新的ElasticClient它40-之間取80毫秒建立連接。 我爲此創建了一個UT,在該UT中創建連接並運行搜索查詢兩次,然後在同一測試中創建第二個連接並再次運行搜索查詢兩次。 結果是,連接之後的第一個查詢需要40-80毫秒,第二個查詢具有相同的連接需要2毫秒,這是我所期望的。

我嘗試更改連接字符串以使用域(將域添加到本地主機文件中)。我也嘗試刪除xpack安全,所以我不需要進行身份驗證。

xpack.security.enabled: false 

但我總是得到相同的結果。

回答

0

的實地觀測

  1. ConnectionSettings單一實例應該被重複使用的應用程序的生命週期。 ConnectionSettings大量使用緩存,因此應重新使用。
  2. ElasticClient是線程安全的。一個實例可以安全地用於應用程序的生命週期
  3. 除非您有一個節點集合,否則我會推薦使用SingleNodeConnectionPool而不是StaticConnectionPool。後者具有在單個節點不需要的節點上循環的邏輯。
  4. 客戶端利用.NET框架內的連接池;你可以調整ConnectionSettingsEnableTcpKeepAlive()
  5. KeepAlive行爲如果您的機器上配置Web代理,你可以看看上ConnectionSettings禁用自動代理檢測與.DisableAutomaticProxyDetection()
+0

肯定的問題是 'ConnectionSettings'

通過調整兩件事固定。一旦我開始使用連接時間(對於新客戶端)的單個實例減少到5毫秒。謝謝! – Adriano

0

我會在這裏添加我的幾個硬幣。

與40毫秒請求具有完全相同的問題。但是,從Kibana開發工具,它需要1毫秒。

Ninject部分:

kernel.Bind<IEsClientProvider>().To<EsClientProvider>().InSingletonScope().WithConstructorArgument("indexName", "items"); 

而且在客戶提供:

public ElasticClient GetClient() 
    { 
     if (this.client == null) 
     { 
      settings = new ConnectionSettings(nodeUri).DefaultIndex(indexName); 
      this.client = new ElasticClient(settings); 
     } 

     return client; 
    }