Azure Storage 是微軟 Azure 云提供的云端存儲(chǔ)解決方案,當(dāng)前支持的存儲(chǔ)類型有 Blob、Queue、File 和 Table。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

筆者在《Azure File Storage 基本用法》中介紹了 File Storage 的基本用法,本文將介紹 Queue Storage 的主要使用方法。

文章來源:葡萄城產(chǎn)品技術(shù)社區(qū)

Queue Storage 是什么?

Azure Queue Storage 是一個(gè)存儲(chǔ)大量消息的存儲(chǔ)服務(wù),這些消息可以在任何地方通過 HTTP/HTTPS 訪問。每條消息最大 64K,消息的數(shù)據(jù)量幾乎不受限制 (除非超出了您的 Storage Account 的總?cè)萘? 。

下面是 Queue Storage 典型的應(yīng)用場景:

  1. 創(chuàng)建未處理任務(wù)的隊(duì)列,以便異步的處理這些任務(wù)。

  2. 把消息從 web role 傳遞給 worker role 進(jìn)行處理。

Azure Queue Storage 的結(jié)構(gòu)

下圖描述了 Queue Storage 的基本組織結(jié)構(gòu):

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

  • Azure Storage Account:

Storage Account 是用來管理 Azure Storage 的一個(gè)命名空間,主要用來控制存儲(chǔ)數(shù)據(jù)的訪問權(quán)限和計(jì)費(fèi)。對(duì) Blob、Queue、File 和 Table 這些 Azure 提供的存儲(chǔ)服務(wù)的訪問控制,都是通過 Storage Account 來進(jìn)行的,所以要想使用 Queue Storage,需要先創(chuàng)建你的 Storage Account。

  • Queue:

每個(gè) Queue 都是一組消息的集合,每一條消息都必須屬于一個(gè) Queue,Queue 名稱中的字符必須是小寫。

  • Message:

每條 Message 的最大長度為 64KB,Message 在 Queue 中停留的最長時(shí)間為 7 天。

  • URL format:

Queue 的 URL 地址格式為:

http://<storage account>.queue.core.windows.net/<queuename>

下面是個(gè)更真實(shí)的例子:

http://nickstorage.queue.core.windows.net/app1tasks

 

如果您還不熟悉 Azure Storage Account 的使用,以及如何通過 WindowsAzure.Storage 庫訪問 Azure Storage,請(qǐng)參考前文《Azure Table storage 基本用法》中的介紹。

 

為了方便查看 C# 代碼執(zhí)行的結(jié)果,本文使用了 MS 發(fā)布的一個(gè) Azure Storage 客戶端工具:Microsoft Azure Storage Explorer,文中簡稱為 Storage Explorer。下面是 Queue Storage 的一個(gè)截圖:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

接下來我們通過 C# 代碼來介紹如何操作 Queue Storage。

創(chuàng)建 Queue

我們先來創(chuàng)建一個(gè)名為“app2tasks”的 Queue:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

//CloudStorageAccount 類表示一個(gè) Azure Storage Account,我們需要先創(chuàng)建它的實(shí)例,才能訪問屬于它的資源。//注意連接字符串中的xxx和yyy,分別對(duì)應(yīng)Access keys中的Storage account name 和 key。CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yyy");//CloudQueueClient 類是 Windows Azure Queue Service 客戶端的邏輯表示,我們需要使用它來配置和執(zhí)行對(duì) Queue Storage 的操作。CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();//CloudQueue 表示一個(gè) Queue 對(duì)象, 絕大多數(shù)的操作都是通過這個(gè)對(duì)象完成的。CloudQueue queue = queueClient.GetQueueReference("app2tasks");//如果不存在就創(chuàng)建名稱為 "app2tasks" 的 Queue。queue.CreateIfNotExists();

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

執(zhí)行上面的代碼,然后在 Storage Explorer 中查看結(jié)果:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

把消息插入 Queue

現(xiàn)實(shí)的應(yīng)用場景中肯定有一個(gè)或多個(gè)程序產(chǎn)生 Message 并插入到 Queue 中,接下來我們看看用 C# 如何實(shí)現(xiàn):

string current = DateTime.Now.ToString();//把消息插入到隊(duì)列中。CloudQueueMessage message = new CloudQueueMessage("Hello, World. -- " + current);
queue.AddMessage(message);

