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());
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(, TimeSpan.FromMinutes()))
{
// 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的代码中,还可以异步处理其他复杂的业务逻辑,比如异步发送邮件,异步处理数据等等。
Windows Azure Cloud Service (12) PaaS之Web Role, Worker Role, Azure Storage Queue(下)的更多相关文章
- Windows Azure Cloud Service (11) PaaS之Web Role, Worker Role(上)
<Windows Azure Platform 系列文章目录> 本文是对Windows Azure Platform (六) Windows Azure应用程序运行环境内容的补充. 我们知 ...
- 在Azure Cloud Service中部署Java Web App(1)
Microsoft Azure是一个开放的,灵活的云平台,除了对自家的.Net平台有良好的支持外,对于各种开源的软件,语言,工具,框架都有着良好的支持,比如Java,Php,Python等等,你可以使 ...
- 在Azure Cloud Service中部署Java Web App(2)
接上文. 9.在进行发布之前,需要对我们的订阅做一些设置,因为默认情况下,Azure的service end指向的是Azure global的站点,如果我们要将服务发布在Azure的中国站点,需要做下 ...
- Windows Azure Cloud Service (43) 使用Azure In-Role Cache缓存(2)Dedicated Role
<Windows Azure Platform 系列文章目录> Update 2016-01-12 https://azure.microsoft.com/zh-cn/documentat ...
- Windows Azure Cloud Service (39) 如何将现有Web应用迁移到Azure PaaS平台
<Windows Azure Platform 系列文章目录> 本文将简单介绍,如何将企业内现有的ASP.NET应用程序迁移到Azure PaaS平台. 因为在迁移过程中,可能需要对现有的 ...
- Windows Azure Cloud Service (38) 微软IaaS与PaaS比较
<Windows Azure Platform 系列文章目录> 最近一直想总结Azure IaaS和PaaS的区别与比较,写个博文详细说明一下.建议读者在阅读之前,先熟悉微软PaaS和Ia ...
- Windows Azure Cloud Service (36) 在Azure Cloud Service配置SSL证书
<Windows Azure Platform 系列文章目录> 在某些时候,我们需要在Azure PaaS Cloud Service配置HTTPS连接.本章将介绍如何在本地创建证书,然后 ...
- Windows Azure Cloud Service (42) 使用Azure In-Role Cache缓存(1)Co-located Role
<Windows Azure Platform 系列文章目录> Update 2016-01-12 https://azure.microsoft.com/zh-cn/documentat ...
- Windows Azure Cloud Service (44) 将Cloud Service加入Virtual Network Subnet,并固定Virtual IP Address(VIP)
<Windows Azure Platform 系列文章目录> 在之前的文章中,笔者已经详细介绍了如何将Virtual Machine加入Virtual Network,并且绑定固定的Pr ...
随机推荐
- Java开发视频网站大概需要多少钱?
这个还真不好说,需要看你对视频网站有什么要求?你的数据库选择的是什么型号的?需要开发几个页面?服务器是需要高端的还是中低端的?还有你对完成时间有什么要求,这些细节也是决定价格的关键因素. 上面这些因素 ...
- angularjs http 请求拦截器
/** * Created by oy on 2016/11/29. */ (function() { 'use strict'; // 创建angular模块 angular .module('ap ...
- Java IO5:字符流
字符流 字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,因为上一篇文章写了,一个Unicod ...
- 在英文版操作系统中安装的MS SQL server,中文字段无法匹配
在英文版的操作系统中安装的MS SQL server,会出现中文字段无法被匹配到.其原因在于英文环境下安装的MS SQL server的排序规则不包括中文. 所以解决办法就是更改MS SQL serv ...
- 新手的第一个phonegap Android应用
对PhoneGap开发感兴趣的请加入群 PhoneGap App开发 348192525 手机成为现在软件应用必不可少的一种设备,然而手机平台的不统一造成我们需要为不同手机重写代码,这对一般应用来 ...
- .net开发笔记(十六) 对前部分文章的一些补充和总结
补充有两个: 一个是系列(五)中讲到的事件编程(网址链接),该文提及到了事件编程的几种方式以及容易引起的一些异常,本文补充“多线程事件编程”这一块. 第二个是前三篇博客中提及到的“泵”结构在编程中的应 ...
- 基于百度翻译API开发属于自己的翻译工具
你是否每天使用着网页翻译工具?你是否遇到过这种情况,上网过程中遇到一个很长的单词但是又不能复制,要开两个浏览器,一个打开百度翻译,照着另一个网页输入单词?你安装了各种翻译软件后,又删除,只因忍受不了那 ...
- 用手机访问本地环境的利器ngrok
我们在调试移动端页面,尤其是调试微信页面的时候,会遇到这样的情况,手机连着公司的wifi,开发环境(台式机)插着公司的网线,我们要用手机来访问开发环境下的页面.这个时候,如果网线和wifi是在同一个网 ...
- SVM-线性可分支持向量机
SVM-线性可分支持向量机 如果您想体验更好的阅读:请戳这里littlefish.top 函数间隔和几何间隔 给定线性可分训练数据集,通过间隔最大化或等价地求解相应的凸二次规划问题学习得到的分离超平面 ...
- 让gcc支持成员函数模板的trick
让gcc支持成员函数模板的trick 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议 gcc 4.7.3 不支持成员 ...