servlet 在 Tomcat 下接受 HTTP Post 正文的节流速度

Throttle speed at which a servlet accepts an HTTP Post Body under Tomcat

我有一个 servlet,它接受大型(最多 4GB)二进制文件上传。提交的文件作为 HTTP POST.

的正文传输

servlet 在接收文件时必须执行一些耗时的处理,并且必须在发送响应之前完成这些处理。因此,在快速客户端看来服务器已挂起,因为客户端在发送最后几个字节后可能需要等待一两分钟才能收到响应。

有没有办法在 Tomcat 或 servlet API 中降低服务器接受文件的速度?我希望在客户端看来,服务器正在以(例如)10MB/秒的速度接受文件,而不是以 50MB/秒的速度接受文件,然后在收到正文后花几分钟时间 return一个回应。

谢谢。

我在这里扩展 Mark Thomas 的评论,因为我觉得这值得作为一个答案(或 答案),而不是评论。马克,如果你想自己转换评论,请告诉我,我很乐意删除我的评论。

John,您正在尝试以一种强加严格限制的方式解决您的问题:您希望将带宽限制到多少?当服务器升级到更强大的 CPU 并且可以更快地处理时会发生什么?如果同时发生多个上传怎么办?

您可能希望尽可能快地上传 4G - 想象连接在中间中断 - 在网络应用程序中,这通常意味着您必须从头开始重新上传。因此,您应该尽可能地将您的处理与上传过程分离。

您也没有提到上传的文件格式:如果它恰好是一个 zip 文件,请注意在文件完全传输之前服务器无法对该文件执行任何操作,因为 zip 文件具有目录最后的内容。 (这可能是旧知识,但至少旧规范是这样的。如果这有变化,请有人纠正我)

所以:正确的方法:接受文件进行处理,表示您已收到并正在处理。如果您愿意:完成后实施 Ajax 更新。在最简单的情况下:"click here to see if processing finished" 或频繁重新加载页面。一切正常,一切都比限制这一层的吞吐量要好。