Azure Function如何通过日志文件在直接和间接监控Blob之间切换



我有一个Azure函数(v2(,它监视blob容器并在新blob上触发。该函数一直运行良好,直到意外停止。此后,我们已诊断出该问题是由于不再编写日志造成的(请参阅MS论坛上的问题(。

据我所知,Azure函数直接监视Blob,直到容器中有超过10k个Blob(请参阅本文档(。我的功能就是这样——我有超过1万个Blob,所以日志被监控。此后,我删除了我的大部分Blob,每个容器中只剩下几百个,包括$log容器中的Blob(所有容器中有几千个(。我的函数仍然不会在新的Blob上启动,这表明日志仍在被监视(这些日志工作不正常(。

我的问题是,Function运行时如何决定直接轮询Blob或使用日志?如何让运行时停止监视日志文件?

我的经验是,在高容量的情况下,blob触发器可能会被击中或错过。它们可能无法捕获每个事件。队列触发器非常可靠。我们用它们每天处理5万个斑点。如果它是业务关键型的,我建议使用队列+blob架构。你链接的MS文章现在也将人们推向了同一个方向。

此外,存储日志是在"尽最大努力"的基础上创建的。无法保证所有事件都被捕获。在某些情况下条件下,日志可能会丢失。

如果您需要更快或更可靠的blob处理,请考虑创建blob时创建队列消息。然后使用队列触发器而不是blob触发器来处理blob。另一种选择使用事件网格;请参阅教程"自动调整上载的大小"使用事件网格的图像。

我没有使用事件网格,但这听起来有些过头了?对于队列+blob体系结构,我们将遵循声明检查模式。简而言之,无论什么触发了要写入的新blob,都要让它向队列写入一条消息。消息可以是blob url。然后使用队列触发器函数来监视队列,获取带有blob url的新队列消息,并对blob执行操作。队列触发器不会错过事件。将处理每个blob。

最新更新