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

grigori

( ͡° ͜ʖ ͡°)
Команда форума
По сути моего проекта 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!
 

fixxxer

К.О.
Партнер клуба
А, понятно. Ты изначально упустил важную деталь - загружается в общую кучу и очередь при этом локальная вместе со всем остальным добром. Если загружать на отдельный микросервис (инстансов которого запущено сколько надо), обрабатывающий аплоады (вот прямо по прямому урлу с JWT-токеном), то все эти проблемы отпадают. Тут в большинстве случаев даже можно не париться с локальностью очереди, это не проблема, аплоады будут распределены примерно равномерно за счет балансировки, тупо по очереди + разгребалке на каждый диск (физический или логический, не важно).

А S3 - ну не знаю, почему все его хотят. Видимо, потому что никого не увольняли за покупку IBM^W AWS. Как по мне, уж если хочется AWS, разумнее через CloudFront.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Еще в 2018 не было подключаемых NAS/SAN, а самому городить Swift - проще застрелиться. Надо было юзать блочные хранилища.
Если бы у прошлой команды из Краматорской были мозги сделать отдельный микросервис - я бы, наверное, был не нужен. Но чудес не бывает.
 

fixxxer

К.О.
Партнер клуба
В варианте "для бедных" можно и без NAS, каждый файл загружать отдельным HTTP-запросом, балансировщиком раскидывать раунд-робином по инстансам микросервиса (или вообще, блин, случайный сервер из списка выбирать прямо на клиенте), и пусть себе на них локально каждая очередь гребется.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
В моем случае в одном multipart/form-data запросе шли видео, картинка, текст и служебные поля. Если два сервера - они 99% времени стоят без дела, но раз в неделю юзер заливает 300 клипов, и ждет 5 минут вместо 10 пока они обработаются.
 

WMix

герр M:)ller
Партнер клуба
я тоже не пойму в чем сложность input на js обработать и слать файлы отдельными запросами а возможно и на клиенте ресайзить
 

ksnk

прохожий
Картинки на клиенте можно ресайзить, а вот видео как ?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
браузер вы придумали, клиент десктопный на QT написан, он видео обрабатывает, запросы вчера переписали

> А Вы так не делайте.
есть такое слово - родиналегаси
 

fixxxer

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

А, кстати, зачем? Видеоредактор какой-то?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
А десктоп-апп зачем? Видеоредактор какой-то?
да, нарезать видео-ролики из диска или рипа, синкать с субтитрами на разных языках

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

fixxxer

К.О.
Партнер клуба
С мобильными приложениями проще, там за условные пару месяцев можно 99% обновить, а десктоп-апп может и 10 лет прожить.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
к счастью, я успел это исправить до того как оно пошло в прод
 
Сверху