任务列表完成后运行任务

时间:2016-12-31 03:20:15

标签: azure-functions

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

我正在使用Azure功能,因此必须通过blob,table,queue或timer触发器(或其他一些触发器)以某种方式触发。

以下是关于如何实现这一目标的想法:

  • 将新文件推送到blob存储
  • Blob触发器已激活
    • 文件已处理
    • 将文件类型推送到表存储
    • 清除队列
    • 将标记推送到队列,可见延迟为1分钟
  • 触发队列,IQueryable<TableEntity>作为附加输入
    • 获取所有表格条目
    • 对每种文件类型(表条目)执行任务
    • 从表中删除已处理的条目

我不是非常喜欢不得不继续重置队列,但是如果X文件在处理的最后一分钟上传,那么下一个任务将运行X次,这是浪费的资源,特别是如果X很高。实际上,在这种情况下,队列中最多只能有一个项目。

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

这是用正确的方法解决这个问题的正确方法吗?还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

这里面临的挑战是,您希望在上传文件后运行一些“完整”任务;但是没有明确的“完成上传”事件。您希望进行优化,而不是仅在每次上传文件后运行完整任务。

以下是一些选项:

  1. [Singleton]属性(https://github.com/Azure/azure-webjobs-sdk/wiki/Singleton)为您提供了一种方法来保证函数只运行一次(如分布式锁)。所以如果你花上100分钟上传blob;完成任务需要5分钟才能运行;你只运行20次,而不是100次。

  2. 预览了Durable Functions https://github.com/Azure/azure-functions-durable-extension,它允许更好地协调这样的事情。从本质上讲,它允许您在Azure功能上执行Task.WhenAll。

  3. 您可以使用一些延迟机制,仅在N分钟没有新上传后运行完成任务。 Blob触发器可以a)用当前时间写入公共收据blob,b)按可见延迟N分钟推送队列消息,内容与blob接收匹配。在队列触发器上,忽略时间是否匹配 - 因为这意味着在N分钟窗口期间另一个blob上载操作覆盖了收据,因此blob上载可能是“最后一个”。