ФорумПрограммированиеPythonDjango → Отдача большого файла клиенту

Отдача большого файла клиенту

  • john2dark

    Сообщения: 97 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2016 г. 12:28

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

    Может кто то решал эту задачу иначе и более интересно?

    Спустя 134 сек.

    Да, основная идея то в том, что бы минимизировать ресурсо-затраты со стороны сервера.

  • phpdude

    Сообщения: 26602 Репутация: N Группа: в ухо

    Spritz 29 апреля 2016 г. 12:38, спустя 10 минут 3 секунды

    нихуясе гемор для юзера ты придумал ))

    Сапожник без сапог
  • adw0rd

    Сообщения: 22900 Репутация: N Группа: в ухо

    Spritz 29 апреля 2016 г. 12:39, спустя 59 секунд

    сжатие лучше делать прфм при отдаче, это умеют веб-сервера типа nginx/apache
    зачем тут фтп вообще не понял

    Спустя 28 сек.

    кроме шуток, какой размер реальный предпологается? гигабайт?

    adw/0
  • john2dark

    Сообщения: 97 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2016 г. 12:49, спустя 9 минут 18 секунд

    @adw0rd, пока не могу сказать, реально, предпологается, что может доходить до нескольких гигов.
    Но это всё теоретизирование, что будет на практике, я хз пока. Исхожу сразу из предположения что будет много, ибо лучше перебдеть.
    С другой стороны может ну его к Аллаху FTP и отдавать напрямую в браузер, только хотелось бы пожать на выходе.
    Да и избежать загрузки всего объема данных с базы в память.

    Спустя 161 сек.

    @phpdude, мне тут главное ресурсы свои поменьше нагрузить в этом процессе. Удобство пользователя конечно важно, но пока ресурсы важнее.

    Спустя 139 сек.

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

  • john2dark

    Сообщения: 97 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2016 г. 13:12, спустя 23 минуты 21 секунду

    А вот еще почему в сторону FTP:

    "But beware, creating zip archives on each request is bad idea and this may kill your server (not counting timeouts if the archives are large).
    Performance-wise approach is to cache generated output somewhere in filesystem and regenerate it only if source files have changed.
    Even better idea is to prepare archives in advance (eg. by cron job) and have your web server serving them as usual statics.
    "

  • phpdude

    Сообщения: 26602 Репутация: N Группа: в ухо

    Spritz 29 апреля 2016 г. 13:20, спустя 7 минут 50 секунд

    @john2dark, вопросы:

    нахуй тебе zip тут?
    нахуй тебе тут ftp? достаточно банального nginx secure link + x-accelerate (гугли)
    нахуй это гавно вообще хранить в монге? серебряная пуля?
    нахуй юзеров

    Сапожник без сапог
  • john2dark

    Сообщения: 97 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2016 г. 13:27, спустя 7 минут 28 секунд

    @phpdude, как то так:

    нахуй тебе zip тут?

    Поскольку в большей своей массе едет текстовая информация, обжать ее в зип кажется логичным, что бы сократить объём отдаваемого клиенту файла.

    нахуй тебе тут ftp? достаточно банального nginx secure link + x-accelerate (гугли)

    Вот это клёва, почитаю, спасибо. (Но файл будет лежать в системе, я правильно понимаю?)

    нахуй это гавно вообще хранить в монге? серебряная пуля?

    Текущее архитектурное решение, фигли...

    нахуй юзеров

    аминь.

    Подняли статистику за несколько лет, если усреднённо, то объем файла на выдачу будет порядка 5-20 метров.
    Но несколько клиентов в процессе работы имели данные от гига до двух. Так что я сразу ориентируюсь на общее "несколько гигов".

  • phpdude

    Сообщения: 26602 Репутация: N Группа: в ухо

    Spritz 29 апреля 2016 г. 13:30, спустя 2 минуты 21 секунду

    Вот это клёва, почитаю, спасибо. (Но файл будет лежать в системе, я правильно понимаю?)

    @john2dark, да тупо на диске

    Спустя 33 сек.

    Текущее архитектурное решение, фигли...

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

    Сапожник без сапог
  • john2dark

    Сообщения: 97 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2016 г. 13:31, спустя 1 минуту 15 секунд

    @phpdude, ну да, как раз что мне и надо.

  • phpdude

    Сообщения: 26602 Репутация: N Группа: в ухо

    Spritz 29 апреля 2016 г. 13:31, спустя 11 секунд

    Поскольку в большей своей массе едет текстовая информация, обжать ее в зип кажется логичным, что бы сократить объём отдаваемого клиенту файла.

    @john2dark, хз, может и логично, я бы прошелся максимум каким то простым и быстрым сжатием, зип слишком ресурсоемко

    Спустя 59 сек.

    gzip будет побыстрее ))

    Сапожник без сапог
  • john2dark

    Сообщения: 97 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2016 г. 15:08, спустя 1 час 36 минут 36 секунд

    @phpdude, да, обжатие простым и будет, gzip'ом.

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

    Не, не, не Дэвид Блейн, я не файлы в монге храню, не :)))
    В монге просто дохуя данных, а вот если юзер хочет это получить в виде файла PDF, к примеру, то я это буду выгонять в файл и класть-ложить на диск.

  • john2dark

    Сообщения: 97 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2016 г. 15:14, спустя 6 минут 48 секунд

    Ну вот как пример - логи, по одному процессу, в логе тьма текстовой информации, величина подобного лога может дойти в рамках одной сессии до гига, а то и перевалить.
    Лог в монге, юзер хочет его себе на диск для более тщательного анализа в виде обычного .txt
    Как мне еще отдать ему лог с минимальными затратами для меня в первую очередь и во вторую для клиента?

    Спустя 95 сек.

    Решение через файл и секьюрный линк с лёгкой обжимкой - пока единственное у меня.

  • phpdude

    Сообщения: 26602 Репутация: N Группа: в ухо

    Spritz 29 апреля 2016 г. 18:04, спустя 35 минут 47 секунд

    Хотя вот еще предлагают стримить.

    @john2dark, лучше secure link, тогда докачка будет поддерживаться ну и nginx в любом случае лучше всяких жанг справляется с отдачей любых объемов данных с диска

    Сапожник без сапог
  • Crank

    Сообщения: 541 Репутация: N Группа: Джедаи

    Spritz 29 апреля 2016 г. 18:58, спустя 53 минуты 53 секунды

    просто не надо использовать ftp, оно устарело

Пожалуйста, авторизуйтесь, чтобы написать комментарий!