2016-01-04 5 views
0

Я написал веб-приложение, предназначенное для просмотра больших файлов журнала. Каждый файл журнала может превышать 500 МБ и будет содержать 100 тыс. Строк или меньше для каждого файла. Я использовал supervisord для управления запуском 8 экземпляров торнадо и nginx для перенаправления запросов на каждый из 8 экземпляров торнадо. После развертывания я заметил, что запросы блокировались, и была тонна использования памяти.Nginx и Tornado: отправка больших файлов на http-клиент

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

Я надеюсь, что кто-то может посоветовать мне лучший способ отправить большой файл клиенту для просмотра в своем веб-браузере без блокировки будущих запросов. Одновременно с загрузкой файлов журнала может находиться от 30 до 50 пользователей. Я прочитал решение this и, похоже, это то, что мне нужно, но я не знаю, является ли это лучшим решением.

ответ

0

Упомянуто Generate large file and send it IMHO является лучшим (возможно, единственным неблокирующим, не входящим в состав внутренних) способом отправки больших данных.

С другой стороны, файл чтения может быть реализован как полностью неблокирующий способ, это curio, запустив отдельный процесс cat и используя PipeIOStream. Конечно, чтение этого пути - не лучшее решение, но оно становится полезным при внедрении tail -f.

Different подход

Но лично я хотел бы использовать Nginx для этой задачи, так как вы хотите, чтобы служить большой файл и что не все (не хвост -f). Прогресс может быть реализован в js. Полезные ресурсы: