2008-11-22 86 views
2

我最近完成了一项中期traficked网站(峰值60K点击/小时)的发展,然而,该网站只需要更新一次一分钟 - 而达到所需性能可由一个单词概括:“缓存”。性能优化对高交互式网站

对于像SO这样的网站,网站上的数据总是在变化,我会想象一种不同的方法是必需的。

页面的缓存时间可能需要很短或不存在的,并且需要在所有的网络服务器很快将会传播更新,让所有的用户及时更新。

我的猜测是,你需要一个分布式缓存控制是几秒钟的顺序更新的数据和页面的服务,也许数据库进行调解写入上述分布式缓存?

那些更有经验的人可以介绍一些他们采用的确保高度互动的网站如SO的关键架构/设计原则吗?

回答

3

绝大多数网站的读取次数多于写入次数。每次写入数千甚至数百万次读取并不罕见。

因此,任何缩放解决方案都取决于将读取的缩放与写入的缩放分开。通常,缩放读取操作非常便宜且容易,缩放写入操作复杂且成本高昂。

缩放读取最直接的方法是一次缓存整个页面,并在一定的秒数后过期。如果你看看流行的网站Slashdot。你可以看到这是他们扩展网站的方式。不幸的是,这种缓存策略可能会导致最终用户的反直觉行为。

我假设你的问题是你不想要这种原始的缓存。就像你提到的那样,你需要更新缓存。

这并不像听起来那么可怕。关键要认识到的是从服务器的的角度来看。 Stackoverflow不会一直更新。它很少更新。可能每秒钟一次或两次。一秒钟到电脑几乎是永恒的。

此外,更新往往发生在缓存中不相互依赖的项目。以堆栈溢出为例。我想象每个问题页面被分开缓存。大多数问题可能在前十五分钟内平均每分钟更新一次,然后大概在一小时后更新一次。

因此,在大多数应用程序中,您几乎不需要扩展写入。他们之间的距离非常短,您可以让一台服务器执行写入操作;实际更新缓存实际上是一个完美可行的解决方案。除非您的流量非常高,否则您将很少同时对同一个缓存项目执行并发更新。

那么你如何设置?我的首选解决方案是将每个页面分别缓存到磁盘,然后让许多网站负责人从一些互相访问的空间中提供这些静态页面。

当需要完成写操作时,它只能从一台服务器完成,并且会更新该特定缓存的html页面。每个服务器都拥有它自己的缓存子集,因此没有单点故障。更新过程是精心设计的,以便事务确保没有两个请求不会在完全相同的时间写入文件。

我发现这种设计已经达到了我们迄今为止所需的所有缩放比例要求。但是,这将取决于网站的性质和负载的性质,以确定这是否适合您的项目。

3

你可能会感兴趣this article,它描述了维基媒体服务器的结构。非常有启发性!

该文章链接到this pdf - 一定不要错过它。

+0

谢谢,我来看看。 – Ben 2008-11-22 20:28:13