我有一系列需要上传的文件。上传每个文件时,将对其执行操作。上传所有文件后,我想对所有不同的文件类型执行任务。从技术上讲,该过程可以在上传任何文件后运行,但如果我上传了一百个文件,我不希望它运行100次。
我正在使用Azure功能,因此必须通过blob,table,queue或timer触发器(或其他一些触发器)以某种方式触发。
以下是关于如何实现这一目标的想法:
IQueryable<TableEntity>
作为附加输入
我不是非常喜欢不得不继续重置队列,但是如果X文件在处理的最后一分钟上传,那么下一个任务将运行X次,这是浪费的资源,特别是如果X很高。实际上,在这种情况下,队列中最多只能有一个项目。
我一直认为具有可见性延迟的blob触发器可能更有意义,但据我所知,这不存在。
这是用正确的方法解决这个问题的正确方法吗?还有更好的方法吗?
答案 0 :(得分:1)
这里面临的挑战是,您希望在上传文件后运行一些“完整”任务;但是没有明确的“完成上传”事件。您希望进行优化,而不是仅在每次上传文件后运行完整任务。
以下是一些选项:
[Singleton]属性(https://github.com/Azure/azure-webjobs-sdk/wiki/Singleton)为您提供了一种方法来保证函数只运行一次(如分布式锁)。所以如果你花上100分钟上传blob;完成任务需要5分钟才能运行;你只运行20次,而不是100次。
预览了Durable Functions https://github.com/Azure/azure-functions-durable-extension,它允许更好地协调这样的事情。从本质上讲,它允许您在Azure功能上执行Task.WhenAll。
您可以使用一些延迟机制,仅在N分钟没有新上传后运行完成任务。 Blob触发器可以a)用当前时间写入公共收据blob,b)按可见延迟N分钟推送队列消息,内容与blob接收匹配。在队列触发器上,忽略时间是否匹配 - 因为这意味着在N分钟窗口期间另一个blob上载操作覆盖了收据,因此blob上载可能是“最后一个”。