Ресайз картинок в локальной очереди

  • Автор темы Автор темы fixxxer
  • Дата начала Дата начала
По сути моего проекта upload не бывает равномерный. Проект - клипы для изучения языков, видео со скриншотом. Изредка создатель контента загружает несколько сотен картинок и видео за раз.
Недостатки решения через локальную очередь такие:
  1. Файл пишется на диск, поэтому у приложения есть состояние. Следствие - пережать картинку можно только на том же сервере, и это нельзя распараллелить.
  2. Когда юзер загрузил свою сотню клипов, ему надо ждать N минут, пока они отресайзятся и станут доступны для использования. Что такое сейчас заставить юзеров ждать свои фотки несколько минут.
  3. Если запустить несколько ресайзов фоток параллельно, процессор будет занят, и весь API будет тормозить.
  4. Отресайзенные фотки во всех разрешениях будут лежать на S3 мертвым грузом. Как после редизайна ресайзить все их заново в новые размеры - непонятно.
  5. Запросы к фоткам проходят через приложение. Зачем - непонятно, они не приватные. Быстрее отдавать их с диска nginx.
  6. S3 тут не нужен. У всех провайдеров есть подключаемые volume по $100 за терабайт. Терабайт фоток размером 1200х1200 - это много миллионов фотографий.
  7. Nginx из коробки умеет и ресайзить, и кешировать, и держать в памяти структуру кеша, и считать ttl от последнего доступа, и чистить файлы кеша не перегружая диск. Писать такое самому - очень долго. Однако, при работе через приложение этот функционал недоступен.
Решение: выпилить очередь, картинки принимать на отдельный endpoint, файл писать в web acessible folder, и ресайзить nginx-ом на отдельном сервере. Роутер отправит аплоад картинок в отдельный сервис, тот запишет их на диск, по запросу отдаст с диска сервису ресайза, в отдельном контейнере nginx пережмет по запросу и закеширует результат.
Результат: state остается только на запись файла в хранилище исходников, остальное можно масштабировать, картинки в любом разрешении доступны мгновенно, старые ненужные thumbnail nginx удалит сам.
Самое сложное - написать на PHP обработку PUT. Оказывается, мы умеем $_FILES только для mutipart/form-data и только при POST!
 
А, понятно. Ты изначально упустил важную деталь - загружается в общую кучу и очередь при этом локальная вместе со всем остальным добром. Если загружать на отдельный микросервис (инстансов которого запущено сколько надо), обрабатывающий аплоады (вот прямо по прямому урлу с JWT-токеном), то все эти проблемы отпадают. Тут в большинстве случаев даже можно не париться с локальностью очереди, это не проблема, аплоады будут распределены примерно равномерно за счет балансировки, тупо по очереди + разгребалке на каждый диск (физический или логический, не важно).

А S3 - ну не знаю, почему все его хотят. Видимо, потому что никого не увольняли за покупку IBM^W AWS. Как по мне, уж если хочется AWS, разумнее через CloudFront.
 
Еще в 2018 не было подключаемых NAS/SAN, а самому городить Swift - проще застрелиться. Надо было юзать блочные хранилища.
Если бы у прошлой команды из Краматорской были мозги сделать отдельный микросервис - я бы, наверное, был не нужен. Но чудес не бывает.
 
В варианте "для бедных" можно и без NAS, каждый файл загружать отдельным HTTP-запросом, балансировщиком раскидывать раунд-робином по инстансам микросервиса (или вообще, блин, случайный сервер из списка выбирать прямо на клиенте), и пусть себе на них локально каждая очередь гребется.
 
В моем случае в одном multipart/form-data запросе шли видео, картинка, текст и служебные поля. Если два сервера - они 99% времени стоят без дела, но раз в неделю юзер заливает 300 клипов, и ждет 5 минут вместо 10 пока они обработаются.
 
я тоже не пойму в чем сложность input на js обработать и слать файлы отдельными запросами а возможно и на клиенте ресайзить
 
Картинки на клиенте можно ресайзить, а вот видео как ?
 
браузер вы придумали, клиент десктопный на QT написан, он видео обрабатывает, запросы вчера переписали

> А Вы так не делайте.
есть такое слово - родиналегаси
 
браузер вы придумали, клиент десктопный на QT написан
Браузер подразумеваются по умолчанию, сам понимаешь. Десктоп апп понятно, его за 30 секунд не обновишь всем клиентам. Хотя в принципе и такое можно на L7 балансировщике разрулить.

А, кстати, зачем? Видеоредактор какой-то?
 
А десктоп-апп зачем? Видеоредактор какой-то?
да, нарезать видео-ролики из диска или рипа, синкать с субтитрами на разных языках

> Браузер подразумеваются по умолчанию, сам понимаешь.
ну, клиенты сейчас чаще мобильные приложения или девайсы, 80% трафика уже с телефонов, а на JS они написаны или на Kotlin - ничего не меняет
 
С мобильными приложениями проще, там за условные пару месяцев можно 99% обновить, а десктоп-апп может и 10 лет прожить.
 
к счастью, я успел это исправить до того как оно пошло в прод
 
Сверху