2

我想创建一个执行以下操作的 Azure 应用程序:

  • 向用户展示了一个 MVC 4 网站(Web 角色),其中显示了命令列表。
  • 当用户选择一个命令时,它会广播给所有工作角色。
  • 工作角色处理任务、存储结果并通知 Web 角色
  • Web 角色显示辅助角色的组合结果

从我一直在阅读的内容来看,似乎有两种方法可以做到这一点:Windows Azure 服务总线或使用队列。每个工作人员角色还将结果存储在数据库中。

服务总线似乎更适合其发布/订阅模型,因此所有工作角色将获得相同的命令并且大致相同的时间。不过,队列似乎更容易使用。

开发时可以在模拟器本地使用服务总线吗?我正在使用免费试用版,无法在开发过程中不断保持应用程序。此外,当使用队列时,如何通知 Web 角色处理已完成?

4

3 回答 3

5

我同意。对于这种消息传递要求,ServiceBus 是一个更好的选择。您可以通过一些努力对队列执行相同的操作。但是,您将编写大量代码来实现 ServiceBus 已经提供给您的东西。

ServiceBus 没有像 Azure Strorage 服务(队列/表/blob)那样的本地模拟器。但是,当角色在您的开发环境中本地运行时,您仍然可以使用 ServiceBus 在角色之间进行消息传递。

至于您关于通知 Web 角色处理完成的最后一个问题,这里有几种方法。只是一些想法(不是详尽的列表)......

  1. Web 角色可以定期检查工作单元状态的表存储。
  2. 另一个用于完成工作的 ServiceBus 队列/主题。
  3. 内部端点。您必须有逻辑才能知道它是否只是来自工作角色 N 的更新,或者它是否指示所有工作角色的已完成工作单元。
于 2013-03-11T16:15:42.787 回答
3

我同意 Rick 的回答,但还要考虑以下几点:

如果您选择服务总线主题方法,那么当每个工作人员角色上线时,都需要生成对该主题的订阅。您需要考虑订阅维护何时其中一名工作人员发生故障并被回收,或者订阅可能存在的任何原因。

告诉网络角色所有工作人员都已完成是很有趣的。Rick 提供的选项很好,但您需要在这里考虑一些事情。这意味着网络角色需要知道有多少工作人员在那里或其他一些机制来决定何时所有工作人员都报告完成。您可能会遇到五个工作角色收到消息并开始工作的情况,然后其中一个角色开始反复处理失败。其他四个报告他们已完成,但现在 Web 角色正在等待第五个。你要等多久回复?你能继续吗?如果您只是告诉系统缩小规模,而网络角色认为有 5 个,现在只有 4 个。这些都是您需要考虑的事情,它们都取决于您的要求。

于 2013-03-11T16:32:50.700 回答
0

根据您的问题,您可以使用任一队列服务并获得良好的结果。但他们每个人都将面临不同的挑战和优势。

服务总线队列的一些优点是它通过持久连接(最多 100 个连接)提供阻塞接收,它可以监视消息的完成情况,并且可以发送更大的消息(256KB)。

与服务总线解决方案相比,存储队列的一些优点是它稍微快一些(如果 15 毫秒对您来说很重要),您可以使用单个存储系统(因为无论如何您可能会将 Storage 用于 blob 和表服务),并且简单自动缩放。如果您需要根据负载自动缩放辅助角色,通过存储队列传递请求会使自动缩放变得微不足道——您只需在 Azure 云服务 UI 中的缩放选项卡下设置自动缩放。

可以在此处找到两种 azure 队列服务的更深入比较:http: //msdn.microsoft.com/en-us/library/hh767287.aspx

此外,当使用队列时,如何通知 Web 角色处理已完成?

对于 Azure 存储队列解决方案,我编写了一个可以提供帮助的库:https ://github.com/brentrossen/AzureDistributedService 。它提供了一个代理层,可促进从 Web 角色到工作角色并通过存储队列返回的 RPC 样式通信。

于 2014-08-13T14:48:05.337 回答