在第9篇裡,為了便於大家理解,我把Windows Azure的環境比喻成了"Azure蘭州拉麵館"。本篇我們繼續沿用這個比喻,講講Windows Azure中的隊列(Queue Storage)與日誌的使用。
Queue Storage在【Azure Services Platform Step by Step-第9篇】Windows Azure Storage概覽裡介紹過,這裡就不再重複了。顧名思義,Queue就是隊列,按照先進先出的順序來處理資料。在的“Azure蘭州拉麵館”中,Queue就充當了記錄點菜情況的小本子,前台服務員將顧客點的菜記錄在Queue中,後台廚房的廚師則按照Queue中的順序,一個一個地做菜(處理資料)。
Windows Azure Log是整個Azure平台運行情況的日誌。微軟官方把Windows Azure比喻成“雲平台的作業系統”,既然是作業系統,當然會維護日誌了!Windows Azure裡提供了非常簡單記錄日誌的辦法,但很遺憾地是沒有提供同樣簡單地查看日誌的辦法——換句話說,通過程式記錄日誌容易,查看日誌繁瑣。為了不偏題,本篇只展示如何在Development Fabric裡查看日誌。對於如何編程讀取日誌,感興趣的讀者可以參考WPF應用程式AzureLogViewer的原始碼(見篇末附件)。
實驗步驟:
第一步:
在VS2008中建立Web And Worker Cloud Service。這也是本系列文章中第一次用到Worker Role。
與第9篇一樣,添加對StorageClient的引用。
第二步:
運行Azure SDK裡的 和 ,並啟動Development Storage裡的Queue服務。
第三步:
配置好ServiceConfiguration.cscfg和ServiceDefinition.csdef。如有疑問,請參考【Azure Services Platform Step by Step-第8篇】開發部署Azure留言板或本文篇末附件內的範例程式碼。
第四步:
開啟Web Role項目的Default.aspx,拖入以下控制項:
TextBox txtMessage
Button btnSend
TextBox txtLog
第五步:
在Button btnSend的Click中加入btnSend_Click。代碼如下。
protected void btnSend_Click(object sender, EventArgs e){//讀取Queue服務的配置。注意:RoleManager.GetConfigurationSetting擷取的是
//service configuration(即ServiceConfiguration.cscfg檔案)裡的配置。Uri baseUri = new Uri(RoleManager.GetConfigurationSetting("QueueEndpoint"));string accountName = RoleManager.GetConfigurationSetting("AccountName");string accountKey = RoleManager.GetConfigurationSetting("AccountSharedKey");//初始化StorageAccountInfo實體。StorageAccountInfo account = new StorageAccountInfo(baseUri,null,accountName,accountKey);//建立一個QueueStorage(即Queue Storage服務)的實體QueueStorage service = QueueStorage.Create(account);//建立一個MessageQueue(即隊列)的實體。//這個queue就是咱們Azure拉麵館的“記菜本”了//我們把這個記菜本取名為"message"。MessageQueue queue = service.GetQueue("messages");//判斷當前Queue Storage服務中是否已經存在"message"if (!queue.DoesQueueExist()){queue.CreateQueue();}//把點菜資訊記錄到記菜本中!Message msg = new Message(txtMessage.Text);queue.PutMessage(msg);txtLog.Text += "\n你在"+DateTime.Now.ToString("HH點mm分ss秒")+"點了一份\"" + txtMessage.Text.Trim()+'\"';txtMessage.Text = string.Empty;}
最關鍵的就是一步:queue.PutMessage(msg); 就這樣很輕鬆地把訊息存入隊列了。
第六步:
開啟WorkerRole項目裡的WorkerRole.cs。我們首先要對Start()進行override 。
Start()函數可以理解為Worker Role的入口函數。一旦Worker Role被部署,就會觸發Start()。
我們討論過,Worker Role的牛X之處就是可以讓一段程式一直在運行。如何做到呢?只需把Start()方法寫成一個死迴圈方法就好了。
public override void Start(){// 初始化賬戶資訊Uri baseUri = new Uri(RoleManager.GetConfigurationSetting("QueueEndpoint"));string accountName = RoleManager.GetConfigurationSetting("AccountName");string accountKey = RoleManager.GetConfigurationSetting("AccountSharedKey");StorageAccountInfo account = new StorageAccountInfo(baseUri,null,accountName,accountKey); QueueStorage service = QueueStorage.Create(account);
// 取得對這個名叫"message"的記菜本Queue的引用MessageQueue queue = service.GetQueue("messages");// 構造死迴圈
while (true){
// 死迴圈中的程式每一秒執行一次
Thread.Sleep(10000);if (queue.DoesQueueExist()){
// 取得記菜本中的當前應該處理的訊息
Message msg = queue.GetMessage();if (msg != null){
// 記錄Windows Azure Log
RoleManager.WriteToLog("Critical",string.Format("大廚已經在{0}把{1} 做好了。",DateTime.Now.ToString("HH點mm分ss秒"), msg.ContentAsString()));
// 記錄刪除剛才已經處理的那條訊息
queue.DeleteMessage(msg);}}}}
這段程式中,值得注意的有三處:
- 擷取當前應該處理的資料:Message msg = queue.GetMessage(); 既然是隊列,就必須按照先進先出的順序來操作資料。使用者也只能通過GetMessage方法取得隊列中最靠前的那條資料,不能取到其他資料。就像是排隊買火車票,售票員只能賣給排到隊伍最靠前的那個人。
- 刪除訊息:queue.DeleteMessage(msg); 這又像是排隊買火車票,當排在最前面的那位仁兄買到票後,他應該馬上從隊伍中消失。
- RoleManager.WriteToLog(string eventLogName,string message)方法。
這就是上文提到的,非常簡單好用的記錄日誌的方法。用過log4net的程式員一看就明白,這簡直是一個“山寨版”的log4net。它借鑒了log4net記錄日誌的模式,又閹割了log4net的配置和自訂格式功能。
Azure Log支援的EventLog類型共有Critical,Error,Warning,Information,Verbose這5種。如果你沒用過log4net或不明白EventLog類型的意思,可以嘗試這樣理解:Azure Log把日誌分為5類;分類記錄日誌更加便於查看。本例中使用的是"Critical”,也只是為了方便查看而已。
第七步:
F5運行程式。此時我們的Azure蘭州拉麵館就正式在Development Fabric中開業了!
開啟Development Fabric看看。
選擇我們剛部署的服務中的Worker Role,點擊右鍵,選擇"Clear logs”清屏,再選擇Logging Level- Critical 。這就是對日誌進行分類查看,我們選擇了查看Criticial類別是因為我們在記錄點菜資訊時使用了Critical 。
第八步:
測試一下吧 :)
看,我們點菜,大廚依次做菜!
隨便看一條資料吧,比如“(蘭州版)揚州炒飯”這一項,我們在01點29分58秒的時候將它寫入Queue。大廚發現Queue中有它後,在00點30分04秒中處理了它。
梳理一下流程:
點菜 - 把菜名寫入Queue - 大廚每秒鐘查看一次Queue,如果Queue中有需要做的菜,則按照先來後到的順序做菜 -從記菜本中刪除剛做好的菜 - 把做菜資訊寫入Azure Log中
到目前為止,我們掌握了:擷取Queue Storage的引用、建立Queue、插入資料到Queue中(入隊)、從Queue中取出資料(出隊)、記錄Azure系統日誌、查看Azure系統日誌。
———患侏儒症的分割線———
【附件】:
傳說中的萬能StorageClient:StorageClient.rar
WPF應用程式Azure Log Viewer原始碼:AzureLogViewer.zip
本文實驗全部原始碼:QueueStorage.rar