【Azure Services Platform Step by Step-第11篇】Windows Azure兰州拉面馆-日志与队列的使用

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

第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的引用。

image

image

 

第二步:

运行Azure SDK里的image 和image ,并启动Development Storage里的Queue服务。

image

 

第三步:

配置好ServiceConfiguration.cscfg和ServiceDefinition.csdef。如有疑问,请参考【Azure Services Platform Step by Step-第8篇】开发部署Azure留言板或本文篇末附件内的示例代码。

image

 

 

第四步:

打开Web Role项目的Default.aspx,拖入以下控件:

TextBox txtMessage
Button btnSend
TextBox txtLog

image

第五步:
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);
}
}
}
}

这段程序中,值得注意的有三处:

  1. 获取当前应该处理的数据:Message msg = queue.GetMessage();  既然是队列,就必须按照先进先出的顺序来操作数据。使用者也只能通过GetMessage方法取得队列中最靠前的那条数据,不能取到其他数据。就像是排队买火车票,售票员只能卖给排到队伍最靠前的那个人。
  2. 删除消息:queue.DeleteMessage(msg);   这又像是排队买火车票,当排在最前面的那位仁兄买到票后,他应该马上从队伍中消失。
  3. 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 。

image

 

第八步:

测试一下吧 :)

image

看,我们点菜,大厨依次做菜!

随便看一条数据吧,比如“(兰州版)扬州炒饭”这一项,我们在01点29分58秒的时候将它写入Queue。大厨发现Queue中有它后,在00点30分04秒中处理了它。

梳理一下流程:

点菜 - 把菜名写入Queue - 大厨每秒钟查看一次Queue,如果Queue中有需要做的菜,则按照先来后到的顺序做菜 -从记菜本中删除刚做好的菜 - 把做菜信息写入Azure Log中

 

到目前为止,我们掌握了:获取Queue Storage的引用、建立Queue、插入数据到Queue中(入队)、从Queue中取出数据(出队)、记录Azure系统日志、查看Azure系统日志。

 


本文转自 流牛木马 博客园博客,原文链接:http://www.cnblogs.com/azure/archive/2009/03/16/1412818.html,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
15天前
|
C# Windows
【Azure App Service】在App Service for Windows上验证能占用的内存最大值
根据以上测验,当使用App Service内存没有达到预期的值,且应用异常日志出现OutOfMemory时,就需要检查Platform的设置是否位64bit。
39 11
|
2月前
|
编译器 Windows
plugin cannot be loaded for module “QtQuick“ && Could not load the Qt platform plugin “windows“
本文讨论了在Qt应用程序中遇到的平台插件加载问题,包括具体的错误信息、解决方案和参考链接。问题表现为无法加载“QtQuick”模块的插件,并且无法找到“windows”平台插件。解决方案是修改环境变量`Qt5_DIR`以使用正确的Qt版本和编译器环境。
|
2月前
【Azure Policy】分享Policy实现对Azure Activity Log导出到Log A workspace中
在Policy Rule部分中,选择资源的类型为 "Microsoft.Resources/subscriptions", 效果使用 DeployIfNotExists (如果不存在,则通过修复任务进行修正。 在 existenceCondition 条件中,如果当前订阅已经启用了 diagnostic setting并且输出日志到同一个Log A workspace,表示满足Policy要求,不需要进行修正。 在 deployment 中,使用了 ARM 模板, 为订阅添加Diagnostic Setting并且所有的日志Category均启用。
|
3月前
|
Kubernetes 数据安全/隐私保护 容器
【Azure APIM】APIM Self-Hosted网关中,添加网关日志以记录请求头信息(Request Header / Response Header)
【Azure APIM】APIM Self-Hosted网关中,添加网关日志以记录请求头信息(Request Header / Response Header)
|
3月前
[Azure Developer]把Azure Function中ILogger对象静态化为静态方法提供日志记录
[Azure Developer]把Azure Function中ILogger对象静态化为静态方法提供日志记录
|
3月前
【Azure Function & Application Insights】在Azure Function的日志中,发现DrainMode mode enabled Traces。它是什么意思呢?
【Azure Function & Application Insights】在Azure Function的日志中,发现DrainMode mode enabled Traces。它是什么意思呢?
|
3月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
325 0
|
3月前
|
iOS开发 Android开发 MacOS
从零到全能开发者:解锁Uno Platform,一键跨越多平台应用开发的神奇之旅,让你的代码飞遍Windows、iOS、Android、macOS及Web,技术小白也能秒变跨平台大神!
【8月更文挑战第31天】从零开始,踏上使用Uno Platform开发跨平台应用的旅程。只需编写一次代码,即可轻松部署到Windows、iOS、macOS、Android及Web(通过WASM)等多个平台。Uno Platform为.NET生态带来前所未有的灵活性和效率,简化跨平台开发。首先确保安装了Visual Studio或VS Code及.NET SDK,然后选择合适的项目模板创建新项目。项目结构类似传统.NET MAUI或WPF项目,包含核心NuGet包。通过简单的按钮示例,你可以快速上手并构建应用。Uno Platform让你的技术探索之旅充满无限可能。
70 0
|
3月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
3月前
|
存储 大数据 索引
【Azure Contianer Apps】在云上使用容器应用时收集日志遇见延迟问题
【Azure Contianer Apps】在云上使用容器应用时收集日志遇见延迟问题
下一篇
无影云桌面