[英]How to lock item in Azure storage table to allow only one Azure function to access its data at a time
我在 Azure 存儲表中添加了一個鎖定標志,希望一次只有一個 Azure function 可以訪問其數據。 以下是我是如何做到的:
Azure 存儲表中有一個項目:
{
partitionKey: 'foo_id'
foo: 'foo_data'
bar: 'bar_data'
isLocked: false
}
然后我有隊列觸發 function 處理和更新表中的 foo/bar 數據只有當項目沒有被鎖定時(isLocked == false)。 隊列觸發 function 是這樣的:
def main(msg: func.QueueMessage):
is_locked = get_property_from_table('foo_id', 'isLocked')
if not is_locked:
lock_task_in_table('foo_id') #isLocked = true
#continue with business logics
#that retrieve/update foo&bar data in task
unlock_task_in_table('foo_id') #isLocked = false
else:
#do nothing
但是,當多個消息並發觸發函數時,仍然會出現兩個以上的函數同時獲取表項數據並運行業務邏輯代碼的情況。 有什么辦法可以一次只允許一個 Azure function 訪問我的 Azure 表項?
• 您可以通過租用 Azure blob 存儲和表存儲來做到這一點。 您可以使用此技術確保只有一個 azure function 在給定時間點訪問表分區,並且數據更新在所有表中保持一致。 為此,按如下方式創建一個 blob 和一個表條目,並為 blob 指定一個與表實體的鍵匹配的名稱:-
以下是租賃保護表訪問的代碼:-
• 因此,正如您在上面看到的,try 塊代碼正在訪問表存儲中的實體並更新它,但是由於我們已經使用表實體的鍵引用命名了 blob 容器,我們獲得了該表實體的租約通過獲得該 blob(表的命名鍵)的租約。 此外,由於我們提供了確定的租用時間段的租用 ID,表實體訪問將在該時間段內被 function 鎖定。 存儲帳戶工作空間中上述代碼的 output 將是一個與表實體的分區鍵匹配的 blob 名稱,以及實體表中表存儲中的一個條目。
因此,通過這種方式,您可以通過租約 function 在某些表條目上創建鎖。 有關更多信息,請參閱以下鏈接:-
https://www.azurefromthetrenches.com/acquiring-locks-on-table-storage/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.