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

來源:互聯網
上載者:User

標籤:

  《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(下)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.