以编程方式管理工作者角色的扩展

Manage Scaling of Worker Role Programmatically

我正在考虑重组我正在开发的应用程序,以找到一种可以降低成本并为我们提供更多可扩展空间的方法。从本质上讲,该应用程序目前作为一个大型 Web 应用程序托管在 Azure 上,用户可以登录该应用程序,对存储在 Web 应用程序内存中的数据进行一些计算量大的工作,然后最终注销。

在寻找另一种扩展方法时,一个想法是使用辅助角色。我们可以使用服务总线将包含相关数据的消息传递给工作者角色实例,而不是在当前需要我们使用相当昂贵的定价层的 Web 应用程序上进行处理,该实例将执行此处理并发回结果.

看起来最具成本效益的方法是为每个登录的用户创建一个辅助角色的小实例,专门处理他们的请求(例如,使用队列以用户 ID 命名),然后在用户会话结束时销毁。

我有代码来确定何时启动实例、如何来回传递这些消息以及何时关闭实例,但我很难找到任何方法的文档或 API 调用可以让我轻松地做到这一点。我能找到的最接近删除实例的描述是 here,但我找不到创建它们的任何内容。

在 Azure 上启动和关闭实例的最佳方式是什么?我有哪些选择?我也很高兴听到关于如何构建它的替代建议。

The most cost-effective way to do this it seems, would be to create a small instance of a Worker Role for each user that logs on, which would deal exclusively with their requests (using, for example, a queue named after the user's ID) and then be destroyed when the user's session ends.

我不推荐这种方法。以下是我的理由:

  • 一个订阅中的虚拟机内核数量受到限制。想象一个场景,您有 1000 多个用户登录到您的应用程序。 Azure 不允许创建 1000 个辅助角色实例。您需要获得 Microsoft 的特别许可才能执行此操作。
  • 启动 VM 需要时间。当您为您的用户创建新的辅助角色部署时,它不是即时的。根据您角色的复杂程度,启动一个新的辅助角色实例可能需要 5 到 10 分钟。
  • 这不是一个有效的方法。您的基本想法是在用户登录时创建一个新的 Worker Role 实例,这是基于用户将执行一些计算密集型任务的假设。如果用户不想执行这项密集型任务怎么办(我在这里可能是错的,因为我对您的应用程序了解不多)。那么在这种情况下,您创建了一个无用的 VM 实例。同样,您的假设是用户将始终注销。如果用户只是关闭浏览器怎么办?您将如何检测到该用户已离开您的应用程序,并且您需要终止为该用户创建的工作者角色实例。
  • 这不是一种有效的方法。云计算的整个前提是围绕共享资源构建的。为用户设置专用 VM 听起来不是一种有效的方法。

可能的解决方案

与其旋转新的辅助角色实例,我建议您看看扩展选项。基本上,这个想法是从一个共享的 Worker Role 实例池开始。当用户登录并启动任务时,Web 角色会在服务总线队列中写入一条消息,该消息会被执行工作的辅助角色实例出队,并 return 结果。设置工作者角色可以处理的最大任务数。如果您超过该计数,则分拆一个新的工作者角色实例。您可以查看 Azure 管理门户中可用的自动缩放功能,或查看一些可以为您执行此缩放的第 3 方服务。

为每个用户使用专用实例不是一个好主意。利用率低,成本高,默认情况下每个订阅的上限为 20 CPU 个内核,因此您必须先请求支持人员增加配额。

更好的方法是 combine the web and worker role into one - 一旦出现更多负载,您只需将其扩展即可。您仍然可以使用任何方便的方式来存储用户请求 - 队列或其他任何方式。因此角色的 IIS 将在那里推送数据,"infinite loop" 部分(角色输入点 Run())将处理数据并存储结果,然后 Web 服务器将获取结果并将其反馈给用户。