Только один раз уведомление с DeliveryDelay с AWS SQS - PullRequest
0 голосов
/ 09 марта 2020

В веб-приложении люди загружают файлы для обработки. Обработка файла может занять от 30 секунд до 30 минут на файл в зависимости от размера файла. В течение сеанса загрузки пользователи загружают от 1 до 20 файлов, и они могут быть загружены в нескольких пакетах, причем промежуток времени между пакетами составляет до 5 минут.

Я хочу уведомить загрузчик о завершении обработки , но также не хотят отправлять уведомление, когда первый пакет завершил обработку до того, как другой пакет был загружен в течение 2-5 минутного периода времени. Ie. загрузчик видит себя загружающим несколько пакетов файлов как один «рабочий период», который он может выполнять только каждые пару дней.

Вместо того, чтобы выполнять регулярную проверку, я реализовал уведомление с помощью AWS SQS : - по завершении каждого обрабатываемого файла сообщение отправляется в очередь с 5-минутной задержкой доставки. - когда это сообщение обрабатывается, оно проверяет, есть ли еще какой-либо обрабатываемый файл, и если нет, то отправляет уведомление по электронной почте

. Этот подход приводит к отправке нескольких электронных писем, если есть несколько файлов, которые завершают обработку за последние 5 минут обработки всех файлов.

Чтобы исправить это, я подумал об использовании очереди AQS SQS FIFO с тем же Deduplicationid, однако я понимаю, что мне нужно пройти через последнее сообщение с тот же Deduplicationid, а не первый.

Есть ли лучший способ решить эту проблему с системами, управляемыми событиями? В идеале я хочу ограничить количество необходимых очередей, так как эта система очень управляема прототипом, а также не предоставляет другого места для хранения состояния - у меня уже есть реляционная база данных.

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Вы можете использовать AWS StepFunctions для управления такими типами рабочих процессов. 1. Загрузите файлы в s3 2. Сохраните задания в DynamoDB 3. Запустите поток StepFunction с идентификатором задания 4. Последний шаг потока - отправка уведомления по электронной почте ... PROFIT!

0 голосов
/ 30 марта 2020

Мне не удалось найти способ сделать это без использования какого-либо атомного централизованного хранилища c, как предложено @Ivan Shumov

В моем случае для хранения файловых данных используется реляционная база данных и различные метрики обработки, поэтому я уточнил процесс следующим образом:

  • По завершении каждого обрабатываемого файла сообщение отправляется в очередь с 5-минутной задержкой доставки. 5 минут представляют наибольшую задержку загрузки между несколькими пакетами файлов в одном рабочем сеансе.
  • при обработке первого файла устанавливается уникальный идентификатор обработки, который сохраняется вместе с учетной записью пользователя и связывается со всеми файлами. в этом сеансе
  • при обработке этого сообщения он проверяет, обрабатывается ли еще какой-либо другой файл, и проверяет, есть ли идентификатор обработки для его пользователя.
  • , если существует идентификатор обработки против пользователя, он очищает идентификаторы обработки из записей пользователя и файла, а затем отправляет
...