Azure 消费者功能应用对消息的反应极其缓慢
Azure consumer function app extremely slow to react to messages
我们有一个 Linux 函数应用程序,它使用 ServiceBusTrigger 使用来自 Azure 服务总线的消息。
将消息添加到 ASB 上的订阅后,函数应用需要整整 分钟 才能启动响应。一旦热,所有后续消息都会很快被消耗,但是冷启动肯定不能解释一分钟的延迟吗?
2/3/2021, 8:45:22.936 AM | MyApi.DataAccess.ServiceBus.ServiceBusClient | West Europe | Successfully published message to AzureServiceBus
2/3/2021, 8:46:24.000 AM | Host.Startup | | Loading functions metadata
我可以一次又一次地重复这个,延迟几乎总是一分钟,而且只发生在函数冷的时候。再次冷启动是可以理解的,但在这种情况下的延迟是巨大的——一定有其他事情发生了。需要注意的几点:
- 我们正在使用 Linux 消费计划(尝试过 Windows 但也看到了巨大的延迟)
- 我们正在使用 Azure 服务总线 SessionIds
- 我们正在使用函数 V3
- 函数 app 中有 9 个消费者函数
- 在 Azure 门户中,函数应用程序在函数部分显示为没有函数(对于 Linux,这可能只是预期的,因为 UI 还说“在 Azure 门户中编辑函数是Linux 消费功能应用不支持。”)
下面是我们的一个消费者函数的签名:
[FunctionName("MyEventHandler")]
public async Task Run([ServiceBusTrigger("MyEvent",
Consts.ServiceBus.SubscriptionName,
Connection = "ServiceBusConnectionString",
IsSessionsEnabled = true)]
MyMessage message,
ILogger log)
如果我们能够看到该函数何时首次意识到订阅中有一条消息,或者它轮询订阅的频率,那就太好了。这在任何地方都可用吗?
我观察到过去服务总线触发器的“冷启动”持续时间更长。我的假设始终是它毕竟不是真正的“冷启动”。没有显式的 HTTP 调用来唤醒您的函数。相反,您的函数会完全休眠并且仍然需要触发新消息。
我的理论是:如果你有一段时间没有收到队列中的消息,监视你的服务总线的进程也会进入休眠状态,并且只会周期性地自行唤醒。这可能是您正在观察的那一刻。
有趣的是,虽然我一直认为这是“有道理的”,但几乎没有关于此的实际信息。所以除了我自己的经验,我没有其他来源。所以它有可能工作得更快,我的应用程序也遇到了你描述的同样问题。
https://mikhail.io/2019/03/reducing-azure-functions-cold-start-time/
https://markheath.net/post/avoiding-azure-functions-cold-starts
我们有一个 Linux 函数应用程序,它使用 ServiceBusTrigger 使用来自 Azure 服务总线的消息。
将消息添加到 ASB 上的订阅后,函数应用需要整整 分钟 才能启动响应。一旦热,所有后续消息都会很快被消耗,但是冷启动肯定不能解释一分钟的延迟吗?
2/3/2021, 8:45:22.936 AM | MyApi.DataAccess.ServiceBus.ServiceBusClient | West Europe | Successfully published message to AzureServiceBus
2/3/2021, 8:46:24.000 AM | Host.Startup | | Loading functions metadata
我可以一次又一次地重复这个,延迟几乎总是一分钟,而且只发生在函数冷的时候。再次冷启动是可以理解的,但在这种情况下的延迟是巨大的——一定有其他事情发生了。需要注意的几点:
- 我们正在使用 Linux 消费计划(尝试过 Windows 但也看到了巨大的延迟)
- 我们正在使用 Azure 服务总线 SessionIds
- 我们正在使用函数 V3
- 函数 app 中有 9 个消费者函数
- 在 Azure 门户中,函数应用程序在函数部分显示为没有函数(对于 Linux,这可能只是预期的,因为 UI 还说“在 Azure 门户中编辑函数是Linux 消费功能应用不支持。”)
下面是我们的一个消费者函数的签名:
[FunctionName("MyEventHandler")]
public async Task Run([ServiceBusTrigger("MyEvent",
Consts.ServiceBus.SubscriptionName,
Connection = "ServiceBusConnectionString",
IsSessionsEnabled = true)]
MyMessage message,
ILogger log)
如果我们能够看到该函数何时首次意识到订阅中有一条消息,或者它轮询订阅的频率,那就太好了。这在任何地方都可用吗?
我观察到过去服务总线触发器的“冷启动”持续时间更长。我的假设始终是它毕竟不是真正的“冷启动”。没有显式的 HTTP 调用来唤醒您的函数。相反,您的函数会完全休眠并且仍然需要触发新消息。
我的理论是:如果你有一段时间没有收到队列中的消息,监视你的服务总线的进程也会进入休眠状态,并且只会周期性地自行唤醒。这可能是您正在观察的那一刻。
有趣的是,虽然我一直认为这是“有道理的”,但几乎没有关于此的实际信息。所以除了我自己的经验,我没有其他来源。所以它有可能工作得更快,我的应用程序也遇到了你描述的同样问题。
https://mikhail.io/2019/03/reducing-azure-functions-cold-start-time/
https://markheath.net/post/avoiding-azure-functions-cold-starts