限制Servlet中的下载文件带宽/速度

我们得到了高集负的java应用程序,它在集群模式下工作。

我需要为我们的客户添加下载和上传文件的function。 对于存储文件,我要去用户gridFs,不确定,这是最好的选择,但是mongo可以是集群的,mongo可以在diff节点之间复制数据。 这正是我所需要的。

不同的用户群应该受限于不同的带宽。 根据一些业务规则,我应该限制某些用户的下载速度。 我看到了很少的解决方案

他们中的大多数工作方式相同。

  • 读一堆字节
  • 睡眠线程
  • 重复

Mongo只是简单地为我提供了InputStrem,我可以从该流中读取并写入servlet输出流。 我不确定这是有效的方法。 另外我担心,用户可以在下载过程中创建大量的concurent线程,这可能会损害性能。

这可能是servlet容器的问题吗?

如果它可能是一个问题,怎么可以避免? 可能使用nio?

我更喜欢使用纯java解决方案。

任何帮助将受到高度赞赏。

泄漏桶或令牌桶算法可用于控制网络带宽。

编辑:我做了一些快速原型设计,并实现了利用Servlet 3.0异步处理的算法。 结果非常好。 完整的源代码可以在GitHub上找到 。 玩的开心!

另外我担心,用户可以在下载过程中创建大量的concurent线程,这可能会损害性能。

这可能是servlet容器的问题吗?

是的,它可以。

如果它可能是一个问题,怎么可以避免? 可能使用nio?

NIO 本身并没有帮助。 它肯定不会阻止低带宽响应长时间占用线程。

我认为您需要做的是在特殊的Web容器中实现下载。 我不确定,但我认为具有异步模式的Servlet 3.0可能会起到作用。