什么是Windows Azure Queue Storage 隊列存儲
Windows Azure Queue Storage存儲大量的信息,可以在世界任何地方通過驗證的調用,使用HTTP或HTTPS訪問的服務。一個單一的隊列信息可高達64KB的大小,隊列可以包含數百萬條消息,每個存儲帳戶(storage account)限制的總容量高達100TB。隊列存儲的常見用途包括:
- 創建異步處理積壓的工作
- 從Windows Azure的Web角色的消息傳遞到Windows Azure Worker角色
基本概念
隊列服務包含以下組件:
URL 格式:隊列服務,是通過REST來訪問的,基於URL地址訪問。格式如下:
http://<storage account>.queue.core.windows.net/<queue>
上面圖表的Queue的URL為:
http://myaccount.queue.core.windows.net/imagesToDownload
存儲賬戶(Storage Account):Azure Storage訪問是通過REST方式,使用對稱加密方式(Symmetric)。一個賬戶能訪問所有的雲存儲(Blob、Table、Queue)。
隊列(Queue):一個隊列能存儲大量的信息。存儲隊列不能保證FIFO,而且還能多次讀取同一個消息。
消息(Message):能存儲字符串或者字節數組,一個消息不能大於64k(包括除message信息的其他信息,傳遞的信息大小不能超過49152字節)。
創建存儲賬戶
在使用雲存儲前,得需要到雲管理平台上創建存儲賬戶。
構建訪問存儲連接字符串(StorageConnectionString)
連接字符串包含三個部分:DefaultEndpointsProtocol,AccountName,AccountKey
EndpointsProtocol只能是https和http,再次說明他是基於REST方式訪問的(REST over http or https)。
AccountName和AccountKey可以到雲管理平台查詢到
連接竄組成格式如下:
DefaultEndpointsProtocol=https;AccountName=[AccountName];AccountKey=[AccountKey]
配置文件
部署雲服務需要兩個文件,分別是*.cspkg和*.cscfg。
前者其實是一個zip壓縮文件,包含所有部署的配置信息。
后者包含webrole和worker role的工作的具體信息。
我們可以把連接字符串寫在*.cscfg里面,也就是開發時雲服務項目的*.cloud.cscfg、*.local.cscfg、*.csdef文件里面。
<configuration>
<connectionStrings>
<add name="StorageConnectionString"
connectionString="DefaultEndpointsProtocol=https;AccountName=[AccountName];AccountKey=[AccountKey]" />
</connectionStrings>
</configuration>
怎樣開發訪問隊列
需要的程序集如下:
Microsoft.WindowsAzure.Storage.dll
開發代碼:
// 通過連接字符串解析CloudStorageAccount實例 // Endpoint "http://storageacount.queue.core.windows.net" CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnetionString")); #region 隊列操作 // 創建客戶端存儲隊列實例 CloudQueueClient queueClient = cloudStorageAccount.CreateCloudQueueClient(); // 通過隊列名稱獲取服務端存儲隊列實例 // Endpoint "http://storageaccount.queue.core.windows.net/eric-queue-1". // 隊列名稱必須為小寫 CloudQueue cloudQueue = queueClient.GetQueueReference("eric-quque-1"); //也可以直接創建 //CloudQueue cloudQueue = new CloudQueue(new Uri("http://storageaccount.queue.core.windows.net/eric-queue-1"), new Microsoft.WindowsAzure.Storage.Auth.StorageCredentials(accountName, keyValue)); // 如果隊列不存在就創建一個 cloudQueue.CreateIfNotExists(); // 清除隊列,清除可視、不可視和過期的所有消息。 cloudQueue.Clear(); // 刪除隊列,這個隊列就不存在了 cloudQueue.Delete(); #endregion #region 隊列消息操作 // 發送消息,消息可以為字符串或者字節數組,最大為64K, TTL最大為7天,visibilityDelay必須小於TTL cloudQueue.AddMessage(new CloudQueueMessage("Hello world!"), new TimeSpan(0, 0, 10), new TimeSpan(0, 0, 1), null, null); // 獲取消息, 獲取從隊頭開始第一個可視的消息,就是nextVisibilityTimeout到了的消息 // 輸入的參數visibilityTimeout是這個消息下次可視的時間間隔 // 通過Get方式獲取的消息,能夠更新(update)和刪除(delete) CloudQueueMessage message = cloudQueue.GetMessage(new TimeSpan(0, 0, 10)); // 修改消息,修改消息的內容和下次可視時間間隔, 也可以只修改下次可視時間間隔 message.SetMessageContent("Hello Eric Wen!"); cloudQueue.UpdateMessage(message, new TimeSpan(0, 0, 10), MessageUpdateFields.Content | MessageUpdateFields.Visibility); cloudQueue.UpdateMessage(message, new TimeSpan(0, 0, 10), MessageUpdateFields.Visibility); // 刪除消息, 通過Get方式獲取的消息,它的Id和PopReceipt有值,有這兩個值才能修改和刪除消息 cloudQueue.DeleteMessage(message); cloudQueue.DeleteMessage(message.Id, message.PopReceipt); // 查看消息,只能查看可視的消息,獲取從隊頭開始第一個可視的消息。 // 查看消息不會改變CloudQueueMessage的DequeueCount和NextVisibleTime屬性 // 這個消息是只讀消息,不能更新和刪除操作 message = cloudQueue.PeekMessage(); // 獲取批量消息, 一次只能最多獲取32條消息 IEnumerable<CloudQueueMessage> query = cloudQueue.GetMessages(32); query = cloudQueue.PeekMessages(32); #endregion