2017-04-25 63 views
1

我的應用程序打算定期向Solr插入文檔。有兩點需要注意:ConcurrentUpdateSolrClient如何處理更新請求?

  1. 發送更新請求到Solr是對性能的關鍵影響。
  2. 線程安全的交易。 SolrClient的提交不是線程安全的(如果我錯了,指出這一點),當多個用戶向Solr輸入文檔時,這可能會導致嚴重的問題。

我發現ConcurrentUpdateSolrClient是一個候選解決方案,它是線程安全的,它有一個隊列來在一個連接中緩衝和刷新許多文檔。但是當我測試它時我感到困惑。我的問題是,

  1. 如果我設置隊列大小,我還需要提交嗎?
  2. 如果我提交,即使隊列中只有一個文檔,它仍然會向Solr提交一個http請求。我可以使它作爲消息隊列工作嗎?

回答

2

SolrClient是線程安全的,可以跨多個線程共享一個SolrClient例如,如果您的插入/更新/刪除都堅持一個集合或核心到Solr的實例。

但是,Solr並沒有像您可以想象的那樣在經典的RDBMS中擁有這些交易。

您必須瞭解,如果您有更多SolrClient實例(在同一應用程序中或在不同的應用程序和服務器中)同時更新集合/內核,則向集合/內核發送提交的第一個客戶端會提交所有每個客戶都會在此刻完成更新。另一方面,如果SolrClient實例發送回滾,它將回滾所有更新(甚至由其他SolrClient客戶端完成)。

有許多策略來更新Solr的同時文件,瞭解如何提交在Solr的作品我熱烈推薦閱讀

如果你正在編寫自己的多線程應用程序,我只是建議集中提交和回滾s在一點。

ConcurrentUpdateSolrClient緩衝區中的所有添加的文檔,並將其 寫入開放的HTTP連接。 該課程是線程安全的

雖然 任何SolrClient請求可以用這個實現進行,這是 只推薦使用ConcurrentUpdateSolrClient與/更新 請求。 HttpSolrClient類更適合於查詢 接口。

+1

非常感謝您的參考。我瞭解softcommit和hardcommit是什麼。最重要的想法是「不要做任何客戶的承諾」 - 埃裏克埃裏克森。 – BurnetZhong

+0

我很高興看到我的回答很有用:) – freedev