Чёт "внезапно" встала задача отдать файл с данными клиенту.
Как бы проблем нет, сходил в базу, забрал данные, засунул в csv или там pdf, выставил хидер и выгнал юзеру в браузер. Довольный пациент жмет скачать - профит.
А если данных дохулиард петабайт?
Данные лежат в монге.
Технически задачу можно разделить на две части, сползать в монгу с командой db.collection.stats(), стащить параметр storageSize, если значение меньше какого то порога - выгнать юзеру в браузер сразу.
Если размер больше порога, то тут уже хочется сделать чего то кошерное.
В голове пока крутится только одна идея как это сделать, а именно:
Юзеру сообщаем что файл дохуячотабольшой, но заявка принята, ожидайте.
Далее пихаем его заявку в очередь, откуда его выгребет таск, к примеру Celery, и начнёт писать файл по-блочно выбирая данные с базы (тут хотелось бы тратить ресурсы сервера по-минимуму).
По окончанию работы (хз, может еще имеет смысл зипануть этот файл (а там только текстовые данные) с low priority) юзеру пишется сообщение о том, что его файл готов и предлагается линк на файл.
Соответственно юзер будет его уже тянуть с FTP. Вот пока такая идея.
Может кто то решал эту задачу иначе и более интересно?
Да, основная идея то в том, что бы минимизировать ресурсо-затраты со стороны сервера.