ConcurrentUpdateSolrClient如何处理更新请求?

时间:2017-04-25 03:02:06

标签: multithreading solr solrj

我的申请打算定期向Solr插入文件。有两个注意事项:

  1. 向Solr发送更新请求是对性能的关键影响。
  2. 交易的线程安全。 SolrClient的提交不是线程安全的(如果我错了,请指出这一点),当多个用户向Solr输入文档时,这可能会导致严重的问题。
  3. 我发现ConcurrentUpdateSolrClient是一个候选解决方案,它是线程安全的,它有一个队列来缓冲和刷新一个连接中的许多文档。但是当我测试它时我很困惑。我的问题是,

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

1 个答案:

答案 0 :(得分:3)

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

但Solr并没有像你想象的那样在经典的RDBMS中进行交易。

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

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

有许多策略可以在Solr中同时更新文档,并了解Solr中的提交是如何工作的,我热烈推荐阅读

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

  

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

     

<强>虽然   可以使用此实现进行任何SolrClient请求   仅建议将ConcurrentUpdateSolrClient与/ update一起使用   请求。类HttpSolrClient更适合查询   接口