如何在Erlang Web服务器中处理非常大的文件上传?

Aor*_*ste 5 erlang file-upload http httpserver

所以,假设我正在编写一个Web服务器,我想支持"非常大"的文件上传.让我们进一步假设我的意思是通过标准的multipart/form-data MIME类型来实现这一点.我应该说我正在使用erlang并且我计划在返回时收集http数据包erlang:decode_packet/2,但我不想实际收集请求正文,直到http请求处理程序找到了上传内容的位置.我是不是该

a)反过来收集身体,忽略了它非常大的可能性,因此可能因内存不足而导致服务器崩溃?

b)在标题处理完之后,不要在套接字上接收任何(可能不存在的)请求体?

c)做点什么?

答案c的示例可能是:产生另一个进程来收集并将上载的内容写入临时位置(以便最小化内存使用),同时将该位置提供给http请求处理程序以供将来处理.但我只是不知道 - 这里有标准技术吗?

Bru*_*man 2

在我看来,选项 b 显然是更好的选项。

在不读取套接字的时间段内,TCP 代码将继续在内核中缓冲传入数据。当它这样做时,它会向 HTTP 服务器通告越来越小的 TCP 窗口大小,直到最终(当内核中的 TCP 接收缓冲区已满时),TCP 窗口将关闭。

换句话说,通过不读取套接字,您可以让 TCP 流量控制完成其工作。