29

我是一名新手程序员,正在建立一家我(自然)希望能创造大量流量的创业公司。我在 Amazon EC2 上的 dotcloud 上托管我的 django 项目。我有一些流媒体(虽然是 Http,而不是 rmtp),所以 dotcloud 的人建议我使用 CDN。我还使用 Amazon S3 进行存储,因此决定使用 Amazon CloudFront 作为我的 CDN。

现在是我需要将注意力转向缓存的时候了,我迷失了方向。我对这个概念完全陌生。我的全部知识范围来自我刚刚阅读的教程(http://www.mnot.net/cache_docs/)和一个令人困惑的周末花在咨询谷歌上。最令人不安的是,我什至不确定我需要为我的网站做些什么。

  1. CDN 和代理服务器有什么区别?

  2. 我是否可能想要使用缓存服务(例如 memcached、redis)、CDN(CloudFront)和代理服务器(squid)?

  3. 我们的网站是数据库驱动的,并生成特定于用户位置的动态生成列表。这样的网站可以缓存吗?(列表本身可以通过 AJAX 过滤,因此 URL 可能保持不变,但产生的结果却大不相同。例如,example.com/some_url/ 可能会生成一个包含 40 个对象的列表,但只有 10 个对象出现在页面上。通过单击一个过滤器,用户最终可能会在 /some_url/ 处得到 10 个不同的对象)

  4. 高流量、内容丰富的网站的最佳做法是什么?

  5. 我怎样才能了解这一点?我所看到的每一个地方似乎都理所当然地认为一些我还没有作为我自己基础的一部分的基础知识。

我不确定我在问正确的问题。只是觉得很失落。我现在已经构建了整个站点的 95%,并认为我只是在解决细节问题,但缓存似乎是另一项重大任务。任何指导/建议/鼓励将不胜感激!

4

1 回答 1

54

那么让我们从缓存开始......

缓存是关于临时存储某些东西,这样您就不必每次都执行更昂贵的操作来检索它。

HTTP缓存是关于保存到服务器的往返,如果你只使用默认行为,浏览器会要求服务器“如果你有更新的版本,请给我发送这个资源的副本”

如果您将 expires 标头设置为将来的时间,则浏览器不会问这个问题,因为它知道它可以使用它获得的资源的副本。

此级别的缓存可改善最终用户体验并节省带宽。

根据您的简短描述,HTTP 缓存可以帮助处理较小的静态文件(阅读 bookofspeed.com 的 ch3)

数据库缓存作为memcached(和redis)用于减少数据库的负载(例如)通过将结果保存在操作中然后从缓存中提供它们而不是重复数据库操作)

在您的情况下,您将根据请求参数在数据检索层缓存(并可能确保不缓存对客户端的 HTTP 响应)。

CDN 与代理服务器...

这些是真正不同的野兽 - CDN 旨在让内容靠近访问者以减少延迟 - 如果您提供大型文件,它还会将它们放在针对它而不是您的服务器优化的网络上,但这样做需要付出£££那。某些 CDN(例如云前端)具有类似代理的行为,如果它们没有访问者想要的文件,它们会返回到您的源服务器。

代理服务器实际上是位于您的服务器和最终访问者之间的服务器 - 它们可能是您的服务器场(反向代理)、ISP 网络或访问者网络的一部分。

反向代理实质上是从您的服务器上卸载与最终访问者的通信工作,例如,如果他们的连接速度很慢,他们将占用服务器生成页面的时间更长。反向代理也可以位于多台服务器的前面——要么都做同样的事情,要么做不同的事情,并且代理向外界提供一个地址。Squid 是您可能使用的一种代理,但 Varnish 也是非常流行的 ATM。

普通代理只是充当那些通过它们的访问者的缓存,例如,公司可能在其 Internet 网关处有一个缓存代理服务器,以便访问外部站点的第一个人可以检索文件,随后的访问者从代理中获取它 - 他们获得更快的体验,公司减少带宽消耗。

我猜你目前没有高流量的网站,所以你的挑战是了解在哪里花费你的精力,即什么时候需要优化。

我的第一个建议是加入一些真正的用户监控 (RUM),即使它是使用 Boomerang.js 或 Pion 构建您自己的。还可以查看 Cacti/Munin/CollectD 等监控工具,以便了解服务器上的负载。

了解您的用户体验是确定需要优化的地方的关键。

于 2011-10-13T20:59:02.110 回答