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

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

相關文章
相關標籤/搜索