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

7

我们有一个高负载的Java应用程序,以集群模式工作。

我需要为我们的客户添加下载和上传文件的功能。为了存储文件,我打算使用gridFs,不确定它是否是最佳选择,但mongo可以集群化,并且mongo可以在不同节点之间复制数据。这正是我所需要的。

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

它们大多数都是以相同的方式工作:

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

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

这可能会成为servlet容器的问题吗?

如果这可能会成为问题,如何避免?可能使用nio?

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

任何帮助都将不胜感激。
2个回答

11

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

编辑:我进行了一些快速的原型设计,并利用Servlet 3.0异步处理实现了该算法。结果相当不错。完整源代码可以在GitHub上找到。祝好运!


2
我为你创建了一个示例应用程序 :-)(请参见编辑)。 - Tomasz Nurkiewicz
不错的文章,但是关于每个连接单线程问题,这个已经通过NIO解决了很久。当你有足够的RAM时,它可以在单个线程上达到20K并发连接。Tomcat也随附了NIO,只是默认情况下被禁用了。 - BalusC

1

我担心用户在下载过程中会创建大量并发线程,从而影响性能。

这可能会成为Servlet容器的问题吗?

是的,可能会。

如果这可能成为一个问题,如何避免呢?也许使用NIO?

NIO本身不会帮助解决问题。它肯定不能防止低带宽响应长时间占用线程。

我认为您需要在特殊的Web容器中实现下载。我不确定,但我认为使用异步模式的Servlet 3.0可能会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接