背景
我目前正在开发一款游戏,用于监控外部动作(推文、FB 点赞等),并定期向用户更新这些更新信息(通过 AJAX 每 10 秒左右更新一次)。在设定的时间,所有用户都会进入 Google 街景,他们需要四处寻找标记。游戏的理念是标记会隐藏,直到用户靠近它们,因此,我们无法将它们存储在 JS 中(在源代码中查看太容易了)。因此,我们有一个 AJAX 请求,每次用户移动时都会发送纬度/经度,这样如果用户在正确的区域,我们就可以显示标记。
问题
我们同时有几百人玩这个游戏,而且预计还会有更多人玩。响应时间约为 10/20 毫秒,我们正在使用 APC,但当我们达到几百名用户时,服务器响应时间会明显变慢(尤其是当这些人在街景中跑来跑去,每秒发出一两个请求时)。
问题
我们使用的是 LAMP 堆栈,有 4GB 的 RAM(我们可以更改这一点,因为我们使用的是云),但我想知道是否有更好、更可扩展的方式来处理这个问题。我读了很多关于 Nginx 的文章,那么它是否适合添加到我们的架构中,以便同时处理更多请求?其他人如何使用 LAMP 堆栈处理这种类型的轮询?
答案1
大体上,有两种观点可以处理更多请求并更快地提供服务。一种观点是编写极其高效的代码。另一种观点是拥有极其高效的服务(服务器)。您可以尝试两者兼得,但很难实现。大多数网站都位于这两个极端之间。对于这两种方法,我建议完全切换到 nginx,如果不是只为静态文件提供服务的话,因为 nginx 在这两个方面都比 apache 好一个数量级。nginx 是非阻塞服务器,与 apache 不同,它不会像 php 那样在提供非 php 文件时产生开销。
新程序员和业余爱好者往往最终使用预制框架和平台进行开发。这些代码不是最佳的,因为它们旨在服务于大量受众。这群人认为优化他们的服务(服务器)是因为他们无法离开他们的框架,因此无法完全优化他们的代码。在这种方法中,在 Linux 上的 nginx 环境中,您可以调整服务器以从中榨取最大性能:
- 您可能想要优化您的操作系统上的 tcp 堆栈。
- 增加打开文件描述符的数量。
您可能希望将 www 目录放在 ramdisk 上。
如果您决定使用 nginx,那么您将需要增加 nginx 中的工作连接和进程以及工作器的数量。
- 您可能需要设置缓存来弥补编写错误的代码。
- 您目前正在使用 APC,它是一个对象缓存,您可能也想使用 APC 设置页面缓存,这将再次提供一个数量级的改进。
- 您可能希望对数据库查询进行内存缓存,这应该为数据库瓶颈提供空间。
- 在您的网络和数据库服务器中使用更大的缓冲区。
另一组通常是经验丰富的程序员,他们从头开始编写自己的代码,或者可以在以后的某个时间点完成,他们试图编写超高效的代码,并在“设计”工作中尽量简化,以提供在任何堆栈上都能最佳执行的精简 http 响应。我在这里没有建议,只是建议遵循各自领域权威机构的最佳实践。不过,我可以告诉你 Facebook 在这方面的故事。
Facebook 的发展历程从服务器优化到代码优化,堪称典范。Facebook 最初使用 PHP 和 Apache 构建,但很快就遇到了性能问题,于是他们开始大力优化服务器。操作系统、PHP 堆栈等一切都得到了优化。很快,他们不得不开始使用 memcache,这在我的记忆中还是不久前的事情。但很快,他们又开始遇到服务中断的问题。此时,由于无法进一步优化 PHP 本身,他们实际上将其编译为机器代码!就改进而言,这已经是极限了。现在他们只能添加更多服务器。除非他们切换语言。这也会在某个时候停止产生效益。
因此,您面前有两个选择。请明智选择!
最后,我要补充一点,您应该遵循 Yahoo Yslow 和 Google Pagespeed 上的一套方便的规则和指南来提高性能。缩小您的 JS、HTML、PHP、CSS,并相应地将其放在顶部和底部。使用 CDN。设计更轻量的页面等。祝你好运!