文档章节

Azure Queue Storage 基本用法 -- Azure Storage 之 Queue

葡萄城控件技术团队
 葡萄城控件技术团队
发布于 2016/11/01 11:50
字数 1592
阅读 154
收藏 1
点赞 0
评论 1

Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table。

笔者在《Azure File Storage 基本用法》中介绍了 File Storage 的基本用法,本文将介绍 Queue Storage 的主要使用方法。

文章来源:葡萄城产品技术社区

Queue Storage 是什么?

Azure Queue Storage 是一个存储大量消息的存储服务,这些消息可以在任何地方通过 HTTP/HTTPS 访问。每条消息最大 64K,消息的数据量几乎不受限制 (除非超出了您的 Storage Account 的总容量) 。

下面是 Queue Storage 典型的应用场景:

  1. 创建未处理任务的队列,以便异步的处理这些任务。
  2. 把消息从 web role 传递给 worker role 进行处理。

Azure Queue Storage 的结构

下图描述了 Queue Storage 的基本组织结构:

  • Azure Storage Account:

Storage Account 是用来管理 Azure Storage 的一个命名空间,主要用来控制存储数据的访问权限和计费。对 Blob、Queue、File 和 Table 这些 Azure 提供的存储服务的访问控制,都是通过 Storage Account 来进行的,所以要想使用 Queue Storage,需要先创建你的 Storage Account。

  • Queue:

每个 Queue 都是一组消息的集合,每一条消息都必须属于一个 Queue,Queue 名称中的字符必须是小写。

  • Message:

每条 Message 的最大长度为 64KB,Message 在 Queue 中停留的最长时间为 7 天。

  • URL format:

Queue 的 URL 地址格式为:

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。

创建 Queue

我们先来创建一个名为“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 中查看结果:

把消息插入 Queue

现实的应用场景中肯定有一个或多个程序产生 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。在接下来的描述中我分别称它们为第一条消息、第二条消息和第三条消息。

查看 Queue 中的消息

既然是队列,肯定有队头和队尾,消息从队头出队,从队尾入队。那么能不能查看一下队头(也就是下一条要处理的消息,此处只是查看并不是要处理)的消息呢?当然可以:

//总是取到队头的消息,没有消息出队。
//消息在队列中的位置、可见状态也没有发生变化。 
CloudQueueMessage peekedMessage = queue.PeekMessage();

PeekMessage 方法总是取到处于队头位置的那条消息,并且不改变队列的状态!

查看 Queue 的长度

经常的查看 Queue 的长度是个不错的注意,因为你需要避免一些由于 Queue 过长带来的问题:

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

更新 Queue 中的消息

如果一条消息已经被添加到 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 中的消息

如何处理 Queue 中的消息呢?我们的程序大体应该遵循下面的逻辑:

  1. 使用 GetMessage 方法取出队头的消息,此时该消息会在 Queue 中30秒不可见(这个时常用户是可以设置的,默认是 30 秒);
  2. 处理消息;
  3. 正常处理完成后,调用 Delete 方法删除消息;
  4. 如果没有正常处理消息 (没有调用 Delete 方法),此消息会在30秒后重新出现在队尾。

类似于下面的代码逻辑:

// 执行 getmessage(), 队头的消息会变得不可见。
CloudQueueMessage message = queue.GetMessage();
try
{
    //处理消息

    // 如果在30s内你没有删除这条消息,它会重新出现在队尾。
    // 所以正确处理一条消息的过程是,处理完成后,删除这条消息
    queue.DeleteMessage(message);
}
catch //(消息处理异常)
{ }

删除 Queue 中的消息

除了正常处理完消息后把消息从队列中删除,我们也可以找到一条消息,直接删除它,本质上和处理完再删除是一样的。

总结

Queue Storage 为应用之间的解耦提供了很好的解决方式,使得消息的产生者和消息的处理者可以互相不知道彼此的存在。为我们处理这类问题添加了一个有力的工具。

© 著作权归作者所有

共有 人打赏支持
葡萄城控件技术团队

葡萄城控件技术团队

粉丝 321
博文 487
码字总数 694630
作品 13
西安
高级程序员
加载中

评论(1)

热爱生活v
热爱生活v
不错
最全的Windows Azure学习教程汇总

转载: http://blog.csdn.net/powertoolsteam/article/details/53082470 目录(?)[-] 一 Windows Azure 平台简介 二Windows Azure入门教学系列 三Azure学习笔记 四Azure Storage 基本用法介绍......

chenhao_asd ⋅ 2017/02/26 ⋅ 0

最全的Windows Azure学习教程汇总

Windows Azure 是微软基于云计算的操作系统,能够为开发者提供一个平台,帮助开发可运行在云服务器、数据中心、Web 和 PC 上的应用程序。 Azure 是一种灵活和支持互操作的平台,能够将处于云...

葡萄城控件技术团队 ⋅ 2016/11/08 ⋅ 0

Azure File Storage 基本用法 -- Azure Storage 之 File

Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table。 笔者在《Azure Blob Storage 基本用法》中介绍了 Blob Storage 的基本用法,本文...

葡萄城控件技术团队 ⋅ 2016/10/25 ⋅ 0

Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table。 笔者在《Azure Table storage 基本用法》一文中,介绍了 Table Storage 的基本用...

葡萄城控件技术团队 ⋅ 2016/10/18 ⋅ 1

Azure Table storage 基本用法

Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table,其中的 Table 就是本文的主角 Azure Table storage。 Azure Table storage 是一个...

葡萄城控件技术团队 ⋅ 2016/08/24 ⋅ 0

【Azure Services Platform Step by Step-第11篇】Windows Azure兰州拉面馆-日志与队列的使用

在第9篇里,为了便于大家理解,我把Windows Azure的环境比喻成了"Azure兰州拉面馆"。本篇我们继续沿用这个比喻,讲讲Windows Azure中的队列(Queue Storage)与日志的使用。 Queue Storage在【...

技术小阿哥 ⋅ 2017/11/26 ⋅ 0

Windows Azure入门教学系列 (五):使用Queue Storage

公告 :本博客为微软云计算中文博客 的镜像博客。 部分文章因为博客兼容性问题 ,会影响阅读体验 。如遇此情况,请访问 原博客 。 本文是 Windows Azure 入门教学 的第五篇文章。 本文将会介...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

现在可用:跨地域备份和Windows Azure 存储的Blob、Table 和 Queue的新特性

在BUILD Day的两个主旨发言中,我们宣布跨地域备份和新版本的REST API的发布,使得Windows Azure Blobs、Tables 和 Queues的功能得到改善。现在我们正在对两个数据中心所有的Windows Azure B...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

通过构建Storage Explorer 应用学习Windows Azure Storage APIs

公告 :本博客为微软云计算中文博客 的镜像博客。 部分文章因为博客兼容性问题 ,会影响阅读体验 。如遇此情况,请访问 原博客 。 通过构建 Storage Explorer 应用学习Windows Azure Storage...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

Windows Azure入门教学系列 全面更新啦!

因为Windows Azure新版SDK的发布以及开发者门户的改版,Windows Azure入门教学系列 已经全面更新啦。 目录: Windows Azure入门教学系列 (九):Windows Azure 诊断功能 Windows Azure入门教学...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部