【问题标题】:Scale azure function through C# code通过 C# 代码缩放 azure 函数
【发布时间】:2018-12-11 10:31:58
【问题描述】:
我是 Azure Functions 的新手。我需要编写一些 C# 代码来根据某些条件扩展 Azure Functions。
例如:
我总共有 10 个客户将为其调用 Azure Function。但是在这 10 个中,有一个 高优先级 客户。如果该高优先级客户的任何函数请求出现,我想扩展我的 Azure 函数并在新实例上运行该请求。完成该请求后,我想销毁该横向扩展实例。这样,我的高优先级客户就可以使用完整的服务器资源。
我的问题是:
- 这可能是我想要的吗?
- 如果是:
怎么样?
要扩展的 C# 代码应该是什么?
如何将我的请求转发到新实例?
如何销毁当前的横向扩展实例?
- 如果不是:
在 Azure Function 中为选定客户提供高优先级的最佳方式应该是什么?
【问题讨论】:
标签:
c#
azure
azure-functions
【解决方案1】:
这是不可能的。您不能直接影响 Azure Functions 的缩放算法(在 Consumption Plan 上)。
Blob 触发器特别具有一些已知限制,如documentation 中所述。尤其是处理 blob 时可能会有延迟。
为了更快地扩展,我建议您使用事件网格触发器,这对于您的“优先级”和“非优先级”客户都应该可以很好地扩展。见Image Resizing sample。
【解决方案2】:
在尝试回答您的问题之前,我想先解释一下。 Azure Functions 可以以两种不同的方式运行:使用计划和应用服务计划。为了充分利用 Functions(或实际上是无服务器),您应该在 Consumption Plan 中运行您的 Functions。
-
消耗计划 - 当你的函数运行时,Azure 会提供所有必要的计算资源。您不必担心资源管理,您只需为代码运行的时间付费。
-
应用服务计划 - 像 Web、移动和 API 应用一样运行您的功能。如果您已将应用服务用于其他应用程序,则可以在同一计划上运行您的功能,无需额外费用。
和
使用消耗计划时,Azure Functions 主机的实例会根据传入事件的数量动态添加和删除。此计划会自动扩展,并且仅在您的函数运行时才向您收取计算资源费用。在消费计划中,函数执行在可配置的时间段后超时。
关于缩放:
Azure Functions 使用称为缩放控制器的组件来监视事件的发生率并确定是横向扩展还是横向缩减。缩放控制器对每种触发器类型使用启发式方法。例如,当您使用 Azure 队列存储触发器时,它会根据队列长度和最旧队列消息的年龄进行缩放。
更多关于缩放的有趣信息:Azure Functions scale and hosting
看看您的要求,我的想法是通过在消费计划中运行函数来利用函数的真正力量。如果您有一个高优先级客户,请给他们自己的函数实例,由 Blob 存储中的自己的容器触发(查看@Gonzo345 评论中的链接)。这样可以确保它一进来就得到处理,并且只有在触发高优先级客户的情况下才会产生成本。因为消费计划的想法,它会实例化函数,运行任何需要运行的东西并销毁实例。
顺便说一句:Blob 触发器到底是轮询触发器。当有很多运动时,它们非常快。但是当没有太多事情发生时,存储帐户的更改可能需要几分钟才能真正触发该功能。如果您想要实时事件处理,请查看Event Grid。
现在回到您的问题:
- 是的,应该是。 确实要求您的 Function App 在应用服务计划中运行
- 请看这里:Disable Autoscale and manually scale your instances
- 见 2 :)