標籤:
《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,造成CPU壓力過高而影響Worker Role。因為Web Role和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的時候,預設會在這個訊息上加一個鎖。
其他Worker Role Instance不會讀取到這個Message,以防止Message被重複讀取。
我們還可以通過以下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的代碼中,還可以非同步處理其他複雜的商務邏輯,比如非同步發送郵件,非同步處理資料等等。
Windows Azure Cloud Service (12) PaaS之Web Role, Worker Role, Azure Storage Queue(下)