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

时间:2012-03-29 10:19:46

标签: caching rest servlets web-frameworks

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

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

在技术方面,我想到Java Servlets和MySQL来实现这个网站。 (但出于好的理由可能仍会影响我对技术的选择。)

网页应该支持GET,HEAD和POST; GET和HEAD比POST更频繁 。只有POST才能使用GET / HEAD更改页面内容。因此,我想直接从文件系统提供GET和HEAD请求,并且只需要来自servlet的POST请求。

  1. 第一个(稍微不完整)的想法是POST请求将为连续的GET / HEAD请求预先计算HTML并将其存储到文件系统中。然后GET / HEAD将始终从那里获取文件。我相信这可以通过条件URL重写在Apache中轻松实现。
  2. 更精细的方法是GET将从文件系统提供HTML(并且HEAD也使用它),如果有预先计算的文件,否则将调用servlet机制来动态生成它。在这种情况下,POST不会生成任何HTML,但只会相应地更新数据库并从文件系统中删除HTML文件作为标志,以便使用下一个GET / HEAD重新生成它。第二种方法的优点是它更优雅地处理网页的“初始阶段”,其中尚未调用POST。我相信这种懒惰生成和存储方法可以通过提供错误处理程序在Apache中实现,该错误处理程序将在“文件未找到但应该在那里”的情况下调用servlet。
  3. 在后续的一轮改进中,为了节省带宽,缓存的HTML文件也应该以gzip-ed版本提供,该版本在客户端理解时提供。我相信基本机制应该与未压缩的HTML文件相同。

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

    总而言之,我相信我的GET / HEAD优化架构可以干净利落地实施。我想首先就这个想法提出意见(我认为它很好,但我可能错了)以及是否有人已经体验过这样的架构,甚至可能知道实现它的免费框架。

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

    问题是:

    1. 是否有更好的(标准)机制可以达到开头所述的目标?
    2. 如果没有,是否有人知道我认为的现有框架?
    3. 我认为HTTP缓存无法实现我的目标。据我所知,HTTP缓存仍然需要使用HEAD请求调用servlet,以了解POST是否同时更改了页面。由于页面更改将在不可预测的时间点发生,因此表示过期时间的HTTP标头不够好。

1 个答案:

答案 0 :(得分:1)

使用过期 HTTP标头和/或 HTTP条件请求

过期

  

Expires entity-header字段给出了响应被视为过时的日期/时间。缓存(代理缓存或用户代理缓存)通常不会返回过时的缓存条目,除非首先使用源服务器(或具有实体的新副本的中间缓存)进行验证。有关到期模型的进一步讨论,请参阅第13.2节。

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

有条件请求

使用Expires,Last-Modified和/或ETag标头装饰可缓存的响应。使用If-Modified-Since,If-None-Match标头,If- *等条件发出请求(请参阅RFC)。

e.g。 最后回复标题:

 ...
 Expires: Wed, 15 Nov 1995 04:58:08 GMT
 ...

在到期日期之前不对资源执行新请求(Expires标头),然后执行条件请求:

...
If-Modified-Since: Wed, 15 Nov 1995 04:58:08 GMT
...

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

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

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