Azure Functions 如何横向扩展?

How do Azure Functions scale out?

scaling documentation for Azure Functions 略微阐述了 Azure Functions 如何决定何时添加更多应用程序实例的详细信息。

例如,我有一个由 Github webhook 触发的函数。 10,000 人同时提交到 Github 存储库(没有合并冲突 ;)),并且 Github 在很短的时间内调用了我的函数 10,000 次。

我会发生什么?具体来说,

  1. Azure Functions 会限制 webhook 调用吗?即,如果我的函数应用程序处于高负载状态,Azure Functions 是否会拒绝某些函数调用?
  2. Azure Functions 是否以某种方式对请求进行排队?如果是,where/how?
  3. 在此场景中,Azure Functions 将创建我的函数应用程序的多少个实例?每个请求一个(即 10,000 个),每个请求将 运行 并行?
  4. 如果我的应用函数因为没有负载而缩减为零个实例,我是否可以期望在执行第一个函数之前看到一些 "warm-up time"?大概多长时间?
  1. Azure Functions 不会拒绝 webhook 调用,但在突然出现极端负载的情况下,某些请求可能会超时。对于网络 api,请在客户端包括重试,作为最佳实践。
  2. 他们没有在任何持久的地方排队。它们由 IIS 管理(实现细节)。
  3. (实施细节)实例数量不是硬性设定的。我们有特定的、未发布的保护措施,但我们的设计目的是扩大规模。您的请求将由多个实例处理。
  4. 是的。现在,它相当长(秒),但我们会努力改进它。对于性能敏感的情况,建议使用金丝雀或定时器触发器来保持唤醒。

我来自 Azure Functions 团队。我标记为实现细节的东西不是承诺,并且可能会随着我们服务的发展而改变;只是一种透明度的尝试。

  1. 今天测试。花了超过几秒钟:(
ACTUAL PERFORMANCE
--------------
ClientConnected:  13:58:41.589

ClientBeginRequest:   13:58:41.592

GotRequestHeaders:    13:58:41.592

ClientDoneRequest:    13:58:41.592

Determine Gateway:    0ms

DNS Lookup:       65ms

TCP/IP Connect:   40ms

HTTPS Handshake:  114ms

ServerConnected:  13:58:41.703

FiddlerBeginRequest:  13:58:41.816

ServerGotRequest: 13:58:41.817

ServerBeginResponse:  14:00:36.790

GotResponseHeaders:   14:00:36.790

ServerDoneResponse:   14:00:36.790

ClientBeginResponse:  14:00:36.790

ClientDoneResponse:   14:00:36.790


Overall Elapsed:  **0:01:55.198**