azure - Azure 消费者函数应用对消息的反应极其缓慢
问题描述
我们有一个 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
- 作为函数应用程序的一部分,有 9 个消费者函数
- 在 Azure 门户中,函数应用在“函数”部分显示为没有函数(这可能只是 Linux 的预期,因为 UI 还显示“Linux 消费函数应用不支持在 Azure 门户中编辑函数。”)
下面是我们的一个消费者函数的签名:
[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
推荐阅读
- intellij-idea - Intellij 插件开发 - 找不到类?
- ms-access - 内连接 - 从一个拉出两个字段
- c++ - 使用在代码运行之前未确定的参数在 C++ 中创建新数组
- vue.js - 如何在 v-window 内显示固定数量的 v-for 元素
- php - 带有一组特定类别的第一篇文章的 WP Query
- r - R - Friedman_test - 错误:不是未复制的完整块设计
- mysql - 数据透视表的问题
- r - R 中是否有办法使用 dplyr 包对相同数量的因子进行采样?
- css - 调整 CSS Spinner 动画以完成而不是重复
- python - AttributeError 引用了一个未导入的包