2016-12-31 119 views
2

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

我正在使用Azure函数,所以这将不得不以某种方式触发,无论是通过blob,table,queue或timer触发器(或其他触发器)。

这是我对我将如何做到这一点的想法:

  • 推新文件Blob存储
  • 一滴激活触发器
    • 文件处理
    • 按文件类型表存储
    • 清除队列
    • 将标志按可见性排队为1分
  • 队列触发,与IQueryable<TableEntity>作为附加输入延迟
    • 获取所有表项
    • 上的每个文件类型执行任务(表条目)从表
    • 删除处理的条目

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

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

那么这是正确的方法来解决这个问题,有什么可用的?有没有更好的办法?

+1

你能解释一下你想要在不同文件类型下运行的操作吗?它会更新文件吗?阅读文件?它可以在同一个文件上多次运行吗? –

+0

让我们假设一个研究实验室删除一些文件。 blob触发器会遍历所有新文件并对文件进行标准化。当所有标准化工作完成后,我们开始在每个研究的基础上进行更复杂的处理和分析(并且可能会有多个研究更新)。我可以为m项研究运行分析n次吗?大概。但是我只需要处理m次就可以节省大量的资金和资源。它也简化了监控故事,所以如果发生错误,我们不会在同一研究中得到n个错误。 –

+0

我认为这是一个非常奇怪的设计,你正在与。你如何确保在1分钟窗口内上传的文件属于同一组文件?如果两位研究人员同时上传呢? 也许你应该上传文件集在不同的文件夹或简单地上传所有文件作为一个zip(如果文件大小允许) – sjkp

回答

1

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

这里有一些选择:

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

  2. 有耐用的功能,https://github.com/Azure/azure-functions-durable-extension,允许这样的事情更好的业务流程的预览。从本质上讲,它可以让你在Azure函数上做Task.WhenAll。

  3. 您可能有一些延迟机制,只有在没有新的上传N分钟后才运行Complete任务。 Blob触发器可以:a)用当前时间写入普通接收块; b)推送具有可见性延迟N分钟的队列消息,并且内容匹配blob接收。在队列触发器上,如果时间不匹配,则忽略 - 因为这意味着另一个blob上载操作会在N分钟窗口中覆盖收据,并且blob上载可能是“最后一个”。