2012-07-04 77 views
3

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

我们刚刚开始使用NEST,并一直在缺乏文档。什么是有用的,但它有一些非常大的漏洞。目前,我们需要的所有东西都可以工作,但是,我们遇到了连接问题,有时甚至需要一整秒。我们想要做的是使用某种连接池,类似于你如何与SQL Server交互。

下面是有关如何使用嵌套连接的文档: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盒子相同的网络上使用机器时,问题完全消失;我的开发机器(平均350毫秒到Elastic盒子)似乎无法建立http连接,这在TryConnect中造成了很长时间。

回答

18

您每次打电话给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的作者。

+0

是的,那太棒了。我希望得到一些可重复的数据和一些数据,也就是说它花费了大量的时间,但如果我使用类似提琴手的方式来启动它,它需要花费大量的时间。当您运行代码时,尝试一边启动提琴手,一边轻松地重播它。 (搜索可能会缓存在elasticsearch的一边,所以要小心误报) –

+0

我被我们的Elastic guru误认为NEST使用了二进制协议,因此我希望将连接集中起来。 TryConnect的使用现在变得更有意义(只需检查以确保您的设置是正确的),但文档并不完全清楚这一点。 至于为什么它需要一秒钟,似乎(不知何故)与网络有关。同一个数据中心内的机器永远不会有问题。我使用秒表进行测量,并且所有时间似乎都在TryConnect调用中。我的Elastic盒子(在展示问题的机器上)的平均ping时间是350ms。 –

+0

对不起,评论系统有问题。在我完成之前意外发布。 –