【问题标题】:Jersey 1.17 rate limit泽西岛 1.17 速率限制
【发布时间】:2016-06-28 14:03:57
【问题描述】:

我想在我的 REST 服务中限制下载速率,这是我的代码:

@GET
@Path("/laboDownloadWithLimit")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response getFile()
{
    final File file = new File("SampleVideo_1280x720_50mb.mp4");

    final StreamingOutput streamingOutput = new StreamingOutput()
    {

        @Override
        public void write(
            final OutputStream outputStream)
            throws IOException, WebApplicationException
        {
            final InputStream inputStream = new FileInputStream(file);
            final byte[] buffer = new byte[2048];
            int len;
            while ((len = inputStream.read(buffer)) != -1)
            {
                outputStream.write(buffer, 0, len);
                Thread.sleep(10);
            }
        }

    };
    return Response.ok(streamingOutput)
        .type(MediaType.APPLICATION_OCTET_STREAM_TYPE)
       .header("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"" ).build();
}

但我认为存在更好的方法来解决这个问题,我应该使用什么?我正在使用 Jetty 7.4.5

【问题讨论】:

  • 你可以看看 Jetty 如何在他们的 servlet 中实现它:DataRateLimitedServlet。阅读他们的代码,我认为您的实现并不遥远。他们似乎只是使用调度程序进行写入操作,但是您已将其包装在输出中,因此应该没问题

标签: java rest jersey jetty


【解决方案1】:

你正在做的thread.sleep(10) 你可能会考虑使用一些更精确的东西,比如通用的RateLimiter

【讨论】:

    【解决方案2】:

    我认为java SDK 没有内置方法来限制输入流。我还想问为什么你想放慢速度。我必须假设您有性能或拒绝服务问题。

    使用jetty DoS Filter 可以更好地解决这些问题。我不确定每 10 毫秒强制线程上下文切换是否真的有帮助。实际上,您可能会因为不必要的频繁上下文切换而导致效率低下。您应该能够依赖您正在使用的基础架构。

    抱歉,我无法提供实际的异步或回调解决方案 :-)

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2017-05-13
      • 2013-12-21
      • 1970-01-01
      • 2011-10-14
      • 2019-03-13
      相关资源
      最近更新 更多