来自 Azure Functions 的莫名其妙的存储事务
Inexplicable storage transactions from Azure Functions
我有一个项目,其中包含几个基于 .NET Core 的 Azure Functions 运行ning 按计划进行。其中一个 运行 每 10 分钟一次,用于更新视图计数,类似于 SO 跟踪问题视图的方式,另一个每周发送一次电子邮件。这些功能 运行 可以正常使用一年左右。我最近更新了它们以使用 Azure Functions SDK v3 和 Azure Functions 运行time v3 以及 .NET Core 3.1(基本上从 .NET Core 2.1 移动到 .NET Core 3.1 所以我需要更新函数 运行时间).
有一次我收到了比平时高得多的账单。事实证明,共享同一底层存储帐户的功能开始向存储进行大量 API 交易。每 5 分钟就有数千人。通常每个 运行 都会生成大约 100 个存储事务(可能是检索函数文件?),但在某些时候事务会急剧增加。重新启动功能后,事务下降到正常状态,几天内一切正常,然后它们再次跳跃并保持高位,直到重新启动。
只升级了SDK和运行时间,功能代码没有变化。该功能代码通过 SDK 提供的记录器进行恒定数量的日志写入(如 7),并且不以任何其他方式与存储交互。
我有两个相同的环境,一个用于测试,一个用于生产,两者都有同样的问题。该功能流氓所需的时间间隔是几天,但每次似乎都不同。但是,如果我同时重新启动测试和生产,那么下一个峰值会在两个环境中同时发生,所以那里有一些确定性。
根据我通过 Metrics 工具进行的调查,有问题的交易类型是 Create、Close 和 ChangeNotify 以及一些 Cancel(但少于其他类型)。存储不用于任何其他用途(事实上,它仅存在,因为 Azure Functions 需要后备存储来存储其文件或其他东西)
这是相关的触发代码
[FunctionName("ViewCountUpdater")]
public static async Task RunAsync([TimerTrigger("0 */10 * * * *"/*, RunOnStartup = true*/)]TimerInfo timer, ILogger log, ExecutionContext context)
我相信我遇到了 Azure Functions 运行time 或 Azure Functions .NET Core SDK 的错误。有没有人遇到过这种情况或知道如何解决?
你有AzureWebJobsDashboard
启用吗?如果是,您应该禁用它(从应用程序设置中删除连接字符串)并切换到应用程序洞察。已知此设置会导致无法正确解释的意外写入存储。
经过数周的调查,Azure 支持团队和我认为我们已经找到导致问题的行,就是这样:
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
配置文件未作为发布过程的一部分发布,并且不存在于 Azure 中。现在的实验似乎证实,当出现这种情况时,交易会激增,而当不出现时,它们是正常的。这不回答
- 为什么会出现错误
- 它是 .NET Core 中的回归还是函数 运行time 中的回归?
- 为什么这个错误是随机发生的,而不是每个 运行?
请注意,测试这需要时间,因为我必须等待随机尖峰几天,而且我永远无法确定它是否永远消失,所以我不能 100% 确定在未来的某个时候尖峰会获胜' 再次发生,结果是其他问题。
我有一个项目,其中包含几个基于 .NET Core 的 Azure Functions 运行ning 按计划进行。其中一个 运行 每 10 分钟一次,用于更新视图计数,类似于 SO 跟踪问题视图的方式,另一个每周发送一次电子邮件。这些功能 运行 可以正常使用一年左右。我最近更新了它们以使用 Azure Functions SDK v3 和 Azure Functions 运行time v3 以及 .NET Core 3.1(基本上从 .NET Core 2.1 移动到 .NET Core 3.1 所以我需要更新函数 运行时间).
有一次我收到了比平时高得多的账单。事实证明,共享同一底层存储帐户的功能开始向存储进行大量 API 交易。每 5 分钟就有数千人。通常每个 运行 都会生成大约 100 个存储事务(可能是检索函数文件?),但在某些时候事务会急剧增加。重新启动功能后,事务下降到正常状态,几天内一切正常,然后它们再次跳跃并保持高位,直到重新启动。
只升级了SDK和运行时间,功能代码没有变化。该功能代码通过 SDK 提供的记录器进行恒定数量的日志写入(如 7),并且不以任何其他方式与存储交互。
我有两个相同的环境,一个用于测试,一个用于生产,两者都有同样的问题。该功能流氓所需的时间间隔是几天,但每次似乎都不同。但是,如果我同时重新启动测试和生产,那么下一个峰值会在两个环境中同时发生,所以那里有一些确定性。
根据我通过 Metrics 工具进行的调查,有问题的交易类型是 Create、Close 和 ChangeNotify 以及一些 Cancel(但少于其他类型)。存储不用于任何其他用途(事实上,它仅存在,因为 Azure Functions 需要后备存储来存储其文件或其他东西)
这是相关的触发代码
[FunctionName("ViewCountUpdater")]
public static async Task RunAsync([TimerTrigger("0 */10 * * * *"/*, RunOnStartup = true*/)]TimerInfo timer, ILogger log, ExecutionContext context)
我相信我遇到了 Azure Functions 运行time 或 Azure Functions .NET Core SDK 的错误。有没有人遇到过这种情况或知道如何解决?
你有AzureWebJobsDashboard
启用吗?如果是,您应该禁用它(从应用程序设置中删除连接字符串)并切换到应用程序洞察。已知此设置会导致无法正确解释的意外写入存储。
经过数周的调查,Azure 支持团队和我认为我们已经找到导致问题的行,就是这样:
.AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
配置文件未作为发布过程的一部分发布,并且不存在于 Azure 中。现在的实验似乎证实,当出现这种情况时,交易会激增,而当不出现时,它们是正常的。这不回答
- 为什么会出现错误
- 它是 .NET Core 中的回归还是函数 运行time 中的回归?
- 为什么这个错误是随机发生的,而不是每个 运行?
请注意,测试这需要时间,因为我必须等待随机尖峰几天,而且我永远无法确定它是否永远消失,所以我不能 100% 确定在未来的某个时候尖峰会获胜' 再次发生,结果是其他问题。