使用 NEST ElasticSearch 库进行连接池

Posted

技术标签:

【中文标题】使用 NEST ElasticSearch 库进行连接池【英文标题】:Connection Pooling with NEST ElasticSearch Library 【发布时间】:2012-07-04 19:47:15 【问题描述】:

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

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

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

这是我们项目中的相关代码sn-p:

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 平均需要 350 毫秒)有时似乎无法建立 http 连接,这导致 TryConnect 时间过长。

【问题讨论】:

【参考方案1】:

您不必每次调用 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 的作者。

【讨论】:

是的,太好了。我想在通话中获得可重现的东西和一些数据,即它花费了 X 时间,但如果我使用 fiddler 之类的东西触发它,则需要 Y 时间。尝试在运行代码时同时启动 fiddler,以便轻松重播它。 (搜索可能会缓存在 elasticsearch 端,所以要小心误报) 我们的 Elastic 专家错误地告知我 NEST 使用二进制协议,因此我希望汇集连接。现在使用 TryConnect 更有意义(只需检查以确保您的设置正确),但文档并不完全清楚这一点。至于为什么要花一秒钟,它似乎(不知何故)与网络有关。同一数据中心中的机器永远不会出现问题。我正在使用秒表进行测量,而且似乎一直都在 TryConnect 调用中。我对 Elastic box 的平均 ping 时间(在出现问题的机器上)是 350 毫秒。 抱歉,评论系统出现问题。在我完成之前不小心发布了。 我很高兴听到它是您集群中的一台机器出现故障。感谢您更新问题!对于将来会浏览这篇文章的谷歌人来说总是很好。如果您有任何问题/疑问/请求,请保持联系,最好的方法是发布到 github 问题。

以上是关于使用 NEST ElasticSearch 库进行连接池的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 C#/ElasticSearch 进行此 NEST 通配符搜索没有返回任何文档?

使用模糊 NEST 进行多匹配查询 - ElasticSearch

如何使用 Elasticsearch 的 NEST“.net 客户端”对所有记录进行分页?

如何在 NEST 中禁用驼峰式 Elasticsearch 字段名称?

使用 NEST 的 Elasticsearch:如何配置分析器来查找部分单词?

十三.net core(.NET 6)搭建ElasticSearch(ES)系列之dotnet操作ElasticSearch进行存取的方法