Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table。html
笔者在《Azure File Storage 基本用法》中介绍了 File Storage 的基本用法,本文将介绍 Queue Storage 的主要使用方法。web
文章来源:葡萄城产品技术社区windows
Azure Queue Storage 是一个存储大量消息的存储服务,这些消息能够在任何地方经过 HTTP/HTTPS 访问。每条消息最大 64K,消息的数据量几乎不受限制 (除非超出了您的 Storage Account 的总容量) 。app
下面是 Queue Storage 典型的应用场景:异步
下图描述了 Queue Storage 的基本组织结构:工具
Storage Account 是用来管理 Azure Storage 的一个命名空间,主要用来控制存储数据的访问权限和计费。对 Blob、Queue、File 和 Table 这些 Azure 提供的存储服务的访问控制,都是经过 Storage Account 来进行的,因此要想使用 Queue Storage,须要先建立你的 Storage Account。spa
每一个 Queue 都是一组消息的集合,每一条消息都必须属于一个 Queue,Queue 名称中的字符必须是小写。.net
每条 Message 的最大长度为 64KB,Message 在 Queue 中停留的最长时间为 7 天。orm
Queue 的 URL 地址格式为:cdn
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。
咱们先来建立一个名为“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 中查看结果:
现实的应用场景中确定有一个或多个程序产生 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。在接下来的描述中我分别称它们为第一条消息、第二条消息和第三条消息。
既然是队列,确定有队头和队尾,消息从队头出队,从队尾入队。那么能不能查看一下队头(也就是下一条要处理的消息,此处只是查看并非要处理)的消息呢?固然能够:
//老是取到队头的消息,没有消息出队。 //消息在队列中的位置、可见状态也没有发生变化。 CloudQueueMessage peekedMessage = queue.PeekMessage();
PeekMessage 方法老是取处处于队头位置的那条消息,而且不改变队列的状态!
常常的查看 Queue 的长度是个不错的注意,由于你须要避免一些因为 Queue 过长带来的问题:
//获取 Queue 的属性。 queue.FetchAttributes(); int cachedMessageCount = queue.ApproximateMessageCount;
若是一条消息已经被添加到 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 中的消息呢?咱们的程序大致应该遵循下面的逻辑:
相似于下面的代码逻辑:
// 执行 getmessage(), 队头的消息会变得不可见。 CloudQueueMessage message = queue.GetMessage(); try { //处理消息 // 若是在30s内你没有删除这条消息,它会从新出如今队尾。 // 因此正确处理一条消息的过程是,处理完成后,删除这条消息 queue.DeleteMessage(message); } catch //(消息处理异常) { }
除了正常处理完消息后把消息从队列中删除,咱们也能够找到一条消息,直接删除它,本质上和处理完再删除是同样的。
Queue Storage 为应用之间的解耦提供了很好的解决方式,使得消息的产生者和消息的处理者能够互相不知道彼此的存在。为咱们处理这类问题添加了一个有力的工具。