【问题标题】:Slow Dynamic resource transfer in Jetty/HttpServletResponseJetty/HttpServletResponse 中缓慢的动态资源传输
【发布时间】:2015-11-06 08:29:37
【问题描述】:

我们有一个环境,每个用户都可以获得不同的 html/js/css 资源。我正在使用以下代码来压缩和传输 java 脚本资源:

public static byte[] compress(String str) throws IOException {
        if (str == null || str.length() == 0) {
            return null;
        }
        ByteArrayOutputStream obj=new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(obj);
        gzip.write(str.getBytes("UTF-8"));
        gzip.close();
        return obj.toByteArray();
}

...
HttpServletResponse raw = response.raw();
raw.setBufferSize(file.length().intValue());
ServletOutputStream servletOutputStream = raw.getOutputStream();
servletOutputStream.write(compress(FileUtils.readFileToString(file)));
servletOutputStream.flush();
servletOutputStream.close();
...

使用 chrome 网络选项卡检查问题,300KB 压缩数据的下载时间为 2 秒 - 这似乎不合理。 问题不在于带宽或码头本身,因为静态资源传输时间很快。

【问题讨论】:

    标签: java servlets jetty


    【解决方案1】:

    不知道这是否是你瓶颈的根源,但我不会这样做:

     raw.setBufferSize(file.length().intValue());
    

    如果压缩后的文件大约为 300KB,那么您可以创建比这更大的响应缓冲区。当您流式传输静态内容时,您根本不需要大的响应缓冲区。

    来自 servlet javadoc:

    设置响应正文的首选缓冲区大小。这 servlet 容器将使用至少与大小一样大的缓冲区 请求。使用的实际缓冲区大小可以使用 获取缓冲区大小。

    更大的缓冲区允许在任何内容之前写入更多内容 实际发送,从而为 servlet 提供更多时间来设置 适当的状态代码和标题。较小的缓冲区减少 服务器内存负载并允许客户端开始接收更多数据 很快。

    【讨论】:

      猜你喜欢
      • 2011-12-26
      • 1970-01-01
      • 2013-03-19
      • 2014-07-15
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多