azure - 以编程方式管理 worker 角色的扩展

标签 azure azure-worker-roles

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

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

执行此操作的最经济有效的方法似乎是为每个登录的用户创建一个辅助角色的小实例,该实例将专门处理他们的请求(例如,使用以用户的 ID),然后在用户 session 结束时被销毁。

我有代码来确定何时启动实例、如何来回传递这些消息以及何时关闭实例,但我很难找到允许我进行的任何方法或 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.

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

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

可能的解决方案

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

关于azure - 以编程方式管理 worker 角色的扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29774037/

相关文章:

c# - 使用空格时,Azure 搜索的 search.in 不返回结果

azure - Azure 实例如何确定其实例级公共(public) IP 地址 (ILPIP)?

azure - 我们如何在 AZURE 中安排自定义代码调用认知 API

azure - 为什么无法将数据存储在 Azure 计算实例中?

azure - 可以在 azure 辅助角色云配置文件中设置 nlog 配置吗

c# - 如何使用 C# 更新 Azure CosmosDB 中的文档

asynchronous - 从 Azure 表结构读取 N 个实体的最有效方法是什么

azure - 如何在 Azure 数据工厂中的接收器表上插入之前验证多个表

c# - 通过 ReceiveAsync 进行的 Azure 队列处理立即返回 null

c# - 如何在 Azure 辅助角色中生成安全随机数?