跨前端服务器共享高速缓存文件的可扩展方式

时间:2014-03-22 13:39:04

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

我有多个后端服务器不断构建和刷新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,在好位置重写文件(目前我最喜欢的选项)

有什么经验或好主意可以更好地实现这个目标吗?

3 个答案:

答案 0 :(得分:5)

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

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

你的最终目标是拥有:

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

你是对的,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