Azure functions 完成任务列表后运行任务

Azure functions 完成任务列表后运行任务,azure-functions,Azure Functions,我有一系列需要上传的文件。上载每个文件时,将对其执行操作。上传所有文件后,我想对所有不同的文件类型执行一项任务。从技术上讲,这个过程可以在上传任何文件后运行,但如果我上传100个文件,我不希望它运行100次 我使用的是Azure函数,因此必须通过blob、表、队列或计时器触发器(或其他触发器)以某种方式触发 以下是我对如何实现这一目标的想法: 将新文件推送到blob存储 Blob触发器被激活 文件处理 将文件类型推送到表存储 清除队列 将标志推送到可视性延迟为1分钟的队列 队列已触发,使用

我有一系列需要上传的文件。上载每个文件时,将对其执行操作。上传所有文件后,我想对所有不同的文件类型执行一项任务。从技术上讲,这个过程可以在上传任何文件后运行,但如果我上传100个文件,我不希望它运行100次

我使用的是Azure函数,因此必须通过blob、表、队列或计时器触发器(或其他触发器)以某种方式触发

以下是我对如何实现这一目标的想法:

  • 将新文件推送到blob存储
  • Blob触发器被激活
    • 文件处理
    • 将文件类型推送到表存储
    • 清除队列
    • 将标志推送到可视性延迟为1分钟的队列
  • 队列已触发,使用
    IQueryable
    作为附加输入
    • 获取所有表条目
    • 对每种文件类型(表条目)执行任务
    • 从表中删除已处理的条目
我不太喜欢一直重置队列,但是如果在处理的最后一分钟内上传了X个文件,那么下一个任务将运行X次,这是浪费资源,特别是在X很高的情况下。实际上,在这种情况下,队列中最多只能有一个项目

我一直认为具有可见性延迟的blob触发器可能更有意义,但据我所知,这并不存在


那么,这是解决这个问题的正确方法吗?有更好的方法吗?

这里的挑战是,在上传文件后,您需要执行一些“完成”的任务;但是没有明确的“完成上传”事件。与每次上传文件后都必须运行完整的任务相比,您更希望进行优化

以下是一些选项:

  • [Singleton]属性()提供了一种方法来保证函数只运行一次(如分布式锁)。所以如果你花100分钟上传blob;完成任务需要运行5分钟;你只运行了20次,不是100次

  • 这里有一个持久函数的预览,它允许对类似的事情进行更好的编排。本质上,它允许您在Azure函数上执行Task.whalll

  • 您可以有一些延迟机制,只在N分钟没有新的上传后运行完整的任务。Blob触发器可以a)使用当前时间写入公共接收Blob,b)使用可视性延迟N分钟推送队列消息,并且内容与Blob接收匹配。在队列触发器上,如果时间不匹配,则忽略-因为这意味着另一个blob上载操作会在N分钟窗口期间重写收据,因此blob上载可能是“最后”一个


  • 您能解释一下,对于不同的文件类型,您希望运行的操作是什么吗?它会更新文件吗?读文件?它可以在同一个文件上运行多次吗?比如说一个研究实验室删除了一些文件。blob触发器遍历所有新文件并标准化这些文件。当所有的标准化都完成后,我们开始在每个研究的基础上进行更复杂的处理和分析(可能会更新多个研究)。我可以为m研究运行n次分析吗?可能但我只要处理m次就可以节省大量的资金和资源。它还简化了监控过程,因此如果发生错误,我们不会在同一项研究中得到n个错误。我认为这是一个非常奇怪的设计。如何确保在1分钟内上传的文件属于同一组文件?如果两名研究人员同时上传怎么办?也许你应该上传不同文件夹中的文件集,或者简单地将所有文件作为一个zip文件上传到一起(如果文件大小允许的话),我知道根据文件名,哪些文件属于哪个文件集。同时上传并不是一个真正的问题。我的经营受到业务的某些限制。我不控制如何获取文件,只控制如何处理它们。