2016-11-21 2 views
0

私はElasticsearchで新しく、elasticsearchサーバーへの接続に問題があります。Elasticsearch 5.xへの接続には時間がかかります。 NEST 5.0 rc

私はElasticsearch 5.0.1を使用していますが、.NET 4.5.2でコードを実行しています。 NEST 5.0 rc libを使用しています。

私もKibanaとx-packを自分のPCにインストールしました。

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ミリ秒で接続を確立します。 接続を作成して検索クエリを2回実行しているUTを作成した後、同じテストで2番目の接続を作成して、再度2回検索クエリを実行します。 その結果、接続後の最初のクエリは40〜80ミリ秒の間になり、同じ接続の2番目のクエリは2ミリ秒かかることが予想されます。

ドメインを使用するように接続文字列を変更しようとしました(ローカルホストファイルにドメインを追加しました)。私はxpackセキュリティを削除しようとしましたので、認証する必要はありません。

xpack.security.enabled: false 

しかし、私はいつも同じ結果を得ています。

答えて

0

少数観察

  1. ConnectionSettingsの単一のインスタンスは、アプリケーションの寿命のために再使用されるべきです。 ConnectionSettingsはキャッシュを大量に使用するため、再利用する必要があります。
  2. ElasticClientはスレッドセーフです。アプリケーションの存続期間中に単一のインスタンスを安全に使用することができます
  3. ノードのコレクションがない場合は、StaticConnectionPoolの代わりにSingleNodeConnectionPoolを使用することをお勧めします。後者は、単一のノードに不要なノードをラウンドロビンするロジックを持っています。
  4. クライアントは.NETフレームワーク内で接続プーリングを利用します。あなたはあなたのマシンで構成されたWebプロキシを使用している場合、あなたはConnectionSettings.DisableAutomaticProxyDetection()で自動プロキシ検出を無効に顔をしている可能性がEnableTcpKeepAlive()
  5. ConnectionSettingsKeepAlive動作を調整することができます。
+0

確かに問題は 'ConnectionSettings' だった二つのことを微調整することにより、固定

。一度そのインスタンスを使用すると、(新しいクライアントの場合)接続時間が5ミリ秒に短縮されました。ありがとう! – Adriano

0

ここに少数のコインを追加します。

40 ms要求で全く同じ問題がありました。しかし、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; 
    } 
関連する問題