調(diào)用幾次上面的代碼看看結(jié)果如何:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

我通過三次調(diào)用向 Queue 中加入了三條消息,請(qǐng)注意插入它們的時(shí)間,分別是 11:33:45,11:33:57,和 11.34:16。在接下來的描述中我分別稱它們?yōu)榈谝粭l消息、第二條消息和第三條消息。

查看 Queue 中的消息

既然是隊(duì)列,肯定有隊(duì)頭和隊(duì)尾,消息從隊(duì)頭出隊(duì),從隊(duì)尾入隊(duì)。那么能不能查看一下隊(duì)頭(也就是下一條要處理的消息,此處只是查看并不是要處理)的消息呢?當(dāng)然可以:

//總是取到隊(duì)頭的消息,沒有消息出隊(duì)。//消息在隊(duì)列中的位置、可見狀態(tài)也沒有發(fā)生變化。 CloudQueueMessage peekedMessage = queue.PeekMessage();

PeekMessage 方法總是取到處于隊(duì)頭位置的那條消息,并且不改變隊(duì)列的狀態(tài)!

查看 Queue 的長度

經(jīng)常的查看 Queue 的長度是個(gè)不錯(cuò)的注意,因?yàn)槟阈枰苊庖恍┯捎?Queue 過長帶來的問題:

//獲取 Queue 的屬性。queue.FetchAttributes();int cachedMessageCount = queue.ApproximateMessageCount;

更新 Queue 中的消息

如果一條消息已經(jīng)被添加到 Queue 中了,但是又需要更新其內(nèi)容該怎么辦?我們可以找到這條消息然后更新它的內(nèi)容:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

CloudQueueMessage message = queue.GetMessage();// 執(zhí)行 getmessage(), 隊(duì)頭的消息會(huì)變得不可見。message.SetMessageContent("Updated contents.");
queue.UpdateMessage(message,
    TimeSpan.FromSeconds(60.0), 
    MessageUpdateFields.Content | MessageUpdateFields.Visibility);// 更新完消息內(nèi)容的60s 之后,該消息會(huì)重新可見,但是是在隊(duì)尾。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

執(zhí)行上面的代碼后,我們發(fā)現(xiàn)在 Storage Explorer 中”第一條消息”不見了。過了 60 秒之后它又重新出現(xiàn)在 Storage Explorer 中,但是它的內(nèi)容已經(jīng)變化,位置也成了隊(duì)尾:

 photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

此時(shí)我們也只能通過 ID 認(rèn)出它是之前的”第一條消息”,之前 “第二條消息”,”第三條消息”的位置也發(fā)生了相應(yīng)的變化。

處理 Queue 中的消息

如何處理 Queue 中的消息呢?我們的程序大體應(yīng)該遵循下面的邏輯:

  1. 使用 GetMessage 方法取出隊(duì)頭的消息,此時(shí)該消息會(huì)在 Queue 中30秒不可見(這個(gè)時(shí)常用戶是可以設(shè)置的,默認(rèn)是 30 秒);

  2. 處理消息;

  3. 正常處理完成后,調(diào)用 Delete 方法刪除消息;

  4. 如果沒有正常處理消息 (沒有調(diào)用 Delete 方法),此消息會(huì)在30秒后重新出現(xiàn)在隊(duì)尾。

類似于下面的代碼邏輯:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

// 執(zhí)行 getmessage(), 隊(duì)頭的消息會(huì)變得不可見。CloudQueueMessage message = queue.GetMessage();try{    //處理消息    // 如果在30s內(nèi)你沒有刪除這條消息,它會(huì)重新出現(xiàn)在隊(duì)尾。    // 所以正確處理一條消息的過程是,處理完成后,刪除這條消息    queue.DeleteMessage(message);
}catch //(消息處理異常){ }

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

刪除 Queue 中的消息

除了正常處理完消息后把消息從隊(duì)列中刪除,我們也可以找到一條消息,直接刪除它,本質(zhì)上和處理完再刪除是一樣的。

總結(jié)

Queue Storage 為應(yīng)用之間的解耦提供了很好的解決方式,使得消息的產(chǎn)生者和消息的處理者可以互相不知道彼此的存在。為我們處理這類問題添加了一個(gè)有力的工具。