阳光VIP

少壮不努力,老大徒伤悲。平日弗用功,自到临期悔。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

公告:本博客为微软云计算中文博客的镜像博客。部分文章因为博客兼容性问题,会影响阅读体验。如遇此情况,请访问原博客

本文是Windows Azure AppFabric入门教学的第六篇文章。本文会介绍一下Service Bus中一个非常有用的特性-MessageBuffer。该特性类似于Queue Storage,作为一种小型的,临时的信息缓冲区,能够应用于多种场景。本例中,我们会简单的模拟一下订单系统:下单,查看订单,处理订单。

 

前置条件

为了使后续的教程能够顺利进行,请确保如下软件或组件已被安装:

·       Microsoft .NET Framework 3.5 SP1

·       Microsoft Visual Studio 2008 SP1 (or above)

·       ·       Windows Azure Platform Training Kit - December Update(示例代码)

                             

 

 

 

请确保您已拥有一定的WCF编程经验,若没有,请浏览这里以快速的初步了解WCF。

最后请确保已创建了一个AppFabric项目和一个服务命名空间。请参考这里 

 

 

代码:

1.          从Windows Azure Platform Training Kit-December Update(示例代码)安装目录下C:/WindowsAzurePlatformKit/Labs/IntroServiceBus/Source/Ex05-MessageBuffer/end/CS(默认路径)找到完整的MssageBuffer程序代码。双击MssageBuffer.sln,以打开项目。

2.          为了调试方便,请分别打开OrderPeek项目,OrderProcessor和OrderSubmitter项目的Program.cs,以您在本教程第一篇文章中的信息,将相应处改为如下代码:

Console.Write("Your Service Namespace: ");

string serviceNamespace = "{your service namespace}";//Console.ReadLine();

Console.Write("Your Issuer Name: ");

string issuerName = "{your issuer name}"; //Console.ReadLine();

Console.Write("Your Issuer Secret: ");

string issuerSecret = "{your issuer secret}"; //Console.ReadLine();

 

验证:

3.          OrderPeek项目会创建一个存放订单的MessageBuffer,并能查看是否有未处理的订单。

OrderSubmitter项目会生成新订单,并放入OrderPeek创建的MessageBuffer。

OrderProcessor项目会处理MessageBuffer中的订单。

4.          右击OrderPeek项目,Debug->Start  new instance。

5.          右击OrderSubmitter项目,Debug->Start new instance。按照提示,输入字符串信息:

例如:

                                                                           i.      200 nails [回车]

                                                                         ii.      1 hammer [回车]

                                                                        iii.      1 wrench [回车]

 

如下图:

 

 

 

6.                        我们看到OrderPeek实例会查看MessageBuffer是否有未处理的订单(order),并显示第一条未处理订单。如下图:

 

 

7.                      右击OrderProcessor项目,Debug->Start new instance。 OrderProcessor会查看是否有有订单,轮询并打印出订单内容。如下图:

最后,我们看到在第5步中发送的订单都已经被处理。

8.          我们可以增加OrderProcessor(消费者的角色)的实例个数,来满足当在MessageBuffer中有许多Message需要被处理时的高负荷需求。当然,我们也可以有多个OrderSubmitter(生产者的角色)实例。

 

 

 

探析:

9.          我们先来看看如何创建一个MessageBuffer。打开OrderPeek项目的Program.cs,如下图:

 

 

9.1 创建端点凭证(endpoint credentials)

9.2 创建MessageBuffer挂载的URI

9.3 创建MessageBufferPolicy。MessageBufferPolicy是创建MessageBuffer时的必要参数。以下为MessageBufferPolicy各属性及其含义。

MessageBufferPolicy 属性

描述

ExpireAfter

message buffer的生命周期

MaxMessageCount

在溢出策略被激活前,message buffer所能容纳最大message数量。

OverflowPolicy

当message溢出时的行为。当前,当前唯一可用的行为是拒绝新进message,并向发送者发送错误信息。

TransportProtection

传输防护指端对端必须使用的安全等级。

Authorization

指定了发送和接收所需的授权类型,可以选择 “NotRequired”, “Required”, “RequiredToReceive” 和 “RequiredToSend”. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

调用EnsureMessageBufferExists函数来确保MessageBuffer被顺利创建。

EnsureMessageBufferExists内部实现如下图:

 

 

 

 

如果已经存在MessageBuffer,则调用GetMessageBuffer返回已经存在的MessageBuffer。若不存在,GetMessageBuffer会抛出异常,之后调用CreateMessageBuffer,创建新的MessageBuffer。

10.        创建好MessageBuffer之后,我们看下如何向该MessageBuffer发送Message。打开OrderSubmitter项目的Program.cs。

 

10.1取得已经创建好的MessageBuffer。

10.2因为不同的场景下需要发送不同的对象,需要将不同对象转换为MessageBuffer能处理的Message对象。System.ServiceModel程序集为我们提供了方便易用的TypedMessageConverter类来将对象转换为Message。

10.3将对象转换为Message之后,只需调用Send方法来发送Message。

10.4以上是MessageBuffer较高层次的封装,有兴趣的读者可以研究下AppFabric SDK 安装目录:Windows Azure platform AppFabric SDK/V1.0/Samples/ServiceBus/ExploringFeatures/MessageBuffer/PlainHttp/CS35内PlainHttp项目。其演示了如何通过REST协议来操作MessageBuffer,REST协议是独立于语言和操作系统的,所以可以在非Windows系统上使用java等语言来使用MessageBuffer。

 

11.        同样的,处理Message的代码也非常简单。

 

11.1调用EnsureMessageBufferExisits,因为我们的OderPeek项目已经创建了MessageBuffer,所以这一步我们会取得该MessageBuffer的引用。

11.2初始化TypedMessageConverter。

11.3取得第一条Message。

11.4将Message用TypedMessageConverter转换为需要处理的对象。

11.5ProcessOrder为处理过程。

11.6轮询下一条Message。

12. 更多MessageBuffer应用请参看AppFabric SDK 安装目录:Windows Azure platform AppFabric SDK/V1.0/Samples/ServiceBus/ExploringFeatures/MessageBuffer/目录下的项目。