我的应用程序包含Azure中的多个托管服务。两个是Web角色,一个是工作者角色。问题是,现在需要沟通两个角色。一个是用作管理界面的Web角色。另一个是工人角色。管理界面需要发出命令,例如暂停任何正在运行的作业,报告状态等。第二个Web角色只是一个站点,与前两个无关。
(仅作为序言,我想确保我对Azure术语的使用是正确的):
托管服务:Azure“应用程序”。具有两个部署,生产和暂存的多个角色
部署:具有单个外部端点(* .cloudapp.net)的所有角色的特定实例(生产或登台)
角色:单个“工作”,可以是Web角色,也可以是工作角色。
实例:为角色提供服务的VM
还要验证:是否可以向现有托管服务添加角色?也就是说,如果我从一个解决方案部署2个角色,我可以从另一个解决方案中在另一个部署中添加第三个角色吗?
因为每个角色都在自己的托管服务中,所以它会带来一些挑战。以下是我对他们如何沟通的选择的理解:
服务总线:从架构的角度来看,这似乎是最好的。每个托管服务都可以将WCF服务连接到服务总线,管理员可以向工作者角色发出命令。缺点是这是相当昂贵的成本。
内部终点:如果将成本考虑在内,这似乎是最好的。缺点是您必须立即部署所有角色,并且Web角色不能具有唯一的地址。从外部访问两个Web角色的唯一方法是使用端口转发。据我所知,从一个解决方案部署2个角色,从另一个解决方案部署1个角色是不可能的?
外部WCF服务:每个组件可以位于单个项目和单个托管服务中。缺点是现在有一个外部可见的管理服务。
队列/表存储:管理员可以将命令写入Azure队列,工作者角色可以将其响应写入表存储。这对于生成报告似乎很好,但对于发出同步命令似乎并不好。
所有为“应用程序”提供服务的多个角色是否都应该进入同一个Azure托管服务?如果从逻辑的角度来看它是最有意义的,那么我很乐意选择#2来处理端口转发。
答案 0 :(得分:1)
首先,你的定义看起来很不错,我认为你很清楚这个问题。
此外,对于每个部署,每个外部端点只能分配给一个角色。因此,如果您想在端口80上运行两个站点,那么它们必须是in the same role。这就像在具有相同端口的IIS上设置两个站点(这正是您正在使用的)。使用主机标头区分站点。如果您不想进行此项工作,或者您希望单独部署这些站点,那么您将需要将独立站点放在其自己的服务/云项目中。
对于通信部分,您错过的一个选项是服务总线队列。微软发布了library using service bus queues that is specifically designed for inter-role communication。
除此之外,对你的观点有额外的评论: 你是正确的内部端点是最便宜的方式,但你将自己滚动它。当然,它可以设置WCF服务来监听这些内部端点。
外部WCF服务可能正常工作,但如果您有多个角色实例,则所有WCF调用都将通过负载均衡器,并且该消息将仅发送到其中一个实例。您需要进行多次调用以确保所有实例都收到该消息,即使这样,您也无法确定它是否在没有其他反馈方法的情况下工作。
存储队列遇到类似问题。如果你有两个实例并希望它们都收到相同的消息,那么就无法保证会发生这种情况。