2015-11-25 56 views
4

,我的場景是我有一個由多個待處理文檔組成的集合 - 一次一個文檔。處理文檔需要相當長的時間,處理整個集合需要花費很多時間。因此,我將有多個同時處理同一個集合的「工作人員」。每一個需要做這樣的事情,如何讓多個進程讀取相同的文檔

(A)獲得下一未處理的文件,

(B)進行處理,

(C)標記文檔處理,然後繼續。

如何確保同時進程不讀取相同的文檔?我不知道關鍵值是什麼,所以我不能說process_A應該從1開始,process_B從100萬開始。另外,我想添加儘可能多的流程以便於管理,因此說一個前進而另一個後退是不現實的。

我問關於MongoDB,因爲這是我使用的。我想象可能會問一個關於SQL數據庫的問題。

我懇求任何想幫助的人,而不是專注於改變無論外在原因都是給定的情景。

謝謝

+0

您可以使用跳過和限制按照您的喜好對集合進行分區並將工作分配給這些分區嗎? – TeTeT

+0

@TeTeT跳過可能不是很好的選擇,因爲內部跳過仍然需要處理它跳過的所有文檔。會非常低效。 –

+0

在關於這個問題的評論中有一個討論。我懷疑它也會在這裏工作。也許有趣? [連續運行Cron作業](http://stackoverflow.com/questions/32700321/running-a-cron-job-continuously#comment53244570_32700321) –

回答

0

我會推薦使用一些線程安全資源來維護一組讀取文檔。當您的工作人員閱讀文檔時,他們會嘗試刪除文檔中的_id。如果不存在,工人應該處理文檔,如果存在,那麼工作人員應該移動到下一個文檔。

至於這個線程安全的資源可能是什麼,Mongo實際上是一個很好的選擇。它具有文檔級別的原子性,因此您可以創建一個新的「解析文檔」集合。每次嘗試解析文檔時,都會將其_id插入到該集合中,並且如果寫入結果表明您插入了1個文檔,那麼您就知道它是新的。

+0

我擔心的是,在我抓取文檔的時間間隔並將其標記爲正在處理,或者通過刪除它,或者更新標記或將其標識寫入另一個集合中, - 在該時間間隔中,另一個進程也將抓取該文件。 – sdfor

+0

@sdfor如果您在Mongo確認已創建新文檔之後纔開始處理,則不會有任何問題。不要更新文檔中的標誌,只用the_id字段創建一個新文檔 –

+0

難題, - 所以邏輯必須是:抓取文檔,將其寫入ID集合,如果寫入工作,即。不是重複然後處理它。否則另一個進程有它,所以繼續下一個文件。並且,在文檔處理完畢後,然後標記文檔,以避免進程再次嘗試 - 這是因爲mongo沒有連接。並且我不能說,如果您將_ids寫入其自己的集合,則可以獲取ID集合中沒有_id的數據集合中的下一個文檔 – sdfor

相關問題