2012-03-07 98 views
3

首先,我正在尋找解決此問題的不同方法。數據庫中的隊列管理

我在我們的應用程序中有一個隊列在數據庫表中維護。 有一個預定的處理器,它將查看隊列並根據記錄上的STATUS字段提取記錄。 它處理這些記錄,併成功從表中刪除記錄。

問題是我的應用程序是聚簇的。因此,將有幾個預定處理器的實例,將拉出相同的記錄,然後處理它們...

要解決這個問題,我遵循的方法是 我更新記錄之前它的狀態(從PENDING到WORKING),並且還在表格的實體映射上添加了一個版本,因此動作的順序爲:

1)查詢表中的PENDING記錄。 2)更新狀態爲WORKING。 (如果處理器的另一個實例在某人已更新記錄時嘗試更新它,則會發出異常,因此將轉移到下一條記錄) 3)成功。刪除記錄,否則將其更新回PENDING。

現在,這樣做會很解決問題,但不很喜歡這個主意......

想找出誰面臨着類似的問題,人們已經解決了。

我有另一種方法來解決這個問題,因爲相同的應用程序填充表,將它分配給填充它的主機,並且該特定tomcat上的計劃處理器僅查找該主機的記錄。基本上要儘量減少第一個解決方案將會發生的顛簸。

它是一個Spring 3.0.5和Hibernate應用

+0

你看了看:ZeroMQ還是Apache Kafka? – eSniff 2012-03-07 00:35:07

回答

2

這是很普遍的問題。你可以從不同的方式解決它:

  • 擁有通過分配新的狀態+樂觀鎖定當前處理的記錄。這是你的方法,它會起作用,但如果當前正在處理某個節點的節點死亡,則必須記住清理表格。

  • 同上,但悲觀鎖定 - 只有一個節點可以訪問整個隊列 - 如果有很多節點,並且經常發生樂觀鎖失敗

  • 外部/全局鎖可能是一個更好的方法表一次。您可以使用表級鎖定來阻止所有其他節點或一些節點。

  • 在隊列表中放置新記錄時,隨機化並將其分配給給定節點,以便其他節點無法處理它。不要走這條路,維護噩夢,例如當添加或刪除節點時。

  • 使用,它會自動聚集作業並在一個節點上運行它們。它使用類似於上面的技術(悲觀鎖定在共享數據庫上)

  • ...或者只是使用普通的JMS提供程序,數據庫並不真正用作隊列...