【问题标题】:Managing a pool of connections to a hosted Elastic Search provider管理与托管 Elastic Search 提供程序的连接池
【发布时间】:2012-08-24 19:09:30
【问题描述】:

我需要一种方法来管理与托管 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 连接。

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

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

非常感谢!

粘土

【问题讨论】:

标签: python django http elasticsearch pyes


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-28
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    相关资源
    最近更新 更多