ConcurrentUpdateSolrClient如何处理更新请求?

Bur*_*ong 2 multithreading solr solrj

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

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

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

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

fre*_*dev 6

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

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

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

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

在 Solr 中并发更新文档有很多策略,要了解 Solr 中的提交如何工作,我强烈建议阅读

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

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

尽管可以使用此实现发出任何 SolrClient 请求,但仅建议将 ConcurrentUpdateSolrClient 与 /update 请求一起使用。HttpSolrClient 类更适合查询接口。