好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Windows Azure: Service Bus Queues 入门

Windows Azure: Service Bus Queues 入门

Windows Azure: Service Bus Queues 入门

什么是Service Bus Queues

Service Bus Queue提供了"Brokered"消息通信模式。当使用Queues的时候,分布式应用的组件之间并不是直接通信,而是通过作为中介角色的Queue来交换消息。消息生产者将消息发送至Queue,而消息消费者从Queue中获取消息并处理。生产者可以连续不断地发送消息,并不需要等待消费者的返回响应信息,发送方和接收方完全是异步模式。并且和传统的队列一样,Service Bus Queue遵循先进先出的规则。

如图所示,Service Bus Queues位于云端,而生产者和消费者可以位于任何地方,可以位于云端,可以在企业数据中心内部,可以位于个人PC,也可以是移动的,部署在移动设备上,而这些终端通过Queue建立彼此之间的联系。

为什么使用Service Bus Queues

在涉及代码之前我们来看一看Service Bus Queues有哪些优势,为什么或者是在什么情况下我们需要使用Service Bus Queues。

Temporal decoupling(时间解耦?)

Temporal decoupling意思就是消息生产者和消费者没有必要同时在线,发送的消息将被存储在Service Bus中,消费者在需要的时候上线获取消息就行。

Loose Coupling(松耦合)

生产者与消费者不会互相干预,完全是独立的应用,一方出现问题并不影响另一方的执行,体现了各组件之间松耦合的设计模式。

平衡负载量

为什么会涉及负载的相关功能?我们来做个对比。假设使用Web service部署服务,两端的通讯通过调用web服务来完成,则在高峰期,web服务所在机器会因访问过多而造成非常大的负载,而在闲散时间负载水平又非常低,所以这时负载情况如下图中的曲线所示。而如果使用Service Bus Queue来实现两端的数据通信,消费者从Queue中不断获取消息并处理,如果处理能力强,则单位时间内处理的消息多,否则较少,所以消费者所在机器不会出现峰值的情况,而是一条直线,既能保证业务正常处理,又能充分利用服务器的资源,所以可以说实现了均衡负载量的功能。

负载均衡

接着上面说,一个消费者处理能力有限,我们完全可以增加多个消费者来从Queue中读取消息并进行处理,多个消费者可以并行处理,并且保证每个消息只处理一次。这个模式完全是负载均衡的模式,而且自动实现了负载均衡,并不需要任何的路由策略。

如何使用Service Bus Queues

如需使用Service Bus Queue,首先需要在项目中引用Service Bus程序集,可通过Manage NuGet Packages搜索Service Bus的最新版本并添加引用。添加引用之后,将自动为项目Config文件添加Service Bus终结点配置:

    1:   <  appSettings  > 
    2:       <!-- Service Bus specific app setings for messaging connections --> 
    3:       <  add   key  ="Microsoft.ServiceBus.ConnectionString"   value  ="Endpoint=sb://[yourdomain].servicebus.windows.net/;SharedSecretIssuer=owner;SharedSecretValue=[yourkey]"   /> 
    4:    </  appSettings  > 

在进行Queue操作时,将自动根据这个配置连接位于云端的Service Bus,当然我们也可以在运行时通过代码设定配置。

创建Service Bus Queue

    1:   string  queueName =  "MyQueue" ;
    2:  NamespaceManager namespaceClient = NamespaceManager.Create();
    3:  QueueDescription myQueue =  null ;
    4:   if  (!namespaceClient.QueueExists(queueName))
    5:  {
    6:      myQueue = namespaceClient.CreateQueue(queueName);
    7:  }
    8:   else 
    9:  {
   10:      myQueue = namespaceClient.GetQueue(queueName);
   11:  }

发送消息

首先创建QueueClient对象

    1:  MessagingFactory factory = MessagingFactory.Create();
    2:  QueueClient myQueueClient = factory.CreateQueueClient( "MyQueue" );

然后创建消息对象BrokeredMessage,在消息传输中,所有消息内容都需要封装成BrokeredMessage对象

    1:  BrokeredMessage message =  new  BrokeredMessage();
    2:  message.Label =  "SalesReport" ;
    3:  message.Properties.Add( "Name" ,  "Steven" );
    4:  message.Properties.Add( "Email" ,  "Steven@hotmail.com" );
    5:  message.Properties.Add( "ProductCode" ,  "P476534" );
    6:  message.Properties.Add( "Count" , 1);

最后发送消息

    1:  myQueueClient.Send(message);

接收消息

首先创建QueueClient对象

    1:   string  queueName =  "MyQueue" ;
    2:  MessagingFactory factory = MessagingFactory.Create();
    3:  QueueClient myQueueClient = factory.CreateQueueClient(queueName, ReceiveMode.PeekLock);

我们注意到在创建客户端时,使用了一个参数:ReceiveMode,这个参数决定了消息的接收方式,ReceiveMode枚举定义如下:

    1:   public   enum  ReceiveMode
    2:  {
    3:      PeekLock,
    4:      ReceiveAndDelete
    5:  }

