什么是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