0

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

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

  1. 托管服务:Azure“应用程序”。具有两个部署、生产和登台的多个角色

  2. 部署:具有单个外部端点 (*.cloudapp.net) 的所有角色的特定实例,无论是在生产中还是在暂存中

  3. 角色:一个单一的“工作”,可以是网络角色或工作者角色。

  4. 实例:为角色服务的虚拟机

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

因为每个角色都在它自己的托管服务中,所以它提出了一些挑战。以下是我对他们如何沟通的选择的理解:

  1. 服务总线:从架构的角度来看,这似乎是最好的。每个托管服务都可以将 WCF 服务连接到服务总线,并且管理员可以向辅助角色发出命令。缺点是这非常昂贵。

  2. 内部端点:如果将成本考虑在内,这似乎是最好的。缺点是您必须一次部署所有角色,并且 Web 角色不能有唯一的地址。从外部访问这两个 Web 角色的唯一方法是使用端口转发。据我所知,不可能从一个解决方案部署 2 个角色,从另一个解决方案部署 1 个角色?

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

  4. 队列/表存储:管理员可以将命令写入 Azure 队列,辅助角色可以将其响应写入表存储。这对于生成报告似乎很好,但对于发出同步命令似乎不是很好。

所有服务“应用程序”的多个角色都应该进入同一个 Azure 托管服务吗?如果从逻辑的角度来看它是最有意义的,那么我很乐意使用 #2 并只处理端口转发。

4

1 回答 1

1

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

此外,对于每个部署,每个外部端点只能分配给一个角色。因此,如果您想在端口 80 上运行两个站点,那么它们需要具有相同的角色。这就像在具有相同端口的 IIS 上设置两个站点(这正是您正在使用的)。这些站点使用主机标头进行区分。如果您不想进行这项工作,或者如果您想单独部署站点,那么您需要将您的独立站点放在自己的服务/云项目中。

对于通信部分,您错过的一个选项是服务总线队列。Microsoft 发布了一个使用服务总线队列的库,该库专为角色间通信而设计

除此之外,对您的观点的额外评论:您是对的,内部端点是最便宜的方式,但您将自己滚动它。当然,它可以设置 WCF 服务来监听这些内部端点。

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

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

于 2011-10-16T21:41:09.567 回答