如何使用 Ruby 的佇列儲存體

提示

Microsoft Azure 儲存體總管

Microsoft Azure 儲存體總管 是一個免費的獨立應用程式,可讓您在 Windows、MacOS 和 Linux 上以視覺化方式處理 Azure 儲存體資料。

概觀

本指南示範如何使用 Microsoft Azure 佇列儲存體服務執行常見案例。 這些範例是以 Ruby Azure API 撰寫的。 所涵蓋的案例包括「插入」、「查看」、「取得」和「刪除」佇列訊息,以及「建立和刪除佇列」

什麼是佇列儲存體?

Azure 佇列儲存體是一項儲存大量訊息的服務,全球任何地方都可利用 HTTP 或 HTTPS 並透過驗證的呼叫來存取這些訊息。 單一佇列訊息的大小上限為 64 KB,而一個佇列可以包含數百萬個訊息,以儲存體帳戶的總容量為限。 佇列儲存體通常用來建立要以非同步方式處理的待處理項目。

佇列服務概念

Azure 佇列服務包含下列元件:

Azure 佇列服務元件

  • 儲存體帳戶: 一律透過儲存體帳戶來存取 Azure 儲存體。 如需儲存體帳戶的詳細資訊,請參閱儲存體帳戶概觀

  • 佇列: 佇列包含一組訊息。 所有訊息都必須放在佇列中。 請注意,佇列名稱必須是小寫。 如需為佇列命名的詳細資訊,請參閱 為佇列和中繼資料命名

  • 訊息: 大小上限為 64 KB 的訊息 (任何格式)。 訊息可保留在佇列中的時間上限為 7 天。 如需版本 2017-07-29 或更新版本,最大存留時間可以是任何正數,或是表示訊息未過期的 -1。 如果省略此參數,則預設存留時間為 7 天。

  • URL 格式:您可以使用以下 URL 格式來定址佇列:http://<storage account>.queue.core.windows.net/<queue>

    下列 URL 可定址圖中的佇列:

    http://myaccount.queue.core.windows.net/incoming-orders

建立 Azure 儲存體帳戶

建立您第一個 Azure 儲存體帳戶最簡單的方法,就是使用 Azure 入口網站。 若要深入了解,請參閱 建立儲存體帳戶

您也可以使用 Azure PowerShellAzure CLI,或 Azure Storage Resource Provider for .NET 來建立 Azure 儲存體帳戶。

如果您不想此時在 Azure 中建立儲存體帳戶,也可以使用 Azure 儲存體模擬器在本機環境中執行並測試您的程式碼。 如需詳細資訊,請參閱使用 Azure 模擬器進行本機 Azure 儲存體開發

建立 Ruby 應用程式

建立 Ruby 應用程式。 如需說明,請參閱在 Linux 上的 App Service 中建立 Ruby 應用程式

設定您的應用程式以存取儲存體

若要使用 Azure 儲存體,您需要下載並使用 Ruby Azure 套件,這包含一組便利程式庫,能與儲存體 REST 服務通訊。

使用 RubyGems 來取得套件

  1. 使用命令列介面,例如 PowerShell (Windows)、Terminal (Mac) 或 Bash (Unix)。
  2. 在命令視窗中輸入 gem install azure 以安裝 Gem 和相依性。

匯入封裝

使用您偏好的文字編輯器,將以下內容新增至您打算使用儲存體的 Ruby 檔案頂端:

require "azure"

設定 Azure 儲存體連接

Azure 模組會讀取環境變數 AZURE_STORAGE_ACCOUNTAZURE_STORAGE_ACCESS_KEY 以取得連接 Azure 儲存體帳戶所需的資訊。 若未設定這些環境變數,您必須使用下列程式碼,在使用 Azure::QueueService 之前指定帳戶資訊:

Azure.config.storage_account_name = "<your azure storage account>"
Azure.config.storage_access_key = "<your Azure storage access key>"

