在哪里存储和缓存JSON?

时间:2013-08-31 01:31:24

标签: json heroku

一直在考虑在Amazon Cloudfront上缓存我的JSON。

问题是,在更新JSON时手动清除缓存可能需要15分钟。

有没有办法将简单的JSON值存储在类似CDN的http缓存中 -

  • 在初始生成后不会触及应用程序服务器(heroku)
  • 允许我立即使缓存失效

更新

回应AdamKG的观点:

  

如果它正在“更新”,那么它不是静态的:D写一个新版本和   告诉您的服务器使用新的URL。

我的实际想法是每次html页面更改时缓存新的CloudFront网址。这是我最初的重点。

我想要JSON的原因是存储最新CloudFront网址的版本号。这样我可以进行AJAX调用以发现要加载的版本,然后进行第二次AJAX调用以实际加载内容。这样我就不需要使CloudFront内容过期,我只是重定向加载它的ajax。

但后来我遇到了需要缓存的JSON问题。我不希望人们每次想要看到单个JSON版本号时都会击中Heroku发电机。我知道memcache和机架可以帮助我提高速度,但这是一个我不想要的问题。

我有过一些想法:

  • 也许有一个第三方服务,类似于Memcache数据库,允许我在JSON网址中公开一个值?那样,我的发电机永远不会碰到。
  • 也许有一个Cloudfront的替代方案可以让手动过期更快?我知道这有点挫败了缓存的本质,但也许有更多的中介服务,比如清漆层或其他东西。

1 个答案:

答案 0 :(得分:4)

一种方法是使用资产到期,类似于Rails静态资产过期的方式。 Rails为文件名添加了哈希签名,因此application.js之类的内容变为application-abcdef1234567890.js。然后,每次用户请求您的页面时,如果application.js已更新,则脚本标记具有新地址。

以下是我设想你这样做的方法:

User → CloudFront (CDN) → Your App (Origin)

用户请求http://www.example.com/。该页面包含元标记

<meta content="1231231230" name="data-timestamp" />

基于您上次更新JSON资源的时间。如果您使用Rails,则可以从<%= Widget.order(updated_at: :desc).pluck(:updated_at).first.to_i %>之类的内容生成。

然后,在您的应用程序的JavaScript中,获取时间戳并将其用于您的JSON URL。

var timestamp = $('meta[name=data-timestamp]').attr('content');
$.get('http://cdn.example.com/data-' + timestamp + '.json', function(data, textStatus, jqXHR) {
  blah(data);
});

对CloudFront的第一个请求将在/data/data-1231231230.json点击您的原始服务器,该服务器可以永久生成和缓存。每次更新JSON时,用户都会获得一个新的URL来查询CDN。

更新

由于您提到实际页面是您要大量缓存的内容,因此您可以选择几个选项。如果您真的想在服务器前放置CloudFront,那么您唯一真正的选择是每次主页更新时发送失效请求。您可以免费每月无效1,000次,之后每1000次无效5次。此外,CloudFront失效并不快,在页面更新之前您仍会有延迟。

另一种选择是将您的内容缓存在Memcached中并从您的dynos中提供。我将根据您的询问历史假设您正在使用Ruby on Rails或其他Ruby框架(但如果您不是,请澄清)。这需要安装Rack::Cache。 Heroku上的说明用于缓存资产,但这也适用于动态内容。接下来,每次更新页面时都要使用Rack :: Cache的invalidate方法。是的,你的dyno将处理一些负载,但它将是一个简单的Memcached查找和响应。

您的服务器布局如下所示:

用户→CloudFront(CDN)→Rack :: Cache→您的应用程序(源)在cdn.example.com上 用户→Rack :: Cache→您的应用程序(Origin)在www.example.com

当您提供图片,CSS和JavaScript等静态资源时,请使用cdn.example.com域。这将通过CloudFront路由请求,并且它们将被缓存很长一段时间。对您的应用程序的请求将直接发送到您的Heroku dyno,可缓存的部分将由Rack :: Cache存储和检索。

相关问题