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:

  1. //CloudStorageAccount 类表示一个 Azure Storage Account,我们需要先创建它的实例,才能访问属于它的资源。
  2. //注意连接字符串中的xxx和yyy,分别对应Access keys中的Storage account name 和 key。
  3. CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yyy");
  4.  
  5. //CloudQueueClient 类是 Windows Azure Queue Service 客户端的逻辑表示,我们需要使用它来配置和执行对 Queue Storage 的操作。
  6. CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
  7. //CloudQueue 表示一个 Queue 对象, 绝大多数的操作都是通过这个对象完成的。
  8. CloudQueue queue = queueClient.GetQueueReference("app2tasks");
  9. //如果不存在就创建名称为 "app2tasks" 的 Queue。
  10. queue.CreateIfNotExists();

执行上面的代码,然后在 Storage Explorer 中查看结果:

把消息插入 Queue

现实的应用场景中肯定有一个或多个程序产生 Message 并插入到 Queue 中,接下来我们看看用 C# 如何实现:

  1. string current = DateTime.Now.ToString();
  2. //把消息插入到队列中。
  3. CloudQueueMessage message = new CloudQueueMessage("Hello, World. -- " + current);
  4. queue.AddMessage(message);

调用几次上面的代码看看结果如何:

我通过三次调用向 Queue 中加入了三条消息,请注意插入它们的时间,分别是 11:33:45,11:33:57,和 11.34:16。在接下来的描述中我分别称它们为第一条消息、第二条消息和第三条消息。

查看 Queue 中的消息

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

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

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

查看 Queue 的长度

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

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

更新 Queue 中的消息

如果一条消息已经被添加到 Queue 中了,但是又需要更新其内容该怎么办?我们可以找到这条消息然后更新它的内容:

  1. CloudQueueMessage message = queue.GetMessage();
  2. // 执行 getmessage(), 队头的消息会变得不可见。
  3. message.SetMessageContent("Updated contents.");
  4. queue.UpdateMessage(message,
  5. TimeSpan.FromSeconds(60.0),
  6. MessageUpdateFields.Content | MessageUpdateFields.Visibility);
  7. // 更新完消息内容的60s 之后,该消息会重新可见,但是是在队尾。

执行上面的代码后,我们发现在 Storage Explorer 中”第一条消息”不见了。过了 60 秒之后它又重新出现在 Storage Explorer 中,但是它的内容已经变化,位置也成了队尾:

此时我们也只能通过 ID 认出它是之前的”第一条消息”,之前 “第二条消息”,”第三条消息”的位置也发生了相应的变化。

处理 Queue 中的消息

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

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

类似于下面的代码逻辑:

  1. // 执行 getmessage(), 队头的消息会变得不可见。
  2. CloudQueueMessage message = queue.GetMessage();
  3. try
  4. {
  5. //处理消息
  6.  
  7. // 如果在30s内你没有删除这条消息,它会重新出现在队尾。
  8. // 所以正确处理一条消息的过程是,处理完成后,删除这条消息
  9. queue.DeleteMessage(message);
  10. }
  11. catch //(消息处理异常)
  12. { }

删除 Queue 中的消息

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

总结

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

相关阅读:

最全的Windows Azure学习教程汇总

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

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

Azure Table storage 基本用法 -- Azure Storage 之 Table

Azure Queue Storage 基本用法 -- Azure Storage 之 Queue的更多相关文章

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

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Blob Storage 基 ...

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

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...

  3. Azure Table storage 基本用法 -- Azure Storage 之 Table

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

  4. 使用Azure Runbook 发送消息到Azure Storage Queue

    客户需要定时发送信息到Azure Storage Queue,所以尝试使用Azure Runbook实现这个需求. 首先新增一个Azure Automation Account的资源. 因为要使用Az ...

  5. [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 ...

  6. Windows Azure Storage (6) Windows Azure Storage之Table

    <Windows Azure Platform 系列文章目录> 最近想了想,还是有必要把Windows Azure Table Storage 给说清楚. 1.概念 Windows Azu ...

  7. [New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传

    <Windows Azure Platform 系列文章目录> 相关内容 Windows Azure Platform (二十二) Windows Azure Storage Servic ...

  8. Windows Azure Storage (20) 使用Azure File实现共享文件夹

    <Windows Azure Platform 系列文章目录> Update 2016-4-14.在Azure VM配置FTP和IIS,请参考: http://blogs.iis.net/ ...

  9. Windows Azure Storage (24) 启用Azure Blob日志

    <Windows Azure Platform 系列文章目录> 之前有一个业务需求,客户想知道Azure Storage是否有日志功能,可以检查某个Azure Blob文件在某个时间点被删 ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

    一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...

  2. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  3. C语言 · 查找整数 · 基础练习

    问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个. 输入格式 第一行包含一个整数n. 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000. 第三行包含一个 ...

  4. 转:serialVersionUID作用

    汗,以前学了还忘了... Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本 ...

  5. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  6. 谈谈一些有趣的CSS题目(十)-- 结构性伪类选择器

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  7. Openfiler配置RAC共享存储

    将 Openfiler 用作 iSCSI 存储服务器,主要操作步骤如下: 1.设置 iSCSI 服务 2.配置网络访问 3.指定物理存储器并对其分区 4.创建新的卷组 5.创建所有逻辑卷 6.为每个逻 ...

  8. Hibernate中事务的隔离级别设置

    Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下

  9. YII 2.x 模板文件的 beginBlock、beginContent、beginCache

    echo '-----------beginBlock--------------------- <br />'; $this->beginBlock('block1', false ...

  10. 鱼眼模式(Fisheye projection)的软件实现

    简单实现 鱼眼模式(Fisheye)和普通的透视投影(Perspective projection),一个很大的区别就是鱼眼的投影算法是非线性的(non-linear),实际照相机的情况是在镜头外面包 ...