【问题标题】:Feeding ES directly - Is a queue needed?直接喂 ES - 需要队列吗?
【发布时间】:2013-08-26 13:06:30
【问题描述】:

我正在研究在没有数据库的情况下使用 ES 的可能性,从我的 python 应用程序构建我的数据并将其实时直接发送到 ES。它告诉我很多复杂性,但我担心的是我可能会非常快速地生成数据并无情地发送请求,即使 ES 可能还没有准备好接受它。

我的问题是,在这种情况下,使用队列系统作为两者之间的缓冲区是否有意义,所以我的应用程序将所有内容发送到队列,然后队列尝试将其添加到 ES,如果没有则重试没有成功。

我不确定这是否是最合乎逻辑或最有效的方法。如果有人对适合哪种队列系统有任何信息或想法,或者我什至需要一个,我会非常有兴趣听到。

詹姆斯

【问题讨论】:

    标签: python performance search queue elasticsearch


    【解决方案1】:

    Elasticsearch 批量索引 API 非常高效;它可以处理相当多的负载 - 当然取决于您的源文档和分析器的复杂性。请务必测试对您的硬件和用例最有效的批量批量大小(提到的复杂性)。

    另一种方法是使用 Elasticsearch river 概念(http://www.elasticsearch.org/guide/reference/river/,简介:http://www.elasticsearch.org/blog/the-river/):rivers 只需在集群中的 单个 节点上运行,侦听某些消息代理排序(redis、rabbitmq、couchdb 等存在)。您的应用程序以它支持的任何速度将文档推送到消息代理 - 通常非常快 - 并且 Elasticsearch river 使用批量索引在内部批量提取数据和索引。

    老实说,如果您不确定,请先尝试最简单的解决方案(直接批量索引)。如果这不起作用,请继续使用河流支持。

    【讨论】:

    • 我想也许/希望亚马逊简单的消息队列会起作用。
    【解决方案2】:

    我是新来的,但我会尝试与 ES 分享我自己的经验。 在这里,我们使用 couchDB 将我们要索引的 json 存储到 ES 中。但是,我们对这些文档进行了大量修改,例如创建新节点等。文档很大,有数百个字段,超过 15 个嵌套集合。 最后,还有成千上万的文档。

    所以,是的,以我的拙见,如果您可以通过您的应用程序创建文档,我不明白为什么 ES 会遇到麻烦。 不过,对于 python 部分,我无能为力,我们在这里用 java 做事。

    但是,对于 ES,我会

    • 使用批量 API。 ES 以这种方式(很多,很多)更有效率。
    • 我可能会将由于随机错误而无法编入索引的文档的 ID 存储在另一个索引(或文件或其他位置)中,以便您可以在之后重建和重新索引它们,而不是重试关于错误。 (虽然我不知道在 python 中的可行性)
    • 不对当前索引的索引使用副本。

    对于错误重试,我的心情很复杂。如果错误是由于文档的错误构造或映射错误造成的,则每次重试都会失败。

    在这里,我们每分钟索引数千个这样的文档,并且仍然可以发出搜索和分面请求(不过,这些请求可能会稍微慢一些)。

    这并不多,但我希望它有所帮助。 祝你好运。

    【讨论】:

      猜你喜欢
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 2015-06-06
      • 2017-02-05
      • 1970-01-01
      • 2021-03-16
      相关资源
      最近更新 更多