【问题标题】:How does ConcurrentUpdateSolrClient handle update request?ConcurrentUpdateSolrClient 如何处理更新请求?
【发布时间】:2017-04-25 03:02:06
【问题描述】:

我的应用程序打算定期向 Solr 插入文档。有两个考虑:

  1. 向 Solr 发送更新请求是对性能的关键影响。
  2. 事务的线程安全。 SolrClient 的提交不是线程安全的(如果我错了请指出这一点),当多个用户向 Solr 输入文档时,这可能会导致严重的问题。

我发现ConcurrentUpdateSolrClient 是一种候选解决方案,它是线程安全的,并且它有一个队列可以在一个连接中缓冲和刷新许多文档。但是当我测试它时我很困惑。我的问题是,

  1. 如果我设置了队列大小,我还需要提交吗?
  2. 如果我提交,即使队列中只有一个文档,它仍然会向 Solr 提交一个 http 请求。我可以让它作为消息队列工作吗?

【问题讨论】:

    标签: multithreading solr solrj


    【解决方案1】:

    SolrClient 是线程安全的,如果您的插入/更新/删除坚持到 Solr 实例的一个集合或核心,您可以跨多个线程共享一个 SolrClient 实例。

    但是 Solr 没有您想象的经典 RDBMS 中的事务。

    您必须注意,如果您有更多 SolrClient 实例(在同一应用程序或不同应用程序和服务器中)同时更新集合/核心,则向该集合/核心发送提交的第一个客户端提交每个客户到那一刻为止完成的所有更新。

    另一方面,如果SolrClient 实例发送回滚,它会回滚完成的所有更新(甚至是其他 SolrClient 客户端)。

    在 Solr 中有很多策略可以同时更新文档,为了了解提交在 Solr 中的工作原理,我强烈推荐阅读

    如果您正在编写自己的多线程应用程序,我只建议您将提交和回滚集中在一个点上。

    ConcurrentUpdateSolrClient 缓冲所有添加的文档并写入它们 进入打开的 HTTP 连接。 这个类是线程安全的

    虽然 任何 SolrClient 请求都可以使用此实现进行,它是 仅建议将 ConcurrentUpdateSolrClient 与 /update 一起使用 requests. 类 HttpSolrClient 更适合查询 界面。

    【讨论】:

    • 非常感谢您的参考。我明白什么是软提交和硬提交。最重要的想法是“不要从客户端做任何形式的提交”——Erick Erickson。
    • 我很高兴看到我的回答很有用:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多