簡體   English   中英

Amazon S3 中的並發性

[英]Concurrency in Amazon S3

我目前正在構建一個系統,其中 S3 將被 Internet 上的許多計算機用作持久哈希集(從數據中推斷出 S3 URL)。 如果兩個節點存儲相同的數據,那么它將使用相同的密鑰存儲,因此不會存儲兩次。 當刪除 object 時,我需要知道是否有其他節點也在使用該數據。 在這種情況下,我不會刪除它。

現在我已經通過添加存儲節點列表作為寫入 S3 的數據的一部分來實現它。 因此,當節點存儲數據時,會發生以下情況:

  1. 從 S3 讀取 object。
  2. 反序列化 object。
  3. 將新節點的 id 添加到存儲節點列表中。
  4. 序列化新的 object(要存儲的數據和節點列表)。
  5. 將序列化數據寫入 S3。

這創建了一種冪等引用計數形式。 由於 Internet 上的請求可能非常不可靠,我不想只計算存儲節點的數量。 這就是為什么我要存儲一個列表而不是一個計數器(如果一個節點發送相同的請求 >1 次)。

只要兩個節點不同時寫入,這種方法就可以工作。 S3 沒有(據我所知)提供任何鎖定 object 的方法,以便所有這 5 個步驟都成為原子。

你將如何解決這個並發問題? 我正在考慮實施某種形式的樂觀並發。 我應該如何為 S3 做到這一點? 我應該使用完全不同的方法嗎?

考慮首先將鎖定列表與您的(受保護的)數據分開。 創建一個特定於您的數據的單獨存儲桶以包含鎖定列表(存儲桶名稱應該是您的數據 object 名稱的派生)。 使用第二個存儲桶中的單個文件(每個節點一個,object 名稱派生自節點名稱)。 節點在訪問受保護數據之前將新的 object 添加到第二個存儲桶,節點在完成后從第二個存儲桶中刪除其 object。

這允許您枚舉第二個存儲桶以確定您的數據是否被鎖定。 並且允許兩個節點同時更新鎖列表而不會發生沖突。

補充一下 amadeus 所說的,如果您的需求不是關系型的,您甚至可以使用 AWS 的 SimpleDB,價格要便宜得多。

我沒有使用過 Amazon S3,但這是我對持久性無知的建議。

  1. 你可以使用命令查詢隔離嗎? 將讀取與命令分開會很好,因為此檢查僅針對命令(DELETE)進行,並且您不需要讀取它(如果我正確理解的話)。

  2. 如果沒有對這種同步的原生支持,那么您自己的滾動解決方案可能會成為高負載方面的瓶頸(可以通過 [3] 和 [4] 解決)。 您所有的 DELETE 都應該通過一個中心位置 - 請求隊列 go 。

  3. 我會做一個專門的服務(比如 WCF),里面有一個並發請求隊列。 每次您需要刪除 object 時,您將排隊一個項目。 該服務將按照自己的節奏將項目出列,並將您的所有 5 個步驟作為單個事務執行。 這可能會引入一些延遲,但是如果系統讀取繁重,則可能不可見。

  4. 如果系統寫入繁重,您可能需要添加有助於將請求從隊列中出列的工作人員 [3]

將引用與資源分開可能是個好主意。

您可以在 S3 版本控制之上構建並發。 或者讓每個referer/node在S3上創建和刪除自己的鎖資源。 或者使用 Amazon Relational Database Service (RDS)。

您可以在您的 ec2 上實現自己的鎖定機制作為服務,並使用它來同步對 S3 的訪問。 在這種情況下,您可以將監視器計數存儲在 S3 中(單獨或不單獨)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM