【问题标题】:How exactly does Azure provides scaling?Azure 究竟如何提供缩放功能?
【发布时间】:2011-02-08 20:47:30
【问题描述】:

这是一个关于 Azure 和通用云技术的新手问题。

我正在尝试了解 Azure 平台将如何扩展我的应用程序,我是否需要做任何事情才能使其正常运行。

我有一个处理传入数据的应用程序 (C#),它由许多类组成。每次需要进行相关计算时,都会实例化一个新类并驻留在内存中,直到它完成其工作,然后它会停留在那里并通过事件侦听新的计算请求(直到被显式处理)。当然,这会消耗资源。应用程序可能有十万个这样的实例来监听和回答计算请求。

问题是,云会随着新实例的加载而增加我的环境资源,直到什么时候? 是否会出现我无法启动新实例或当前实例计算使系统超载的情况?我不关心预算方面的问题,只关心运营方面的: 云是否能够代表我无缝地管理它,还是我需要在我的代码中做任何其他事情?

谢谢

【问题讨论】:

    标签: c# .net azure cloud


    【解决方案1】:

    您将不得不为云重新设计您的系统。

    在你的情况下,我会这样做:

    • 一组通过网络服务接收计算请求的网络角色
    • Web 角色会将计算请求写入队列
    • 然后是一组工作角色来轮询队列并进行计算

    在您的配置中,您可以将工作角色的数量设置为 1 或 100。更改配置后一分钟(或至少很短的时间),您就有了请求的机器数量。

    如果队列过长,您还可以执行诸如增加辅助角色的数量之类的操作。

    【讨论】:

    • 但是如果我需要 10,000 个工作角色怎么办?我可以动态添加角色吗?另外,实例可能只是坐在那里听,不能几个实例以相同的角色运行吗?
    • 可以动态添加机器,见msdn.microsoft.com/en-us/magazine/gg232759.aspx
    • 10000 个工人角色是可以的,只需更改配置,但是每小时会花费超过 1000 美元。 blog.toddysm.com/2010/01/…
    • 每个角色有 20 个 CPU 的限制吗?
    • 20 核限制是默认值。您只需联系 Microsoft 并请求增加配额(如果您打算使用 1000 多个内核,可能还需要申请信用额度)。话虽如此......我觉得这个关于 10,000 个核心的讨论没有真正意义。
    【解决方案2】:

    这是一个很好的问题,而且通常是对 Azure 的一个很大的误解。

    Azure 允许调整通过 REST-API 调用分配的计算资源量,但不会自动为您调整资源。您在说什么,听起来像是动态或自动可扩展性。它需要您自己实现(有几十个示例),或者您可以使用第三方服务AzureWatch,它可以为您处理大部分扩展场景。

    为了实现动态缩放,您可能需要也可能不需要提前考虑。我的意思是您绝对应该考虑一下,但您可能不需要做太多事情,这取决于您的要求以及您与第三方供应商合作的能力。

    关于动态可扩展性的难点不是实际的扩展部分,而是知道何时扩大规模和何时缩小规模。

    首先,如果调用未在 1 分钟内完成,Azure 将终止对公共负载平衡端点的所有调用。因此,如果您的计算需要更长的时间,您需要计划异步计算并利用队列。通过这种方式,您可以根据队列大小扩大或缩小规模。

    如果您的计算很快完成并且您的调用很快结束并且请求计算的传入客户端不是异步的,那么您可能希望跟踪前 X 时间量的平均利用率并基于此向上或向下扩展。在你的情况下,我不会采用这种方法,因为它听起来过于严格且不够灵活。

    无论哪种方式,AzureWatch 都可以与任一模式一起使用。

    【讨论】:

      【解决方案3】:

      只是为了提供一些背景知识:您创建服务模型,在其中指定角色和每个角色的实例数。 Azure 会为你部署它。您始终可以更改此配置,但 Azure 不会为您执行此操作。 据我所知,Azure 团队正在考虑自动增长功能,但正确实施非常复杂,而且我看到的所有第三方解决方案都没有正确执行此操作(数据不足,峰值行为不良)。 启动新实例也不是即时操作。所以你需要提前计划。

      【讨论】:

        【解决方案4】:

        无论您是否设计为在 Azure 上工作,您最好使用队列来隔离特定的功能。

        Shiraz Bhaiji 回答中,您在 Azure 中有两个工作进程,一个 Web 工作人员托管将消息添加到队列的 Web 服务,一个后台工作人员进行计算。

        然后,您可以增加额外工作人员的实例数量,或者您可以增加实例的大小,从而为您提供更多资源(CPU、Ram、网络),以在以下情况下每秒处理更多 Web 服务调用/队列消息每个工人。

        在达到最大队列性能的情况下,您可以创建多个队列。

        除非您automate 这种缩放,否则您必须明确监控和调整您希望应用程序通过人工交互执行的方式。

        【讨论】:

        • 关于从角色移动消息的内容我读过但不理解的是队列部分。据我了解,工作人员需要一直检查队列以查看是否有任何新消息。与桌面应用程序的事件驱动性质相比,这似乎是一项工作分配,不是吗?难道没有更有效的方法吗?
        • 不,没有。这是因为队列和其他存储风格一样,是通过 HTTP RESTful API 访问的,因此服务器无法通知角色新消息已到达。我和你一样,我习惯了事件驱动的方法,保持无限循环或计时器这件事看起来很傻,但它有它的原因。
        • 如何使用 WCF 和某种广播消息协议。那不是更有效率吗?
        • 更好的是,我不能将网络角色也用作工作人员,然后添加更多吗?
        • 如果您希望提供同步结果,那么是的,这可能是一个好方法。 Azure 将在您的 Web 角色之间对每个请求进行负载平衡(没有“粘性会话”),您可以在需要时添加更多请求。将项目添加到队列中确实有利于让其他事情开始工作,但是很难指出该工作何时完成以及结果是什么(大多数文献中都没有提到这一点)。
        【解决方案5】:

        应用程序可能有第十个和 数十万个 听和回答的实例 计算请求。

        我真的不明白这部分。如果您使这些类成为无状态的(当然也是线程安全的),那么您只需要加载每个类怎么办?

        你能慢慢扩大应用吗?

        【讨论】:

        • 它不可能是无状态的,因为一些计算是在不止一条消息上进行的。关于慢慢扩大规模——这正是我试图理解的......
        • “纵向扩展”是使用所有机器资源并避免空闲时间(多线程、低争用时间等)的能力,因此如果您使用更大的机器,您的应用程序可以处理更多要求。另一方面,“横向扩展”是您的应用程序与自身的更多实例并行工作的能力。首先你应该确保你可以轻轻地“扩大规模”,否则尝试扩大规模会浪费金钱。
        猜你喜欢
        • 2012-05-04
        • 2023-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多