本文是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/目录下的项目。