我有以下情况。我有一个在 Windows 应用服务计划上运行的功能。该函数处理 blob。该函数具有默认的
LogsAndContainerScan
触发器。现在,经过一段时间后,我决定重写这个函数,并将其从 Windows 迁移到 Linux,我还想将其部署在 docker 容器内的隔离环境中。为了实现这一目标,我创建了另一个在新的 Linux 应用服务计划上运行的函数应用程序。在部署过程中,我在 Linux 上部署并启动了一个新的函数应用程序,并停止了 Windows 上的旧函数应用程序。
令我大吃一惊的是,新函数开始处理前一个函数很久以前处理过的 blob。经过一些挖掘和阅读 Stack Overflow 上的答案(例如 this one 或 this one)后,在我看来,只有当 azure-webjobs-hosts
blob 容器内没有
blob 收据时,该函数才会处理 blob。当我查看我的
azure-webjobs-hosts
blob 容器时,我发现其中实际上有两个文件夹 - 一个用于我以前的函数,另一个用于我的新函数。所以我得出的结论是,即使存在现有 blob 的收据,它们也位于旧函数应用程序的文件夹中,这意味着当我创建新函数应用程序时,它试图在另一个文件夹中查找收据,但找不到它们,所以它开始再次处理所有的 blob。这基本上意味着,每当我决定使用 blob 触发器创建另一个函数应用程序时,它都会尝试重新处理所有现有文件。
我的问题。
我对默认触发器了解不够,无法评论#1
回答#2 我会考虑使用事件网格事件。这样就不会进行轮询,并且仅在创建 blob 时才会接收事件。因此,针对现有存储容器设置新函数意味着仅调用随后添加的新 blob。 请注意,事件网格保证“至少一次交付”(由于瞬态故障的可能性),因此您确实需要考虑到这一点。参考 https://learn.microsoft.com/en-us/azure/azure-functions/storage-considerations?tabs=azure-cli#trigger-on-a-blob-container