ReceiveAndDelete,顾名思义,当客户端接收完消息以后,该消息即从队列中移除,其他客户端无法获取该消息。在这种模式下,消息最多被处理一次,但是处理过程中可能出现异常导致处理失败,所以这种模式适合应用可以容忍消息处理失败的情景中。

PeerLock,当客户端接收消息以后,并不移除,而是给消息上锁,此时其他客户端无法获取该消息。锁的过期时间默认为1分钟,可以自定义设置,最大可以设置为5分钟。如果处理成功,可以将消息从队列中移除(Complete) ,如果失败,可以将锁移除(Abandon),使得消息可以被其他客户端接收并处理。当应用无法容忍消息处理失败时,使用这种模式更为安全。

如果在创建客户端时没有定义ReceiveMode参数,则消息被接收以后不作任何操作,既不删除也不加锁,其他客户端仍然可以获取该消息。

接收消息

    1:  BrokeredMessage message = myQueueClient.Receive();
    2:   if  (message !=  null )
    3:  {
    4:       try 
    5:      {
    6:          ProcessMessage(message);
    7:   
    8:          message.Complete();
    9:      }
   10:       catch 
   11:      {
   12:          message.Abandon();
   13:      }
   14:  }

在具体例子中使用了两个Winform客户端程序来分别模拟发送方和接收方,点击  这里  下载源码。

 

 

分类:  Windows Azure Windows Azure

 

Windows Azure: Service Bus Topics/Subscriptions入门

摘要: Service Bus Topics/Subscriptions提供了基于发布/订阅模式的消息通信模型。与Service Bus Queues不一样的是,Topics/Subscriptions使用发布/订阅模式实现了一对多的通信。就像我们订阅杂志,有若干个订阅方,同一本杂志可以根据订阅的数量发布给多个订阅者。我们可以理解成每一个Subscription就是一个Queue,发布者将消息发送给Topic,Topic再将消息复制多份,并发送到多个Queue中,且Queue之间不会互相影响,订阅者从对应的Queue中获取消息。 阅读全文

posted @  2013-01-21 17:05  李甲蔚 阅读(5) |  评论 (0)   编辑


Windows Azure: Service Bus Queues 入门

摘要: Service Bus Queue提供了"Brokered"消息通信模式。当使用Queues的时候,分布式应用的组件之间并不是直接通信,而是通过作为中介角色的Queue来交换消息。消息生产者将消息发送至Queue,而消息消费者从Queue中获取消息并处理。生产者可以连续不断地发送消息,并不需要等待消费者的返回响应信息,发送方和接收方完全是异步模式。并且和传统的队列一样,Service Bus Queue遵循先进先出的规则。 阅读全文

posted @  2013-01-21 13:48  李甲蔚 阅读(302) |  评论 (0)   编辑


Windows Azure: 使用Blob的PutBlock实现大文件断点续传

摘要: 我们在使用Blob服务的时候,免不了要上传大文件,采用一般方式(UploadFromStream)上传数据,如果由于网络或是其他因素导致传输中断,则整个传输前功尽弃。针对这种情况,我们可以使用Blob的PutBlock机制将大文件分块(即分成若干个block)传输,并且实现断点续传。在这里我们通过一个例子来看看如何实现分块传输以及断点续传。 阅读全文

posted @  2013-01-18 17:19  李甲蔚 阅读(633) |  评论 (0)   编辑


Windows Azure: Blob Lease 功能详解

摘要: 在Windows Azure storage中,lease是一个比较容易被忽视的功能,而实际上lease特性能帮我们解决难以控制的并发操作问题。Windows Aure针对lease功能设计了很大的灵活性,使得我们可以随意且方便地控制lease的过期、释放、变更,更新、终止等操作。在这边随笔中,将通过Lease Blob的来介绍Windows Azure Storage的lease功能。 阅读全文

posted @  2013-01-17 22:49  李甲蔚 阅读(480) |  评论 (2)   编辑


Windows Azure: Blob Container的访问权限与策略设置

摘要: 对与初次接触Windows Azure Storage的朋友们来说,或许Blob Container的访问权限是一个比较难以理解的点。想要真正理解容器的权限设置,首先需要明白访问者是谁,是账户所有者访问,还是匿名用户访问,对于账户所有者来说,比较简单,拥有所有访问权限。而对于匿名用户来说,他们的权限又依赖于他们掌握的信息,那如何控制匿名用户的访问权限呢?能控制到怎样的细粒度?相信这篇随笔能给您一个比较完整的认识。 阅读全文

posted @  2013-01-16 22:24  李甲蔚 阅读(495) |  评论 (1)   编辑


Windows Azure:Host WCF Service in Azure Worker Role

摘要: 如果使用Windows Azure Clound Service来部署WCF服务,基于Http的服务,应该使用Web Role,然而对于基于TCP的WCF服务,Worder Role是更佳的选择。这篇随笔通过一个例子介绍了如何在Worker Role中部署Internal和Input类型的WCF终结点,以及从Clound Service内部和外部如何去访问终结点。 阅读全文

posted @  2013-01-14 22:51  李甲蔚 阅读(18) |  评论 (0)   编辑

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Windows Azure: Service Bus Queues 入门的详细内容...

  阅读:43次