若要從 Azure 入口網站中的傳統或 Resource Manager 儲存體帳戶取得這些值:

  1. 登入 Azure 入口網站
  2. 瀏覽到您要使用的儲存體帳戶。
  3. 在右邊的 [設定] 刀鋒視窗中,按一下 [存取金鑰]。
  4. [存取金鑰] 刀鋒視窗隨即顯示,您會看到存取金鑰 1 和存取金鑰 2。 您可以使用其中一個存取金鑰。
  5. 按一下複製圖示以將金鑰複製到剪貼簿。

作法:建立佇列

下列程式碼會建立一個 Azure::QueueService 物件,其讓您能夠使用佇列。

azure_queue_service = Azure::QueueService.new

使用 create_queue() 方法,建立具有指定名稱的佇列。

begin
  azure_queue_service.create_queue("test-queue")
rescue
  puts $!
end

作法:將訊息插入佇列中

若要將訊息插入佇列,請使用 create_message() 方法建立新訊息,並將它新增至佇列。

azure_queue_service.create_message("test-queue", "test message")

作法:查看下一個訊息

透過呼叫 peek_messages() 方法,您可以在佇列前面查看訊息,而無需將其從佇列中移除。 根據預設,peek_messages() 會瞄核單一訊息。 您也可以指定所要查看的訊息數。

result = azure_queue_service.peek_messages("test-queue",
  {:number_of_messages => 10})

作法:清除下一個佇列訊息

您可以使用兩個步驟將訊息從佇列中移除。

  1. 呼叫 list_messages() 時,您預設會取得佇列中的下一個訊息。 您也可以指定您要取得的訊息數。 從 list_messages() 傳回的訊息,對於從此佇列讀取訊息的任何其他程式碼而言,將會是不可見的。 您可以傳入以秒為單位的可見性逾時,作為參數。
  2. 若要完成從佇列中移除訊息,您還必須呼叫 delete_message()

這個移除訊息的兩步驟程序可確保您的程式碼因為硬體或軟體故障而無法處理訊息時,另一個程式碼的執行個體可以取得相同訊息並再試一次。 您的程式碼會在處理完訊息之後立即呼叫 delete_message()

messages = azure_queue_service.list_messages("test-queue", 30)
azure_queue_service.delete_message("test-queue",
  messages[0].id, messages[0].pop_receipt)

作法:變更佇列訊息的內容

您可以在佇列中就地變更訊息內容。 下列程式碼使用 update_message() 方法來更新訊息。 此方法會傳回一個 Tuple (其中包含佇列訊息的 pop receipt) 和一個 UTC DateTime 值 (代表訊息將會顯示在佇列上的時間)。

message = azure_queue_service.list_messages("test-queue", 30)
pop_receipt, time_next_visible = azure_queue_service.update_message(
  "test-queue", message.id, message.pop_receipt, "updated test message",
  30)

作法:清除佇列訊息的其他選項

自訂從佇列中擷取訊息的方法有兩種。

  1. 您可以取得一批訊息。
  2. 您可以設定較長或較短的可見度逾時,讓您的程式碼有較長或較短的時間可以完全處理每個訊息。

下列程式碼範例使用 list_messages() 方法,在一次呼叫中取得 15 個訊息。 接著,它會列出每個訊息,並加以刪除。 它也會將可見度逾時設定為每個訊息五分鐘。

azure_queue_service.list_messages("test-queue", 300
  {:number_of_messages => 15}).each do |m|
  puts m.message_text
  azure_queue_service.delete_message("test-queue", m.id, m.pop_receipt)
end

作法:取得佇列長度

您可以取得佇列中的估計訊息數目。 get_queue_metadata() 方法會傳回大約的訊息計數和其他佇列中繼資料。

message_count, metadata = azure_queue_service.get_queue_metadata(
  "test-queue")

作法:刪除佇列

若要刪除佇列及其內含的所有訊息,請在佇列物件上呼叫 delete_queue() 方法。

azure_queue_service.delete_queue("test-queue")

下一步

了解佇列儲存體的基礎概念之後,請參考下列連結以了解有關更複雜的儲存工作。

若要比較本文所討論的 Azure 佇列儲存體與如何使用服務匯流排佇列中討論的 Azure 服務匯流排佇列,請參閱 Azure 佇列儲存體和服務匯流排佇列 - 比較和對照