Azure Queue Storage 基本用法 -- Azure Storage 之 Queue
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 典型的应用场景:
- 创建未处理任务的队列,以便异步的处理这些任务。
- 把消息从 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 中的消息呢?我们的程序大体应该遵循下面的逻辑:
- 使用 GetMessage 方法取出队头的消息,此时该消息会在 Queue 中30秒不可见(这个时常用户是可以设置的,默认是 30 秒);
- 处理消息;
- 正常处理完成后,调用 Delete 方法删除消息;
- 如果没有正常处理消息 (没有调用 Delete 方法),此消息会在30秒后重新出现在队尾。
类似于下面的代码逻辑:
- // 执行 getmessage(), 队头的消息会变得不可见。
- CloudQueueMessage message = queue.GetMessage();
- try
- {
- //处理消息
- // 如果在30s内你没有删除这条消息,它会重新出现在队尾。
- // 所以正确处理一条消息的过程是,处理完成后,删除这条消息
- queue.DeleteMessage(message);
- }
- catch //(消息处理异常)
- { }
删除 Queue 中的消息
除了正常处理完消息后把消息从队列中删除,我们也可以找到一条消息,直接删除它,本质上和处理完再删除是一样的。
总结
Queue Storage 为应用之间的解耦提供了很好的解决方式,使得消息的产生者和消息的处理者可以互相不知道彼此的存在。为我们处理这类问题添加了一个有力的工具。
相关阅读:
Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
Azure File Storage 基本用法 -- Azure Storage 之 File
Azure Table storage 基本用法 -- Azure Storage 之 Table
Azure Queue Storage 基本用法 -- Azure Storage 之 Queue的更多相关文章
- Azure File Storage 基本用法 -- Azure Storage 之 File
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Blob Storage 基 ...
- Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...
- Azure Table storage 基本用法 -- Azure Storage 之 Table
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table,其中的 Table 就是本文的主角 Azure Tabl ...
- 使用Azure Runbook 发送消息到Azure Storage Queue
客户需要定时发送信息到Azure Storage Queue,所以尝试使用Azure Runbook实现这个需求. 首先新增一个Azure Automation Account的资源. 因为要使用Az ...
- [Windows Azure] How to use the Table Storage Service
How to use the Table Storage Service version 1.7 version 2.0 This guide will show you how to perform ...
- Windows Azure Storage (6) Windows Azure Storage之Table
<Windows Azure Platform 系列文章目录> 最近想了想,还是有必要把Windows Azure Table Storage 给说清楚. 1.概念 Windows Azu ...
- [New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传
<Windows Azure Platform 系列文章目录> 相关内容 Windows Azure Platform (二十二) Windows Azure Storage Servic ...
- Windows Azure Storage (20) 使用Azure File实现共享文件夹
<Windows Azure Platform 系列文章目录> Update 2016-4-14.在Azure VM配置FTP和IIS,请参考: http://blogs.iis.net/ ...
- Windows Azure Storage (24) 启用Azure Blob日志
<Windows Azure Platform 系列文章目录> 之前有一个业务需求,客户想知道Azure Storage是否有日志功能,可以检查某个Azure Blob文件在某个时间点被删 ...
随机推荐
- 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域
一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
- C语言 · 查找整数 · 基础练习
问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个. 输入格式 第一行包含一个整数n. 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000. 第三行包含一个 ...
- 转:serialVersionUID作用
汗,以前学了还忘了... Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本 ...
- JavaScript常见的五种数组去重的方式
▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...
- 谈谈一些有趣的CSS题目(十)-- 结构性伪类选择器
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- Openfiler配置RAC共享存储
将 Openfiler 用作 iSCSI 存储服务器,主要操作步骤如下: 1.设置 iSCSI 服务 2.配置网络访问 3.指定物理存储器并对其分区 4.创建新的卷组 5.创建所有逻辑卷 6.为每个逻 ...
- Hibernate中事务的隔离级别设置
Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下
- YII 2.x 模板文件的 beginBlock、beginContent、beginCache
echo '-----------beginBlock--------------------- <br />'; $this->beginBlock('block1', false ...
- 鱼眼模式(Fisheye projection)的软件实现
简单实现 鱼眼模式(Fisheye)和普通的透视投影(Perspective projection),一个很大的区别就是鱼眼的投影算法是非线性的(non-linear),实际照相机的情况是在镜头外面包 ...