2014-03-29 33 views
0

我正在Python中使用MongoDB構建一個包含所有要爬網的URL的隊列。我將有幾個獨立的工作人員抓取網址。每當工作人員完成對一個URL的抓取時,它將在MongoDB集合「隊列」中發出一個請求,以獲得一個新的抓取URL。多個工作人員從單個MongoDB隊列中獲取信息

我的問題是,由於將有多個搜尋器,我如何確保兩個搜尋器不會同時查詢數據庫並獲取相同的URL來抓取?

非常感謝您的幫助

+0

你真的嘗試過嗎? MongoDB [有一個併發協議/鎖定系統](http://docs.mongodb.org/manual/faq/concurrency/),我認爲它會按照你的意願去做。 – surfreak

回答

0

因爲MongoDB中讀取併發我完全理解你的說法。是的,兩名工作人員可以選擇相同的行,對其進行修改,然後重新保存,從而覆蓋對方(更不用說在抓取時浪費資源)。

我相信你必須接受這種或那種方式,否則你會失去表現,這是確保一致性的一個不幸的部分。

您可以使用findAndModify專門挑選,因爲findAndModify具有隔離性,它可以確保您只挑選一個以前未被選中的URL。問題是由於被隔離,findAndModify會減慢抓取速度。

另一種方式可能是執行樂觀鎖定,在您選擇數據庫行後快速選擇鎖定,這意味着在搜尋重複URL時會有一些浪費,但這確實意味着您會獲得工作人員的最佳性能和併發性。

你去哪一個需要你測試和發現你最好的套房。

相關問題