2016-12-31 8 views
2

У меня есть серия файлов, которые мне нужно загрузить. Когда каждый файл загружается, на нем будет выполняться операция. Когда все файлы загружаются, я хочу выполнить задачу во всех различных типах файлов. Технически процесс может запускаться после загрузки любого файла, но если я загружу сто файлов, я не хочу, чтобы он выполнялся 100 раз.Запуск задачи, когда список задач завершен

Я использую Azure Functions, так что это должно быть вызвано каким-то образом, либо через триггеры blob, table, queue или timer (или какой-либо другой триггер).

Вот мои мысли о том, как я выполнил бы это:

  • принудительную новый файл в хранилище больших двоичных объектов
  • триггер Blob активируется
    • Файл обрабатывается
    • кнопочным файл хранения таблицы
    • Очистить очередь
    • Push flag to queue with visibility задержка 1 мин
  • очередь запускаемой с IQueryable<TableEntity> в качестве дополнительного входа
    • Получить все записи таблицы
    • Выполнение задачи по каждому типу файла (запись таблицы)
    • Удаления обработанных записей из таблицы

Я не очень люблю поддерживать сброс очереди ue, но если файлы X будут загружены за последнюю минуту обработки, следующая задача будет запускаться X раз, что будет потрачено впустую ресурсов, особенно если X высок. Так что действительно, в этом случае, в лучшем случае должен быть только один элемент в очереди.

Я продолжаю думать, что триггер blob с задержкой видимости может иметь больше смысла, но, насколько я знаю, этого не существует.

Так это правильный способ решить эту проблему с помощью того, что доступно? Есть ли способ лучше?

+1

Можете ли вы объяснить, что делает действие, которое вы хотите запустить для каждого отдельного типа файла? Обновляет ли файлы? Прочитайте файлы? Может ли он запускаться в одном файле более одного раза? –

+0

Предположим, что в исследовательской лаборатории несколько файлов. Триггер blob проходит через все новые файлы и стандартизирует файлы. Когда все стандартизация завершена, мы начинаем выполнять более сложную обработку и аналитику на основе каждого исследования (и может быть обновлено несколько исследований). Могу ли я запустить аналитику n раз для m исследований? Вероятно. Но я бы сэкономил массу денег и ресурсов, просто обработав несколько раз. Это также упрощает историю мониторинга, поэтому, если возникает ошибка, мы не получаем n ошибок для одного и того же исследования. –

+0

Я думаю, что это довольно странный дизайн, с которым вы идете. Как вы будете уверены, что файлы, загруженные в течение 1-минутного окна, относятся к одному и тому же набору файлов? Что делать, если одновременно загружаются два исследователя? Возможно, вы должны загрузить файлы в разных папках или просто загрузить все файлы в виде zip (если размер файла позволяет это) – sjkp

ответ

1

Задача здесь в том, что у вас есть «полная» задача, которую вы хотите запустить после загрузки файлов; но нет явного события «завершенной загрузки». Вы хотите оптимизировать лучше, чем просто выполнять полную задачу после каждой загрузки файла.

Вот некоторые варианты:

  1. код [Singleton] атрибут (https://github.com/Azure/azure-webjobs-sdk/wiki/Singleton) дает вам возможность гарантировать функцию только выполняется один раз (как распределенной блокировки). Итак, если вы тратите 100 минут на загрузку капли; и полная задача занимает 5 минут; вы будете запускать его только 20 раз, а не 100 раз.

  2. Есть предварительный просмотр Durable Functions, https://github.com/Azure/azure-functions-durable-extension, который позволяет лучше организовывать такие вещи. По сути, он позволяет выполнять Task.WhenAll по функциям Azure.

  3. У вас может быть механизм задержки, который запускает полную задачу после N минут новых загрузок. Триггер Blob мог: а) записать в общий квитанцию ​​квитанции с текущим временем; b) нажать сообщение «Очередь» с задержкой видимости N минут, а содержимое соответствует квитанции blob. В триггере очереди игнорируйте, если время не совпадает - поскольку это означает, что другая операция загрузки блога перезаписала квитанцию ​​во время вашего N-минутного окна, и поэтому загрузка блога может быть «последней».