2013-07-24 106 views
0

基本上,需要的工作是對數據的基礎上大量的記錄,以及更多的記錄可以被插入所有的時間:數據處理和更新

選擇與狀態「NEW」 < 1000>記錄 - >處理記錄 - >將記錄更新爲狀態「完成」。

這聽起來像我「地圖減少」。

我認爲上述的作業可以可以並行甚至由不同的機器,但後來我關心的是:

當我選擇狀態爲「NEW」 < 1000>記錄 - 我怎麼知道這些記錄中沒有一個已經被其他工作處理?

當然,不應該選擇和處理相同的記錄不止一次。 性能至關重要。 天真的解決方案是做一個循環中提到的基本工作。

這似乎與大數據處理/ nosql/map reduce等有關。

感謝

+0

這取決於,正在使用哪個databse? – twid

+0

正在使用的數據庫是oracle,而且它可能是HBase的一個小機會。 所以請給我提供2個解決方案(如果它們完全不同): 1.對於Oracle數據庫。 2.對於HBase。 謝謝 – Liran

+0

在第一個作業完成之前開始第二個作業處理新記錄的原因是什麼? – Olaf

回答

0

由於考慮性能問題...我們可以可以實現這一信息。主要目的是記錄分發到客戶端這樣的方式,沒有給客戶得到相同的記錄。 我不管數據庫的...

  1. 如果您有用於記錄鎖定一個多列。因此,在獲取這些記錄時,您可以設置鎖定,以防止獲取發送時間。

  2. 但是如果你沒有這樣的能力,那麼我的投注將會是創建另一個表或im-memory鍵值存儲,帶有記錄主鍵和鎖定,並且在獲取記錄時你需要檢查記錄不存在在其他表...

如果你有HBase那麼它可以很容易地實現第一種方法是可以實現的性能。

+0

我考慮過只爲了性能和擴展而並行執行它 - 所以可以通過多個線程來完成 - 此外,也可以通過多臺機器 - 如果它不能並行完成,則不會擴展 - 不會超過一臺機器它處理。 關於1,鎖定記錄 - 我想到了這一點,我認爲它很複雜:過程將鎖定<1000>記錄 - 選擇<1000>記錄狀態爲「新」 - >處理記錄 - >更新記錄狀態「完成」並解鎖它們。並且如果一個進程鎖定記錄並在中間記錄中崩潰,則保持鎖定狀態。更多的處理。 – Liran

+0

所以我認爲你可以做的是必須有一些TTL,TTL到期後下一個線程/進程可以訪問該記錄。 TTL值需要足夠大以允許第一個客戶端處理記錄並提交它... – twid

+0

也想過了:)再次 - 這些都是好的和有效的解決方案 - 正如我寫的 - 更多的處理,但我不確定它是否它應該是那麼複雜。所以我會記住所有這些。第一種解決方案沒有並聯,或秒解鎖定和更復雜的解決方案。謝謝 !用於記錄級鎖定的 – Liran