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 в свой компьютер.

Мой код для подключения к 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 для этого, в котором я создаю соединение и запускаю поисковый запрос дважды, а затем создаю второе соединение в одном тесте и дважды запускаю запрос поиска. В результате первый запрос после соединения занимает 40-80 миллисекунд, а второй запрос с тем же соединением занимает 2 миллисекунды, что я и ожидаю.

Я попытался изменить строку подключения для использования домена (добавлен домен в файл локального хоста). Я также попытался удалить защиту xpack, поэтому мне не нужно аутентифицироваться.

xpack.security.enabled: false 

Но я всегда получаю тот же результат.

ответ

0

Несколько наблюдений

  1. Один экземпляр ConnectionSettings должны быть повторно использованы в течение всего срока применения. ConnectionSettings сильно использует кеширование, поэтому его следует использовать повторно.
  2. ElasticClient является потокобезопасным. Один экземпляр можно безопасно использовать для срока службы приложения.
  3. Если у вас нет набора узлов, я бы рекомендовал использовать SingleNodeConnectionPool вместо StaticConnectionPool. Последний имеет логику для округления по узлам, которые не нужны для одного узла.
  4. Клиент использует объединение пулов в рамках .NET; Вы можете настроить KeepAlive поведение на ConnectionSettings с EnableTcpKeepAlive()
  5. Если у вас есть веб-прокси, сконфигурированный на вашем компьютере, вы можете посмотреть на отключение автоматического обнаружения прокси-сервера с .DisableAutomaticProxyDetection() на ConnectionSettings.
+0

Определенно проблема была "ConnectionSettings. Как только я начал использовать один экземпляр, время соединения (для новых клиентов) сократилось до 5 миллисекунд. Благодаря! – Adriano

0

Я добавлю здесь несколько монет.

Имеет точно такую ​​же проблему с запросами в 40 мс. Однако из инструментов Kibana dev он принимал 1 мс.

Fixed щипая две вещи:

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; 
    } 
Смежные вопросы