Windows Azure Cloud Service (12) PaaS之Web Role, Worker Role, Azure Storage Queue(下)

简介:

  《Windows Azure Platform 系列文章目录

 

  本章DEMO部分源代码,请在这里下载。

 

  在上一章中,笔者介绍了我们可以使用Azure PaaS的Web Role和Worker Role来处理复杂的业务逻辑

  -Web Role可以快速响应前端的业务请求,并将输入保存到Azure Storage Queue中

  -Worker Role将数据从Queue中读取,可以在后端处理复杂的业务逻辑

  -可以看到,Azure Storage Queue是前端业务逻辑和后端业务处理的桥梁

  该架构图可以用下图表示:

  

  有关Azure Storage Queue的知识,可以参考Windows Azure Storage (1) Windows Azure Storage Service存储服务

   

 

  接下来,我们模拟一个场景:

  1.前端用户通过Web Role的Asp.NET页面,将输入框的内容增加到Azure Storage Queue中

  2.后端的Worker Role,通过WorkerRole.cs中的Run()函数,从Azure Storage Queue中拿到消息内容,进行输入。处理完毕后,将该消息删除。

 

 

  注意:本章内容中,Web Role只响应前端的页面请求。Worker Role在后端处理复杂的业务处理。

  Web Role和Worker Role是计算分离的(注意是计算分离,不是多线程)。

  因为Web Role和Worker Role是部署在不同的计算节点上。不会因为用户访问Web Role,造成CPU压力过高而影响Worker Role。

 

 

  以下是源代码讲解部分:

  1.首先,我们创建一个新的cloud project,重命名为AzureWorkerRole。图略:

 

  2.在项目文件中,添加Web Role和Worker Role。如下图:

  

  模板我们选择Web Form。图略。

 

 

  3.在WebRole1中,增加Default.aspx页面,添加TextBox和Button控件。增加以下代码:

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;

namespace WebRole1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            AddMessage(txbInput.Text.Trim());
            txbInput.Text = "";
        }
        /// <summary>
        /// 将消息加入到Azure Storage Queue
        /// </summary>
        /// <param name="inputMessage"></param>
        private void AddMessage(string inputMessage)
        {
            var account = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnection"));
            var queueClient = account.CreateCloudQueueClient();
            var queue = queueClient.GetQueueReference("taskqueue");

            queue.CreateIfNotExists();

            CloudQueueMessage message = new CloudQueueMessage(inputMessage);
            queue.AddMessage(message);
        }
    }
}
复制代码

  核心代码为queue.AddMessage()。将消息内容增加到Azure Storage Queue中。

 

 

  4.在WorkerRole.cs增加以下代码:

复制代码
  /// <summary>
        /// Editor: Lei Zhang
        /// Create Azure Storage Queue
        /// </summary>
        private void CreateAzureStorageQueue()
        {
            var account = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnection"));
            var queueClient = account.CreateCloudQueueClient();

            //Azure Storage Queue名称必须为小写
            var queue = queueClient.GetQueueReference("taskqueue");
            queue.CreateIfNotExists();
        }

        /// <summary>
        /// 从Azure Storage Queue中读取数据
        /// </summary>
        private void GetQueue()
        {
            var account = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnection"));
            var queueClient = account.CreateCloudQueueClient();

            //Azure Storage Queue名称必须为小写
            var queue = queueClient.GetQueueReference("taskqueue");
            queue.CreateIfNotExists();

            // dequeue the message and lock message in 30 seconds
            CloudQueueMessage retrievedMessage = queue.GetMessage(TimeSpan.FromSeconds(30));
            if (retrievedMessage == null) return;

            Trace.TraceInformation("Retrieved message with content '{0}'", retrievedMessage.AsString);

            // Async delete the message
            queue.DeleteMessage(retrievedMessage);
            Trace.TraceInformation("Deleted message");
        }
复制代码

  Worker Role的核心代码为上面的queue.GetMessage(TimeSpan.FromSeconds(30)) queue.DeleteMessage()。

  当有多个Worker Role的情况下,某个Worker Role Instance使用queue.GetMessage(TimeSpan.FromSeconds(30))读取到Queue Message的时候,默认会在这个消息上加一个锁,时间间隔为30秒。

  在30秒内,其他Worker Role Instance不会读取到这个Message,以防止Message被重复读取。

 

  Message被读取到并处理完毕后,记得用DeleteMessage删除该消息

  

  我们还可以通过以下API,批量读取20条消息(Queue Message),最多读取32个消息。同时将读取每一条消息的锁设置为5分钟

foreach (CloudQueueMessage message in queue.GetMessages(20, TimeSpan.FromMinutes(5)))
{
    // Process all messages in less than 5 minutes, deleting each message after processing.
    queue.DeleteMessage(message);
}

  

 

  5.最后我们在Web Role和Worker Role的Settings,增加相应的Azure Storage Connection String连接字符串。

  

 

 

  6.我们在本地,通过Visual Studio 2013运行程序。在Default.aspx页面中输入消息内容,如下:

  

 

 

  7.然后我们打开本地模拟器,可以看到Worker Role的输出。

  

  

 

  8.我们重复在Default.aspx页面中输入多个值。在本地模拟器,可以看到Worker Role的多个输出。

  

 

  

  9.我们可以在WorkerRole.cs的代码中,还可以异步处理其他复杂的业务逻辑,比如异步发送邮件,异步处理数据等等。

 


本文转自Lei Zhang博客园博客,原文链接:http://www.cnblogs.com/threestone/p/4201065.html,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
安全 Windows
【Azure Cloud Service】在Windows系统中抓取网络包 ( 不需要另外安全抓包工具)
通常,在生产环境中,为了保证系统环境的安全和纯粹,是不建议安装其它软件或排查工具(如果可以安装,也是需要走审批流程)。 本文将介绍一种,不用安装Wireshark / tcpdump 等工具,使用Windows系统自带的 netsh trace 命令来获取网络包的步骤
71 32
|
1月前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
44 11
|
4月前
|
Java 应用服务中间件 开发工具
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
|
4月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
4月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
4月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
4月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
4月前
|
存储 Linux Windows
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
166 3
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
182 45