4

我需要一种方法来管理与托管 Elastic Search 提供商的连接,以加快我网站上的搜索速度。我们在 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 连接。

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

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

非常感谢!

黏土

4

1 回答 1

1

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

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

于 2012-10-22T07:41:58.793 回答