Как мне справиться с очень большими загрузками файлов на веб-сервере Erlang? - PullRequest
5 голосов
/ 04 марта 2010

Итак, допустим, я пишу веб-сервер и хочу поддерживать «очень большие» загрузки файлов. Далее предположим, что я собираюсь сделать это через стандартный MIME-тип multipart / form-data. Я должен сказать, что я использую erlang и что я планирую собирать http-пакеты, когда они возвращаются с erlang:decode_packet/2, но я не хочу на самом деле собирать тело запроса, пока обработчик http-запроса не найдет место для загруженного контента в идти. Должен ли я

a) все равно собирать тело, игнорируя возможность его очень очень большого размера и, возможно, сбоя сервера из-за нехватки памяти?

b) воздерживаться от получения в сокет любого (возможно, несуществующего) тела запроса до тех пор, пока не будут обработаны заголовки?

в) сделать что-то еще?

Примером ответа c может быть: порождать другой процесс для сбора и записи загруженного контента во временное местоположение (чтобы минимизировать использование памяти), одновременно передавая это местоположение обработчику запросов http для дальнейшей обработки. Но я просто не знаю - есть ли здесь стандартная техника?

Ответы [ 3 ]

2 голосов
/ 06 марта 2010

На мой взгляд, вариант b явно лучший.

В течение периода времени, когда вы не читаете сокет, код TCP будет продолжать буферизовать входящие данные в ядре.При этом он будет сообщать серверу HTTP все меньший и меньший размер окна TCP, пока в конце концов (когда буферы приема TCP в ядре не заполнятся) окно TCP закроется., не читая сокет, вы позволяете контролю потока TCP выполнять свою работу.

0 голосов
/ 04 марта 2010

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

0 голосов
/ 04 марта 2010

В моей реализации я использую ваш пример для ответа c - я читаю из чанка сокета чанк и сохраняю чанки во временный файл. Кроме того, afaik yaws использует технику simillar - вы можете увидеть ее по адресу yaws / src / yaws_multipart.erl

...