Список имен файлов S3 со многими пользователями - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть приложение для Android и IOS, которое загружает изображения (около 15 000 в минуту) в корзину AWS S3, все в порядке, но мне нужно обработать эти изображения в веб-приложении, которое используют от 2 до 50 разных пользователей. называемый «Monitores», когда пользователь такого рода входит в систему и начинает обрабатывать изображения, приложение сканирует область S3 на наличие имен файлов, что-то вроде:

$recibidos = Storage::disk('s3recibidos');
$total_archivos = $recibidos->allfiles();

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

Процесс имен файлов заключается в сохранении в базе данных и перемещении в подкаталог.

Например:

У меня есть 1000 файлов в корзине AWS S3, и user1 вызывает процесс, поэтому массив будет иметь 1000 имен файлов для обработки, сейчас время обработки этих файлов составляет около 3 минут, поэтому до завершения процесса было добавлено 1000 новых файлов к корзине AWS S3 эти файлы не находятся в массиве user1, затем user2 входит в систему и начинает обрабатывать, поэтому прямо сейчас AWS S3 имеет новые файлы и старые файлы, затем, когда get новый массив, получает некоторые старые имена файлов (те, которые не являются процесс), фактически, когда пользователь user2 обрабатывает файлы, часть этого была недоступна, потому что процесс user1 был выполнен заданием.

Мне нужна помощь в этих двух вещах:

1.- Как бороться с процессом. 2.- Как я могу использовать подстановочные знаки, потому что один из финальных процессов меняет имя файла файлов в S3, поэтому список имен файлов, который мне нужно обработать, имеет свой конкретный формат.

Спасибо за любой совет

1 Ответ

0 голосов
/ 29 апреля 2018

Я немного запутался в вашем процессе, но давайте предположим:

  • У вас есть большое количество входящих изображений
  • Вам необходимо выполнить некоторые операции с каждым из этих экземпляров

Для этого есть два рекомендуемых подхода:

Вариант 1: без сервера

  • Настройка корзины Amazon S3 для запуска лямбда-функции AWS при каждом создании нового объекта в корзине
  • Создайте Лямбда-функцию AWS в качестве рабочего - она ​​получает информацию о каждом файле, затем обрабатывает файл
  • AWS Lambda будет автоматически масштабировать для параллельного запуска нескольких функций Lambda. По умолчанию используется до 1000 одновременных лямбда-функций, но их можно увеличить по запросу.

Вариант 2: Традиционный

  • Создание очереди Amazon SQS для хранения сведений об изображениях для обработки
  • Настройка корзины Amazon S3 для отправки события в очередь SQS при каждом создании нового объекта в корзине
  • Использование Экземпляров Amazon EC2 для запуска нескольких рабочих
  • Каждый работник считывает информацию о файле из очереди, обрабатывает изображение, а затем удаляет сообщение из очереди. Затем он повторяется, извлекая следующее сообщение из очереди.
  • Масштаб количество экземпляров EC2 и / или работников по мере необходимости

В обоих этих подходах работники работают с по одному файлу изображения за раз , поэтому у вас нет проблемы с ведением списков при непрерывном добавлении изображений. Они также отлично масштабируются без изменения кода.

...