【问题标题】:Scalable way to share cached files across frontend servers跨前端服务器共享缓存文件的可扩展方式
【发布时间】:2014-04-11 17:26:38
【问题描述】:

我有多个后端服务器不断构建和刷新 API 的公共部分以缓存它。后端服务器的构建取决于作业队列中必须完成的工作。

一次, 后端服务器 1 将构建:

/article/1.json
/article/5.json

后端服务器 2 将构建:

/article/3.json
/article/9.json
/article/6.json

我需要从前端服务器提供这些文件。缓存存储为文件,以便 nginx 直接提供服务,而无需通过 rails 堆栈。

问题是设法以可扩展的方式使前端服务器上的缓存保持最新(添加新服务器应该是无缝的)。

我考虑过:

  • NFS / S3(但太慢)
  • Memcached(但不能直接从 nginx 提供服务 - 可能是错的?)
  • CouchDB 直接提供 JSON 服务(我觉得这对这项工作来说太大了)
  • 后端在redis中写json,前端工作在好地方重写文件(目前我最喜欢的选项)

对于实现这一目标的更好方法有什么经验或好主意吗?

【问题讨论】:

标签: ruby-on-rails caching amazon-web-services nginx


【解决方案1】:

你没有说构建一篇文章需要多长时间,但假设它不是非常慢,我认为你最好让应用服务器动态构建页面并让前端服务器来做缓存。在这个场景中,你可以在你的应用服务器前面放置一些 haproxy/varnish/squid/nginx 的组合,让它们为你做平衡/缓存。

如果你继续在后端连续构建它们,你可以做同样的事情。

你的最终目标是拥有这个:

internet -> load balancer -> caching server 1   --> numerous app servers
                         \-> caching server 2  -/

根据需要添加更多缓存服务器和应用服务器。互联网永远不会知道。根据您选择的软件,负载平衡器/缓存服务器可能相同,也可能不同。真的取决于您的负载和特定需求。

【讨论】:

  • 谢谢菲利普,你是对的,这可能是最好的方法。你也是正确的,我没有提到 API 的某些部分可能需要长达 60 秒才能呈现,这就是我不断构建缓存文件的原因,这样用户就不会在单个 API 调用中遇到冷缓存。
  • @JulienPellet 我通过将 CDN 视为键值存储来为每月处理 2-30 亿个 HTTP 请求的 SaaS 做了类似的事情。像 /article/1.json 这样的协调器文件可以包含像 `my_article("identifier", "my.server/article/1.{timestamp}.json"); 这样的 json-p 函数。因此,当需要更新文章时,它会将新副本推送到 1.123456789.json,然后更新 /article/1.json。需要注意的是,您首先需要将完整的库存存储在 CDN/varnish 数组中。
  • @David,感谢您的反馈,这几乎是我梦寐以求的版本。不幸的是,AWS 中的 CDN 失效可能需要很长时间(我见过持续超过 30 分钟的请求),因此客户端大部分时间都会有一些陈旧的数据。一个不错的选择是为此增加 CDN 上的命名空间。
【解决方案2】:

如果您不想访问 rails 堆栈,您可以在请求到达整个应用程序之前使用 rack-cache 之类的东西来捕获它:

http://rtomayko.github.io/rack-cache/

至少这样,你只需要引导机架。

还支持memcached作为存储机制:http://rtomayko.github.io/rack-cache/storage

【讨论】:

  • 甜蜜,很高兴知道,我会把它放在我的包里,看看它是否适合我的架构。谢谢。
【解决方案3】:

你是对的,通过 itlsef,S3 非常慢,尤其是 HTTPS 会话设置可能需要 5-10 秒。但是 S3 是主要数据的理想存储,我们经常使用它,但结合 S3 Nginx 代理来加快数据传输并注入缓存设施。

Nginx S3 代理解决方案在生产环境中经过良好测试,缓存机制运行良好,每个应用程序服务器都通过代理从 S3 获取原始文件进行缓存。

为了防止狗堆效应,您可以使用:

  • proxy_cache_lock 用于新文件,doc

  • proxy_cache_use_stale 更新更新文件,doc

一个S3 Nginx代理配置看这个https://gist.github.com/mikhailov/9639593

【讨论】:

  • 哇,太酷了。我必须看看这个解决方案。谢谢。
  • @JulienPellet 当然,要利用最大性能,您可以在同一位置设置 EC2 并通过 HTTP (EC2S3) 传输流量,无需加密,因为内部网络受到很好的保护
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多