怎么使用Windows Azure Queue Storage 服务

什么是Windows Azure Queue Storage 队列存储

Windows Azure Queue Storage存储大量的信息,可以在世界任何地方通过验证的调用,使用HTTP或HTTPS访问的服务。一个单一的队列信息可高达64KB的大小,队列可以包含数百万条消息,每个存储帐户(storage account)限制的总容量高达100TB。队列存储的常见用途包括:

  • 创建异步处理积压的工作
  • 从Windows Azure的Web角色的消息传递到Windows Azure Worker角色

基本概念

队列服务包含以下组件:

Queue1

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可以到云管理平台查询到

image

连接窜组成格式如下:

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

 

posted @ 2012-12-24 16:34  EricWen  阅读(3391)  评论(0编辑  收藏  举报