与 Elasticsearch 5.x 的连接时间过长。 NEST 5.0 遥控

Connection to Elasticsearch 5.x is taking to long. NEST 5.0 rc

我是 Elasticsearch 的新手,我在连接到 elasticsearch 服务器时遇到问题。

我正在使用 Elasticsearch 5.0.1,并且 运行我的代码是在 .NET 4.5.2 下运行的。 我正在使用 NEST 5.0 rc 库。

我还在我的电脑上安装了 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

但我总是得到相同的结果。

几点观察

  1. ConnectionSettings 的单个实例应该在应用程序的生命周期内重复使用。 ConnectionSettings 大量使用缓存,因此应该重复使用。
  2. ElasticClient 是线程安全的。单个实例可以在应用程序的生命周期内安全使用
  3. 除非你有一个节点集合,否则我建议使用 SingleNodeConnectionPool 而不是 StaticConnectionPool。后者具有在单个节点不需要的节点上循环的逻辑。
  4. 客户端利用 .NET 框架内的连接池;您可以使用 EnableTcpKeepAlive()
  5. 调整 ConnectionSettings 上的 KeepAlive 行为
  6. 如果您的计算机上配置了 Web 代理,您可以查看 ConnectionSettings 上的 .DisableAutomaticProxyDetection() 禁用自动代理检测。

我会在这里添加我的几个硬币。

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;
    }