【IT168 技术】任何的编程模型都少不了代码之间的通信。可供选择的通信机制很多,消息队列就是其中一种。由于应用之间的需求差异性与架构异构性,Windows Azure 提供了两种不同的消息队列机制,分别为队列与服务总线。
我们先来看一下队列机制。Windows Azure Queue提供的服务非常简单,即一个程序向队列中写消息,另一程序从队列读取消息。Web Role实例与Worker Role实例之间的通信是队列机制的一个典型应用场景,如图:

图一:Web Role实例与Worker Role实例之间使用队列通信
对于不熟悉Web Role,Worker Role实例的读者。我们可以简单的这样理解这三个概念:我们可以把Web Role理解为一个Web站点或者Web服务。而Worker Role则用来托管通用代码,这些代码用来执行一些长期的,非交互的任务。比如Worker Role可用来托管Apache Tomcat。Web Role与Worker Role对应的实例都是独立运行在不同的虚拟机上,其通信机制既可以是同步式的直接网络调用,也可也是消息队列服务式异步传递。关于Web Role与Worker Role的管理,是通过一个称为Windows Azure SDK的API实现的。这些API作为Windows Azure SDK的一部分,可用于在本地开发Windows Azure 应用程序。
我们接下来给出Web Role与Worker Role之间使用队列通信的例子。假设我们创建了一个视频分享的Windows Azure应用程序。这里我们的Web Role定义为:为用户上传与观看视频提供服务,使用的编程语言为PHP。而Worker Role则定义为:将上传视频转换成不同的文件格式,编程语言为C#。Web Role与Worker Role之间的通信流程为:Web Role接收用户上传的视频,并将其存储为blob格式,然后通过消息队列发送消息通知Woker Role关于视频的存储位置。相应的Work Role将接收消息,并获取该视频,在后台做视频转换服务。如前所述,这是一种非常好的消息队列服务式异步传递机制。Web Role与Work Role互相独立,对应的instance数量也可以随时弹性伸缩。
在简单的介绍完Windows Azure为Web Role与Woker Role提供的消息队列服务式异步传递机制之后,接下来,我们看一下Azure提供的另一种消息传递机制——服务总线。
相比于队列服务式消息服务,服务总线则更加通用,它并不局限与同一应用之间的Web Role与Worker Role的异步式消息服务,而更加注重不同应用之间的通信,如图:

图二:服务总线既可以提供队列消息服务也可以提供之间通信
通过服务总线通信的应用程序既可以为Windows Azure应用,也可以为来自Window Azure云平台之外的第三方云平台应用,甚至是非云端的应用程序。举个例子,假设有一个提供航班预定服务的应用程序,该应用程序部署在企业内部的数据中心。相对于其它许多客户端程序而言,它们希望访问该应用程序,从而为客户提供航班查询,登机服务等。服务总线非常适用于这种不同应用程序的松耦合交互。
来看一下Windows Azure Queue与Windows Azure Service Bus Queue的主要区别。相比于前者,服务总线队列提供的是发布与订阅机制。对于服务总线队列而言,发送方应用可以同时发送关于一个甚至多个主题的消息,接收方应用可以只接收与特定主题相关的一类消息。这种一对多的通信机制使得多个应用之间的通信变得更加灵活。除了队列服务之外,服务总线还提供应用程序的之间通信,当然,这主要依赖服务总线提供的Relay服务。它能穿越企业内部的防火墙,但又保证应用之间通信服务的安全性。
总之,Windows Azure 提供的队列与服务总线机制,屏蔽了云计算复杂的异构环境,保证了不同应用可以跨越云端,企业内部的无障碍数据通信,为Windows Azure云计算平台的通信机制保驾护航。