Azure Storage 是微軟 Azure 雲提供的雲端存儲解決方案,當前支持的存儲類型有 Blob、Queue、File 和 Table。html
筆者在《Azure File Storage 基本用法》中介紹了 File Storage 的基本用法,本文將介紹 Queue Storage 的主要使用方法。web
文章來源:葡萄城產品技術社區windows
Azure Queue Storage 是一個存儲大量消息的存儲服務,這些消息能夠在任何地方經過 HTTP/HTTPS 訪問。每條消息最大 64K,消息的數據量幾乎不受限制 (除非超出了您的 Storage Account 的總容量) 。app
下面是 Queue Storage 典型的應用場景:異步
下圖描述了 Queue Storage 的基本組織結構:工具
Storage Account 是用來管理 Azure Storage 的一個命名空間,主要用來控制存儲數據的訪問權限和計費。對 Blob、Queue、File 和 Table 這些 Azure 提供的存儲服務的訪問控制,都是經過 Storage Account 來進行的,因此要想使用 Queue Storage,須要先建立你的 Storage Account。spa
每一個 Queue 都是一組消息的集合,每一條消息都必須屬於一個 Queue,Queue 名稱中的字符必須是小寫。.net
每條 Message 的最大長度爲 64KB,Message 在 Queue 中停留的最長時間爲 7 天。orm
Queue 的 URL 地址格式爲:cdn
http://<storage account>.queue.core.windows.net/<queuename>
下面是個更真實的例子:
http://nickstorage.queue.core.windows.net/app1tasks
若是您還不熟悉 Azure Storage Account 的使用,以及如何經過 WindowsAzure.Storage 庫訪問 Azure Storage,請參考前文《Azure Table storage 基本用法》中的介紹。
爲了方便查看 C# 代碼執行的結果,本文使用了 MS 發佈的一個 Azure Storage 客戶端工具:Microsoft Azure Storage Explorer,文中簡稱爲 Storage Explorer。下面是 Queue Storage 的一個截圖:
接下來咱們經過 C# 代碼來介紹如何操做 Queue Storage。
咱們先來建立一個名爲「app2tasks」的 Queue:
//CloudStorageAccount 類表示一個 Azure Storage Account,咱們須要先建立它的實例,才能訪問屬於它的資源。 //注意鏈接字符串中的xxx和yyy,分別對應Access keys中的Storage account name 和 key。 CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yyy"); //CloudQueueClient 類是 Windows Azure Queue Service 客戶端的邏輯表示,咱們須要使用它來配置和執行對 Queue Storage 的操做。 CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient(); //CloudQueue 表示一個 Queue 對象, 絕大多數的操做都是經過這個對象完成的。 CloudQueue queue = queueClient.GetQueueReference("app2tasks"); //若是不存在就建立名稱爲 "app2tasks" 的 Queue。 queue.CreateIfNotExists();
執行上面的代碼,而後在 Storage Explorer 中查看結果:
現實的應用場景中確定有一個或多個程序產生 Message 並插入到 Queue 中,接下來咱們看看用 C# 如何實現:
string current = DateTime.Now.ToString(); //把消息插入到隊列中。 CloudQueueMessage message = new CloudQueueMessage("Hello, World. -- " + current); queue.AddMessage(message);
調用幾回上面的代碼看看結果如何:
我經過三次調用向 Queue 中加入了三條消息,請注意插入它們的時間,分別是 11:33:45,11:33:57,和 11.34:16。在接下來的描述中我分別稱它們爲第一條消息、第二條消息和第三條消息。
既然是隊列,確定有隊頭和隊尾,消息從隊頭出隊,從隊尾入隊。那麼能不能查看一下隊頭(也就是下一條要處理的消息,此處只是查看並非要處理)的消息呢?固然能夠:
//老是取到隊頭的消息,沒有消息出隊。 //消息在隊列中的位置、可見狀態也沒有發生變化。 CloudQueueMessage peekedMessage = queue.PeekMessage();
PeekMessage 方法老是取處處於隊頭位置的那條消息,而且不改變隊列的狀態!
常常的查看 Queue 的長度是個不錯的注意,由於你須要避免一些因爲 Queue 過長帶來的問題:
//獲取 Queue 的屬性。 queue.FetchAttributes(); int cachedMessageCount = queue.ApproximateMessageCount;
若是一條消息已經被添加到 Queue 中了,可是又須要更新其內容該怎麼辦?咱們能夠找到這條消息而後更新它的內容:
CloudQueueMessage message = queue.GetMessage(); // 執行 getmessage(), 隊頭的消息會變得不可見。 message.SetMessageContent("Updated contents."); queue.UpdateMessage(message, TimeSpan.FromSeconds(60.0), MessageUpdateFields.Content | MessageUpdateFields.Visibility); // 更新完消息內容的60s 以後,該消息會從新可見,可是是在隊尾。
執行上面的代碼後,咱們發如今 Storage Explorer 中」第一條消息」不見了。過了 60 秒以後它又從新出如今 Storage Explorer 中,可是它的內容已經變化,位置也成了隊尾:
此時咱們也只能經過 ID 認出它是以前的」第一條消息」,以前 「第二條消息」,」第三條消息」的位置也發生了相應的變化。
如何處理 Queue 中的消息呢?咱們的程序大致應該遵循下面的邏輯:
相似於下面的代碼邏輯:
// 執行 getmessage(), 隊頭的消息會變得不可見。 CloudQueueMessage message = queue.GetMessage(); try { //處理消息 // 若是在30s內你沒有刪除這條消息,它會從新出如今隊尾。 // 因此正確處理一條消息的過程是,處理完成後,刪除這條消息 queue.DeleteMessage(message); } catch //(消息處理異常) { }
除了正常處理完消息後把消息從隊列中刪除,咱們也能夠找到一條消息,直接刪除它,本質上和處理完再刪除是同樣的。
Queue Storage 爲應用之間的解耦提供了很好的解決方式,使得消息的產生者和消息的處理者能夠互相不知道彼此的存在。爲咱們處理這類問題添加了一個有力的工具。