管理与托管弹性搜索提供程序的连接池

时间:2012-08-24 19:09:30

标签: python django http elasticsearch pyes

我需要一种方法来管理与托管弹性搜索提供程序的连接,以加快我网站上的搜索速度。我们在Heroku上运行Django,使用Found ElasticSearch插件和pyes,这是一个ElasticSearch Python库。

使用pyes建立与ElasticSearch的连接的标准方法是将提供程序URL传递给ES对象,如下所示:

(1)connection = ES(my_elasticsearch_url)

Pyes使用幕后的ES对象建立与我的ElasticSearch提供程序的开放HTTP连接,因此我可以运行如下搜索:

(2)results = connection.search(some_query, index_name)

以前,我在Django视图中执行这两个步骤进行搜索 - 每次用户进行搜索时,它都会打开一个新的HTTP连接然后运行搜索。因此,搜索电话很慢。

我通过将(1)移动到我的应用程序的__init__.py文件来加速搜索 - 现在,我只设置一次连接,并将其导入搜索视图。但我担心如果有很多人一次尝试搜索,它会阻塞HTTP连接。

我正在寻找有关如何设置连接池的想法,在应用启动时启动它们,然后根据需要将它们发送到我的搜索视图。理想情况下,我希望能够轻松地上下调整池的大小,只需对代码进行最小的更改。

我可以想到几种方法来处理它,但它似乎是一个常见的计算相关问题,所以我相信很多人都对这样一个系统的良好设计和最佳实践有所了解。我很乐意听到他们的声音。

非常感谢!

粘土

1 个答案:

答案 0 :(得分:1)

如果您在多线程环境中运行,只需要扩展Queue.Queue来创建一个可以根据需要获取和实例化连接的实例,从您的视图处理请求 - 响应的多个线程中流。您可能希望通过限制队列的最大大小来确定保留连接的数量上限,尽管您可以实例化更多的连接,如果您可以将它们放回队列中,则只需丢弃它们。

使用Queue.Queue的缺点是,如果您的视图负责从队列中检索连接并将其返回队列,则可以创建横切关注点。如果只从保持连接的pyes.ES对实际对象进行排队,并为ES创建一个包装器,在执行查询时创建新的ES实例,则可以获得更健康的设计,从队列中获取连接,在实例上设置连接,执行查询,将连接返回到队列中,丢弃ES实例并返回查询结果。