【问题标题】:Restrict download file bandwidth/speed in Servlet限制 Servlet 中的下载文件带宽/速度
【发布时间】:2011-02-20 22:09:22
【问题描述】:

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

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

应限制不同的用户组使用不同的带宽。基于一些业务规则,我应该限制一些用户的下载速度。 我看到很少solutions 这样做

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

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

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

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

如果这可能是一个问题,如何避免?可能使用 nio ?

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

我们将不胜感激。

【问题讨论】:

    标签: java servlets download


    【解决方案1】:

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

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

    【讨论】:

    • 我专门为您创建了一个示例应用程序 :-)(请参阅编辑)。
    • 不错的文章,但是关于每个连接的单线程问题,这已经用 NIO 解决了很长时间。当你有足够的 RAM 时,它可以在单个线程上达到 20K 并发连接。 Tomcat 也附带 NIO,它只是默认禁用。
    【解决方案2】:

    我还担心,用户在下载过程中会创建很多并发线程,这会损害性能。

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

    是的,它可以。

    如果这可能是一个问题,如何避免?可能使用 nio ?

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-20
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多