ConcurrentUpdateSolrClient 如何处理更新请求?

How does ConcurrentUpdateSolrClient handle update request?

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

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

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

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

SolrClient 是线程安全的,如果您的 insert/update/delete 坚持到一个集合或 Solr 实例的核心,您可以跨多个线程共享一个 SolrClient 实例。

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

您必须注意,如果您有更多 SolrClient 个实例(在同一个应用程序或不同的应用程序和服务器中)同时更新 collection/core,第一个发送提交到的客户端collection/core,提交每个客户端在那一刻之前完成的所有更新。

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

Solr 中有很多并发更新文档的策略,要了解 Solr 中提交的工作原理,我热烈推荐阅读

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

ConcurrentUpdateSolrClient buffers all added documents and writes them into open HTTP connections. This class is thread safe.

Although any SolrClient request can be made with this implementation, it is only recommended to use ConcurrentUpdateSolrClient with /update requests. The class HttpSolrClient is better suited for the query interface.