抵御发布日流量突发的最佳实践

Posted

技术标签:

【中文标题】抵御发布日流量突发的最佳实践【英文标题】:Best practices for withstanding launch day traffic burst 【发布时间】:2010-09-12 04:33:54 【问题描述】:

我们正在为一个客户开发一个网站,该客户(一次)预计会在第一天获得大量流量。有新闻稿,人们正在写博客,等等。我有点担心我们会在第一天摔倒在地。您会考虑哪些主要事项来确保(在没有真实流量数据的情况下提前)在大型发布后您可以保持站立状态?

详细信息:这是一个L/A/M/php 堆栈,使用内部开发的 MVC 框架。目前它正在一台服务器上启动,其中包含 Apache 和 mysql,但如果需要,我们可以将其拆分。

我们已经在安装 Memcached 并尽可能多地进行 PHP 级缓存。有些页面是查询密集型的,我们使用Smarty 作为我们的模板引擎。请记住,没有时间更改这些主要方面中的任何一个——这只是设置。我们应该注意哪些事项?

【问题讨论】:

【参考方案1】:

要准备或处理峰值(或峰值)性能,我将首先确定您是否已准备好通过一些简单的性能测试,例如jmeter。

它易于设置和开始使用,并且会为您提供早期指标,以确定您是否能够处理预期的峰值负载。

但是,鉴于您的时间限制,需要采取的其他步骤是准备将吸引最多关注的静态版本的内容(例如新闻稿,如果您的发布日)。还要确保您充分利用了客户端缓存(对您的服务器的请求少一个就可以使一切变得不同)。 Web 已经为极高的可扩展性和有效使用而设计,在这些情况下,内容缓存是您最好的朋友。

当事情平静下来时,software engineering radio on the design of the new Guardian website 上有一个关于高可扩展性的精彩播客。

祝发布顺利。

【讨论】:

【参考方案2】:

先测量,再优化。你做过负载测试吗?瓶颈在哪里?

一旦您了解了瓶颈,您就可以明智地决定是否需要额外的数据库盒或网络盒。现在你只是在猜测。

另外,您的负载测试结果与您的预期流量相比如何?你能处理两倍于预期的流量吗?五次?您获得和发布额外硬件的难易程度/速度如何?我确信业务要求是在启动期间不会失败,因此请确保您有 很多 可用容量。当负载稳定并且您知道自己需要什么时,您可以随时释放它。

【讨论】:

【参考方案3】:

我个人会做一些事情

1) 放入某种负载均衡器/数据库复制系统

这意味着您可以将服务分布在多个服务器上。不能永久拥有一台以上的服务器?使用 Amazon E3 - 适合这样的事情(打开更多服务器来处理负载)

2) 某些“高负载”限制中的代码

例如,如果您的搜索效率低下 - 当负载达到一定水平时将其关闭。 “抱歉,我们正忙,请稍后再试搜索”

3) 负载测试...使用ApacheBench 之类的东西对您的服务器进行压力测试。

4) 就我个人而言,我认为关闭“Keep-Alive”连接会更好。它可能会略微降低整体性能,但是 - 这意味着如果网站达到那个水平,而不是让网站对少数人运行良好,而其他人会超时,每个人都会得到不一致的服务

Linux Format 写了一篇关于“如何在斜线点中幸存下来”的好文章……我在过去发现它很有用。我是available online as a PDF

【讨论】:

【参考方案4】:

我至少会排除所有静态内容。在其他地方设置另一个虚拟主机并将所有图形、CSS 和 javascript 加载到它上面。您可以购买一些额外的周期,卸载该类型内容的服务。如果您真的很担心,您可以注册并使用内容分发服务。现在有很多类似Akamai的,而且很便宜。

另一个想法可能是利用 Apache mod_proxy 将生成的页面输出保持特定的时间。 APC 也将非常有用...您可以使用输出缓冲捕获 + 页面上相关数据的最后修改时间,并使用 APC 缓存版本。如果页面不再有效,则重新生成并再次存储在 APC 中。

祝你好运。这将是一次学习体验!

【讨论】:

【参考方案5】:

有一个测试期,您可以在此期间允许尽可能多的用户进入,衡量您网站的性能,并在上线之前解决错误。

您可以在私人测试版中明确控制用户数量,也可以在 Google 风格的半公开测试版中控制每个用户可以提供给朋友的推荐数量。

【讨论】:

【参考方案6】:

考虑使用Varnish - 它是一个缓存反向代理服务器(类似于Squid,但用途更单一)。

我已经在它背后运行了一些相当大的网站,而且它似乎运行得非常好。

【讨论】:

【参考方案7】:

强化网站以应对高流量的基本第一步。

    使用https://browsermob.com/ 等低成本工具对您的网站进行负载测试。至少,您应该每小时查看 100K 的独立访问者。如果您从 MSN 主页获得广告,则希望每小时能够处理 500K 的独立访问者。

    将所有静态图形/视频内容移至CDN。 Edgecast 和 Amazon 是两个绝佳的选择。

    使用Jet Profiler 分析您的 MySQL 服务器以分析任何执行缓慢的查询。微小的改变可以带来巨大的好处。

【讨论】:

在昂贵的 CDN 上购买空间之前先进行衡量。你可能需要也可能不需要它,即使你得到了它,你也可能用错了。测量!

以上是关于抵御发布日流量突发的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

通过 Google drive 备份与同步 Keepass 数据库

资深CTO带来的8条Serverless最佳实践

微服务引擎的线上流量治理最佳实践

Java异常处理最佳实践及陷阱防范

Apache Flink 在双十一流量洪峰下的最佳实践

阿里云SLB最佳实践