c# - NEST ElasticSearch 库的连接池

标签 c# connection-pooling elasticsearch nest

我目前正在使用 NEST ElasticSearch C# 库与 ElasticSearch 进行交互。我的项目是一个 MVC 4 WebAPI 项目,它基本上构建了一个 RESTful web 服务来访问目录辅助信息。

我们才刚刚开始使用 NEST,并且一直因缺乏文档而跌跌撞撞。那里的东西很有用,但它有一些非常大的洞。目前,我们需要的一切都可以正常工作,但是,我们遇到了一个问题,连接有时会占用整整一秒。我们想要做的是使用某种连接池,类似于您与 SQL Server 交互的方式。

这里是关于如何使用 nest 连接的文档:http://mpdreamz.github.com/NEST/concepts/connecting.html

这是我们项目中的相关代码片段:

public class EOCategoryProvider : IProvider
{
    public DNList ExecuteQuery(Query query)
    {
        //Configure the elastic client and it's settings
        ConnectionSettings elasticSettings = new ConnectionSettings(Config.server, Config.port).SetDefaultIndex(Config.index);
        ElasticClient client = new ElasticClient(elasticSettings);

        //Connect to Elastic
        ConnectionStatus connectionStatus;
        if (client.TryConnect(out connectionStatus))
        {
            // Elastic Search Code here ...
        } // end if
    } // end ExecuteQuery
} // end EOCategoryProvider

通过查看文档,我看不到连接池的任何规定。我一直在考虑实现我自己的(比如存储 3 或 4 个 ElasticClient 对象,并选择它们的循环方式),但我想知道是否有人有更好的解决方案。如果没有,有人对手动实现连接池的最佳方法有建议吗?有什么文章可以引用吗?

感谢你们提出的任何建议。

更新:这似乎与针对每个请求调用 TryConnect 以及特定的网络设置有关。使用与 Elastic box 处于同一网络的机器时,问题完全消失;我的开发机器(到 Elastic box 的平均 350ms)似乎有时无法建立 http 连接,这导致 TryConnect 的时间很长。

最佳答案

您不必每次调用 Elasticsearch 时都调用 TryConnect()。它基本上是应用程序启动时的健全性检查调用。

NEST 是 Elasticsearch 的 C# REST 客户端,默认的 IConnection 使用 WebRequest.Create,它已经汇集了 TCP 连接。

查看实际执行情况:https://github.com/elastic/elasticsearch-net/blob/master/src/Elasticsearch.Net/Connection/HttpConnection.cs

重用 ElasticClient 不会带来任何性能提升,因为每个调用都已经获得了自己的 HttpWebRequest。整个客户端是有意构建的无状态的。

不过,我很想知道为什么通话对您来说需要 1 秒。您能否发布实际的 NEST 代码、您如何测量调用并描述您的数据。

免责声明:我是 NEST 的作者。

关于c# - NEST ElasticSearch 库的连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11334717/

相关文章:

c# - 通过 javascript PageMethods 调用 WebMethod 时触发 Page_Load

c# - 如何使用 Youtube api 查找直播视频列表?

java - 数据库连接匮乏

elasticsearch - 如何在 Python 中对 Elasticsearch DSL 的结果进行分页

elasticsearch - 如何通过 Elasticsearch 返回匹配的嵌套对象

c# - 这是为我的屏幕抓取器缓存页面的糟糕方法吗?

javascript - 在 Windows 10 通用应用程序中从 JavaScript 调用 C# 组件

java - 在设定的超时时间后关闭 JDBC 连接?

jdbc - 连接中断后如何自动重新连接Oracle连接池?

elasticsearch - elasticsearch无痛阵列第一要素