caching - 高性能被动访问优化的动态 REST 网页

标签 caching rest servlets web-frameworks

下面的问题是关于为下面描述的 REST 启发的行为实现或已经存在的缓存框架。

目标是 GET 和 HEAD 请求应该像处理静态页面的请求一样有效。

在技​​术方面,我认为Java Servlets 和MySQL 来实现站点。 (但好的理由的出现可能仍然会影响我对技术的选择。)

网页应支持 GET、HEAD 和 POST; GET 和 HEAD 比 POST 更频繁。页面内容不会随着 GET/HEAD 改变,只有 POST 改变。因此,我想直接从文件系统提供 GET 和 HEAD 请求,并且只提供来自 servlet 的 POST 请求。

  • 第一个(稍微不完整的)想法是 POST 请求会为连续的 GET/HEAD 请求预先计算 HTML 并将其存储到文件系统中。然后 GET/HEAD 将始终从那里获取文件。我相信这可以通过条件 URL 重写在 Apache 中轻松实现。
  • 更精细的方法是,如果存在预先计算的文件,GET 将从文件系统提供 HTML(HEAD 也使用它),否则将调用 servlet 机器动态生成它。在这种情况下,POST 不会生成任何 HTML,而只会适本地更新数据库并从文件系统中删除 HTML 文件作为标志,以便使用下一个 GET/HEAD 重新生成它。第二种方法的优点是它可以更优雅地处理网页的“初始阶段”,此时尚未调用 POST。我相信这种惰性生成和存储方法可以通过提供一个错误处理程序在 Apache 中实现,该错误处理程序将在“文件未找到但应该存在”的情况下调用 servlet。

  • 在稍后的改进中,为了节省带宽,缓存的 HTML 文件也应该以 gzip 版本提供,当客户端理解时提供。我相信基 native 制应该与未压缩的 HTML 文件相同。

    由于会有很多类似 REST 的页面,因此这两种方法可能偶尔都需要一些机制来垃圾收集很少使用的 HTML 文件以节省文件空间。

    总而言之,我相信我的 GET/HEAD 优化架构可以干净利落地实现。我想首先对这个想法发表意见(我相信它很好,但我可能错了)以及是否有人已经使用过这种架构,甚至可能知道实现它的免费框架。

    最后,我想指出客户端缓存不是我所追求的解决方案,因为多个不同的客户端会 GET 或 HEAD 同一个页面。此外,如果存在预先计算的文件,我想在 GET/HEAD 请求期间绝对避免使用 servlet 机制。甚至不应调用它来在 GET/HEAD 请求中提供与缓存相关的 HTTP header ,也不应将文件转储到输出。

    问题是:
  • 是否有更好的(标准)机制可以达到开头所述的目标?
  • 如果没有,是否有人知道像我考虑的那样的现有框架?

  • 我认为 HTTP 缓存没有达到我的目标。据我了解,HTTP 缓存仍需要使用 HEAD 请求调用 servlet,以了解 POST 是否同时更改了页面。由于页面更改将在不可预知的时间点发生,因此说明过期时间的 HTTP header 还不够好。

    最佳答案

    使用过期 HTTP header 和/或 HTTP 条件请求 .

    过期

    The Expires entity-header field gives the date/time after which the response is considered stale. A stale cache entry may not normally be returned by a cache (either a proxy cache or a user agent cache) unless it is first validated with the origin server (or with an intermediate cache that has a fresh copy of the entity). See section 13.2 for further discussion of the expiration model.



    http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

    有条件的请求

    使用 Expires、Last-Modified 和/或 ETag header 装饰可缓存的响应。使用 If-Modified-Since、If-None-Match header 、If-* 等使请求有条件(参见 RFC)。

    例如
    最后响应 header :
     ...
     Expires: Wed, 15 Nov 1995 04:58:08 GMT
     ...
    

    不要在过期日期(Expires header )之前对资源执行新请求,然后执行条件请求:
    ...
    If-Modified-Since: Wed, 15 Nov 1995 04:58:08 GMT
    ...
    

    如果资源未修改,则返回 304 Not Modified 响应代码并且响应没有正文。 200 OK,否则返回带有正文的响应。

    注意:HTTP RFC 还定义了 Cache-Control header

    请参阅 HTTP 中的缓存
    http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html

    关于caching - 高性能被动访问优化的动态 REST 网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9923433/

    相关文章:

    javascript - Service Worker自动更新流程

    java - eBay Order API 在沙盒环境中抛出错误

    java - 如果处理请求体时发生异常,则不使用 Jersey 自定义 ExceptionMapper

    java - 动态 Web 项目创建中的 Eclipse 构建问题

    jsp - 如何将 Unicode 字符作为 JSP/Servlet request.getParameter 传递?

    java - 如何让 Infinispan 与 Camel 一起工作

    android - 将 Retrofit 实例保存在内存中是一种好习惯吗?

    ruby-on-rails - Rails Assets 缓存——无法设置 max-age

    java - 如何将请求正文中的列表值发送到 Rest Api

    java - 设计问题 - servlet 中异步请求的线程安全