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

时间:2011-02-20 22:09:22

标签: java servlets download

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

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

不同的用户群应受限于不同的带宽。根据一些业务规则,我应该限制某些用户的下载速度。 我看到这个

solutions很少

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:10)

Leaky buckettoken bucket算法可用于控制网络带宽。

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

答案 1 :(得分:1)

  

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

     

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

是的,它可以。

  

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

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

我认为您需要做的是在特殊的Web容器中实现下载。我不确定,但我认为使用异步模式的Servlet 3.0可以解决问题。