我目前正在使用 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 连接。
重用 ElasticClient
不会带来任何性能提升,因为每个调用都已经获得了自己的 HttpWebRequest
。整个客户端是有意构建的无状态的。
不过,我很想知道为什么通话对您来说需要 1 秒。您能否发布实际的 NEST 代码、您如何测量调用并描述您的数据。
免责声明:我是 NEST 的作者。
关于c# - NEST ElasticSearch 库的连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11334717/