2011-10-16 58 views
0

我有一个包含Azure中的多个托管服务的应用程序。两个是网络角色,一个是工作者角色。问题是,现在需要沟通两个角色。一个是用作管理界面的网络角色。另一个是工作者角色。管理界面需要发出命令,如暂停任何正在运行的作业,报告状态等。第二个Web角色只是一个与前两个无关的站点。Azure体系结构和角色通信

(只是为了作序,我想确保我的使用Azure的术语是正确的):

  1. 托管服务:一个蓝色的 '应用'。有两个部署,生产和分期的多重角色

  2. 部署:所有角色的具体情况,无论是在生产或分期,通过一个外部端点(* .cloudapp.net)

  3. 的影响:一个'工作',无论是网络角色还是工作者角色。

  4. 比如:虚拟机的该服务的角色

也验证:是否可以将角色添加到现有的托管服务?也就是说,如果我从一个解决方案部署2个角色,我可以从另一个解决方案中的另一个部署中添加第三个角色?

因为每个角色都在自己的托管服务中,所以会带来一些挑战。这是我在他们如何通信的选项的理解:

  1. 服务总线:这似乎是从架构的角度来看是最好的。每个托管服务都可以将WCF服务连接到服务总线,并且管理员可以向辅助角色发出命令。缺点是这是非常昂贵的。内部终点:如果考虑成本,这似乎是最好的。缺点是您必须一次部署所有角色,并且Web角色不能拥有唯一的地址。从外部访问这两个Web角色的唯一方法是使用端口转发。据我所知,从一个解决方案部署2个角色,从另一个角色部署1个角色是不可能的?

  2. 外部WCF服务:每个组件可以在单独的项目和单独的托管服务中。缺点是现在有一个外部可见的管理服务。

  3. 队列/表存储:管理员可以将命令写入Azure队列,并且工作角色可以将他们的响应写入表存储。这对于生成报告来说似乎很好,但对于发布同步命令似乎并不好。

应该为多个服务“应用程序”提供服务的多个角色都进入相同的Azure托管服务吗?如果从逻辑的角度来看它是最有意义的,那么我会很乐意去用#2来处理端口转发。非常感谢。

回答

1

首先,您的定义看起来很不错,我认为您很好地理解了这个问题。

同样在每个部署中,每个外部端点只能分配给一个角色。所以如果你想在端口80上运行两个站点,那么他们需要是in the same role。这就像在IIS上使用相同端口设置两个站点一样(这正是您正在使用的)。这些站点使用主机标题进行区分。如果你不想这么做,或者你想单独部署这些站点,那么你就需要将你的独立站点放在它自己的服务/云项目中。

对于通信部分,您错过的一个选项是服务总线队列。微软已经发布了一个library using service bus queues that is specifically designed for inter-role communication

除此之外,关于你的观点的额外评论: 你是正确的内部终结点是最便宜的方法,但你会自己动手。当然,它可以设置WCF服务来侦听这些内部端点。

外部WCF服务可能正常工作,但是如果您有多个角色实例,则所有WCF调用都将通过负载均衡器,并且只会将消息发送到其中一个实例。您需要进行多次调用才能确保所有实例都收到该消息,即使如此,如果没有其他反馈方法,您也无法确定它是否能够正常工作。

存储队列遭受类似的问题。如果您有两个实例并希望它们都收到相同的消息,则无法保证会发生这种情况。

+0

感谢您的回复。我没有充分考虑外部端点和队列的限制。我打算以正确的方式进行,并使用服务总线进行服务通信,并使用内部端点来实现每个角色的实例。 – mfanto