2016-11-14 100 views
-2

我將事件數據存儲在表存儲中。有多個工作角色的實例需要訪問此角色。每個輔助角色實例都需要訪問此表中的唯一行,並對此數據執行一些處理,如果成功,則需要將此數據標記爲已完成,以便其他任何實例都不會選擇此行。並且在處理過程中,這行還需要被其他工作人員隱藏起來,以便他們完成處理。Azure表存儲 - 分佈式鎖定

有沒有可以解決這個問題的設計?

+1

目前尚不清楚你想要完成什麼。您提到了Azure服務總線以及Azure表。你可以請更新你的問題,並提供更多的細節? –

+0

增加了一些更多的上下文 –

回答

1

因爲這樣的Azure表沒有鎖定機制。它可用於blob和隊列。

解決此問題的一種可能方法是使用Master/Slave Pattern。那麼讓我們假設你有5個工作者角色實例在運行。定期(比如每隔30秒),所有這些實例都會嘗試獲取blob上的租約。只有一個實例能夠成功,並且該實例將成爲主設備(所有其他實例都將成爲從設備)。

現在mater會做什麼是從表(例如5條記錄)獲取數據並將它們作爲單獨的消息插入到隊列中。一旦主人這樣做,它會自動成爲奴隸。從屬服務器會做的是從隊列中取出一條消息(通過使消息出列以使其他實例不能看到該消息),對其進行處理,然後更新表中的記錄。一旦奴隸完成了它的工作,它就會在預定的時間後纔會回到睡眠狀態。

有關更多詳細信息,請參閱Competing Consumer Patterns

0

使用Azure隊列和生產者消費者模式,將工作單元寫爲生產者端隊列的消息,並讓您的工作者角色從隊列中消耗工作並處理它。隊列會處理這條消息,使其在處理時不可見,以避免重複,每個工作者角色可以在成功處理消息後從隊列中刪除消息。