分享

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

yuwenge 发表于 2013-12-8 08:28:00 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 16708

本文将会介绍如何使用Queue Storage。Queue Storage提供给我们一个云端的队列。我们可以用Queue Storage来进行进程间的相互通信(包括运行在不同机器上的进程之间的通信)。
首先给大家介绍什么是队列存储
一、什么是Windows Azure Queue Storage 队列存储
Windows Azure Queue Storage存储大量的信息,可以在世界任何地方通过验证的调用,使用HTTP或HTTPS访问的服务。一个单一的队列信息可高达64KB的大小,队列可以包含数百万条消息,每个存储帐户(storage account)限制的总容量高达100TB。队列存储的常见用途包括:

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


二、使用Queue Storage一个使用Queue Storage经典的场景是,在一个Web应用程序中,用户通过表单递交给服务器数据,服务器收到数据后将进行处理,而这一处理将花费很多时间。这种情况下,服务器端通过Queue Storage可以把用户递交的信息存储在队列中,后台再运行一个程序从队列中取得数据进行信息的处理。

以往如果程序时运行在Windows操作系统上,那么我们可以使用MSMQ来做类似的工作。而Queue Storage的出现为我们提供了另一种选择。特别是在非Windows操作系统上,我们依然可以使用Queue Storage的REST API来很方便地使用它。

有关Queue Storage REST API的详细信息,请参见Queue 服务 API。

为了方便.NET开发人员,我们在SDK中提供了Microsoft.WindowsAzure.StorageClient类来帮助发送REST请求。

在开始本教学之前,请确保你从Windows Azure 平台下载下载并安装了最新的Windows Azure开发工具。本教学使用Visual Studio 2010作为开发工具。

步骤一:创建解决方案和项目
由于我们要在本地模拟环境下测试Queue Storage,首先,请确保Storage Emulator已经启动。我们可以找到管理器的进程手动启动或者让Visual Studio 2010帮助我们启动他。

右击工具栏中Windows Azure模拟器的图标,选择”Show Storage Emulator UI”。弹出如下图所示的窗口:





1.png 我们要关注的是Service management中Queue所在的一行。要确保Status为Running。


确认完毕后启动Visual Studio 2010,并且新建两个Console项目。我们将演示如何在一个Console程序中往Queue Storage中添加信息然后另外一个Console程序如何读取并处理信息。

步骤二:添加SDK程序集引用
请在项目属性页里确认项目的Target framework的值是.NET Framework 4或.NET Framework 3.5。然后在两个Console项目中均添加C:\Program Files\Windows Azure SDK\v1.3\ref\Microsoft.WindowsAzure.StorageClient.dll的引用。该路径为SDK默认安装路径,如果你不能在这个路径中找到Microsoft.WindowsAzure.StorageClient.dll请从SDK安装路径中寻找。

步骤三:添加代码
首先在两个项目中的Program.cs中均引用命名空间:

using System.Threading;

using Microsoft.WindowsAzure;

using Microsoft.WindowsAzure.StorageClient;



然后在其中一个项目(为了叙述方便,后面称之为Client项目)的Main方法中加入如下代码,我们将用它来向Queue Storage中添加信息。



static void Main(string[] args)

{

    var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;

    var queueStorage = storageAccount.CreateCloudQueueClient();



    // 检查名为helloworldqueue的队列是否被创建,如果没有,创建它

    var queue = queueStorage.GetQueueReference("helloworldqueue");

    queue.CreateIfNotExist();



    Console.WriteLine("Client is running...");



    while (true)

    {

        // 插入数据到队列中

        queue.AddMessage(new CloudQueueMessage(string.Format("client sent information: {0}", DateTime.UtcNow.ToString())));



        // 每次插入数据后线程休息3秒

        Thread.Sleep(3000);

    }

}



接着在另外一个项目(为了叙述方便,后面称之为Server项目)的Main方法中加入如下代码,我们将用它来从Queue Storage中读取信息和进行处理。



static void Main(string[] args)

{

    var storageAccount = CloudStorageAccount.DevelopmentStorageAccount;

    var queueStorage = storageAccount.CreateCloudQueueClient();



    // 检查名为helloworldqueue的队列是否被创建,如果没有,创建它

    var queue = queueStorage.GetQueueReference("helloworldqueue");

    queue.CreateIfNotExist();



    Console.WriteLine("Server is running...");



    while (true)

    {

        // 从队列中读取一条信息

        // 收到信息后可以根据收到的信息做处理,为了演示方便我们这里只是把信息显示出来

        // 在云端发送消息后这条消息将对于后续的请求不可见,但是并未被删除。我们需要显示删除它。

        // 否则在一段时间后该消息将重新可见。这一设计的好处是确保了所有消息都能够被处理。

        // 如果程序在收到消息后处理消息前就异常终止了那么数据依然在一段时间后可以被重新处理。

        // 详情请参考MSDN文档

        var message = queue.GetMessage();



        if (message != null)

        {

            Console.WriteLine(string.Format("Message retrieved: {0}", message.AsString));



            // 处理完数据后必须显示删除消息

            queue.DeleteMessage(message);

        }



        // 每次读取数据后线程休息3秒

        Thread.Sleep(3000);

    }

}



步骤四:观察并分析代码
步骤三中的代码中,首先我们通过CloudStorageAccount.DevelopmentStorageAccount来说明我们使用的本地的Development Storage自带账户而不是真正的云端存储服务账户。(如果要用真实账户可以使用

// DefaultEndpointsProtocol=https可以改成DefaultEndpointsProtocol=http表示用HTTP而不是HTTPS

CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=[用户名];AccountKey=[密码]");



来实例化对象)然后通过该账户类来实例化一个Queue客户端类。这两步是使用SDK中StorageClient程序集来调用Queue Storage服务的必要步骤。



Client项目中的代码相对简单。大约每隔3秒向Queue Storage中插入一条数据。Server端的项目中我们则大约每隔3秒从Queue Storage中读取一条数据。处理完毕后将之删除。对于为什么必须在读取后显示删除的问题请参考注释部分。



步骤五:运行程序
先运行Client程序然后运行Server个程序。如果一切正常,你将会看到Server项目的Console程序输出收到的消息: 2.png



注意由于是本地模拟,Client和Server程序需要要在同一台机器上运行。但是如果使用真实账户的话,Client和Server程序就可以跨越机器进行通信了。

三、队列服务包含以下组件
3.png
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可以到云管理平台查询到

4.png
连接窜组成格式如下:
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>


没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条