2016-12-31 125 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上載可能是「最後一個」。