《Windows Azure Platform 系列文章目录》html
本章DEMO部分源代码,请在这里下载。前端
在上一章中,笔者介绍了咱们能够使用Azure PaaS的Web Role和Worker Role来处理复杂的业务逻辑后端
-Web Role能够快速响应前端的业务请求,并将输入保存到Azure Storage Queue中多线程
-Worker Role将数据从Queue中读取,能够在后端处理复杂的业务逻辑架构
-能够看到,Azure Storage Queue是前端业务逻辑和后端业务处理的桥梁less
该架构图能够用下图表示:异步
有关Azure Storage Queue的知识,能够参考Windows Azure Storage (1) Windows Azure Storage Service存储服务函数
接下来,咱们模拟一个场景:post
1.前端用户经过Web Role的Asp.NET页面,将输入框的内容增长到Azure Storage Queue中url
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的代码中,还能够异步处理其余复杂的业务逻辑,好比异步发送邮件,异步处理数据等等。