zoukankan      html  css  js  c++  java
  • 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

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

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

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

    摘要: 在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 Storage的朋友们来说,或许Blob Container的访问权限是一个比较难以理解的点。想要真正理解容器的权限设置,首先需要明白访问者是谁,是账户所有者访问,还是匿名用户访问,对于账户所有者来说,比较简单,拥有所有访问权限。而对于匿名用户来说,他们的权限又依赖于他们掌握的信息,那如何控制匿名用户的访问权限呢?能控制到怎样的细粒度?相信这篇随笔能给您一个比较完整的认识。阅读全文
    posted @ 2013-01-16 22:24 李甲蔚 阅读(495) | 评论 (1) 编辑

    摘要: 如果使用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) 编辑
  • 相关阅读:
    zw版【转发·台湾nvp系列Delphi例程】HALCON DirectShow (Delphi Prism)
    Delphi USBCamera DirectShow 预览录像截图
    DirectShow实现音视频分离(Delphi)
    基于Directshow的USB视频捕获Delphi篇(二)
    基于Directshow的USB视频捕获Delphi篇(一)
    delphi XE 无法定位程序输入点@... bpl
    Delphi xe 10.2之安装 TServerSocket 和TClientSocket
    基于AnyChat的视频会议程序
    DELPHI NEXTGEN编译开关
    TidTcpClient总结
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2870563.html
Copyright © 2011-2022 走看看