multithreading - ConcurrentUpdateSolrClient 如何处理更新请求?

标签 multithreading solr solrj

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

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

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

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

最佳答案

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

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

你必须知道,如果你有更多的 SolrClient 实例(在同一个应用程序或不同的应用程序和服务器中)并发更新集合/核心,第一个发送提交的客户端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.

关于multithreading - ConcurrentUpdateSolrClient 如何处理更新请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43600860/

相关文章:

search - Indexwriter 类中的 Forcemerge 函数

regex - Solr edismax 支持哪些正则表达式功能?

java - SolrQuery 的 SetQuery 函数中 String 参数的正确用例?

java - ReentrantLock 允许线程多次锁定某个资源

python - 使用多个图像文件并行填充 numpy 3d 数组

java - SolrJ 无效的内容类型

java - 使用 SolrJ 删除整个索引

c - 将顺序代码转换为 openMP 并行结构

c# - 在 C# 中,SerialPort 类的 DataReceived 事件处理程序是否在它自己的线程上执行?

java - Solr 4.0 和资源加载器 : getLines undefined