《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的代碼中,還能夠異步處理其餘複雜的業務邏輯,好比異步發送郵件,異步處理數據等等。