Windows Azure AppFabric 入门教学系列 (六):Message Buffer之初体验

声明:由于Windows Azure SDK和相关工具的更新,下文下载链接可能已失效,最新链接更新如下:

 

Windows Azure Tools for Microsoft Visual Studio (已包含SDK)

Windows Azure AppFabric SDK V1.0 - October Update

 

 

 

 

 

 

 

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

 

前置条件

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

· Microsoft .NET Framework 3.5 SP1

· Microsoft Visual Studio 2008 SP1 (or above)

· AppFabric SDK

· 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\目录下的项目。