使用 LAMP 作为我的游戏的服务器组件是否可行?
Is using LAMP as a server component for my game viable?
我一直在开发一个伪多人游戏,它将每个玩家的重要数据存储在我的 MySQL 数据库中。游戏与《部落冲突》类似,玩家可以建造自己的基地,也可以选择攻击其他玩家的基地。
为了防止作弊,所有重要功能都通过 PHP 在我的服务器上 运行。例如,如果玩家想要盖房子,服务器会被告知:Player wants to build BUILDING_A to grid{x,y},然后 PHP 脚本会从数据库中检查该区域是否是免费,如果玩家有技术、资金等。
这些功能都比较简单。他们只是检查谁试图访问数据库,以及他们是否可以做他们想做的事。然后服务器将更新玩家在数据库中的数据,并return向设备发送消息。
所以,基本上我的游戏将始终遵循相同的过程:
1) 播放器设备发出请求,
2) 服务器对玩家进行身份验证并允许或拒绝请求,
3) 服务器向播放器设备发送响应,设备跟随它。
但我不确定我的方法是否可行或可扩展。我只是在单独测试它并且效果很好,但假设我在第一周获得了 100 或 1000 名玩家。高峰时每秒可能有几百个服务器请求,其中调用 PHP 脚本并访问和更新数据库。如果它大受欢迎并且有成千上万的人同时访问我的 PHP 脚本和数据库怎么办?
这种方法一开始是否可行?如果我的服务器足够强大,一个 PHP 脚本可以被这么多人同时访问,并且服务器可以在一秒钟内向我的数据库写入数百次吗?它会排队操作,会忽略一些操作,重叠操作会失败吗?
例如,如果我购买了 AWS EC2 并在那里设置了我的 LAMP,这种系统是否可以工作,或者我是否会 运行 遇到某种我不知道的限制或问题的?
是的,LAMP 环境可以轻松管理每秒超过 10k 的请求。
这里只有一个建议,而不是 Apache2
服务器使用性能优于 Apache2
服务器的 Nginx
服务器。因为在大多数情况下 Nginx
仍然是更好的性能选择。
参考:https://theorganicagency.com/blog/apache-vs-nginx-performance-comparison/
如果你想自己做基准测试,你可以使用:https://www.litespeedtech.com/benchmarks/php-hello-world
因为您计划将其部署在 EC2 上,所以最初您可以使用 m5a.large,然后在流行的情况下再创建(克隆)一个 m5a.large Ubuntu 服务器并将它们都放在在 ELB 下。
祝你好运!
PHP script be accessed by so many people at the same time, and can the server write to my database hundreds of times within a second? Would it queue the operations, would it ignore some, would overlapping operations just fail?
- 每秒数百次 -- 好的。数以千计——视情况而定。
- 排队操作 -- 是的,但这相当快;这些操作将主要并行执行。
- 忽略一些 -- 不。好吧,如果他们保持排队的时间超过
lock_wait_timeout
,默认为 50 秒。 (不太可能发生。)
- 'just fail' -- 没有.
您可能应该计划有足够的 RAM 来处理所有涉及的数据。 (听起来这不会有问题。)如果查询必须过于频繁地访问磁盘,that 将成为扩展游戏的限制。 AWS EC2 使用 SSD,对吗? (HDD 会太慢。)
是否涉及图形?什么处理那个?是否完全在每个用户的客户端浏览器中?我问是因为如果重绘屏幕涉及 SQL 个查询, 那 可能是一个沉重的负担。
听起来典型的'session'是
- 启动PHP
- 连接到 MySQL
SELECT
用户信息
- 做一些PHP处理
- `更新用户信息
这会发生,平均每隔几秒发生一次。一千个用户做到这一点应该很容易实现。
假设这是一个单人游戏。相反,如果它是一款多人游戏,那么 "newly built house" 是否需要广播给所有其他用户?
首先,您可能需要寻找用您选择的语言编写的 "AJAX server" 或 "Remote Procedure Call (RPC) server" 包。您实际上不需要 "a web server" 来完成这项特定的工作。您可以找到专门针对 this 目的的更专业、更轻量级的工具。 (对于通常用于此类任务的 "containerized deployments,"。)
像 Rackspace 这样的供应商在他们的网站上写了很多关于各种部署方式的文章 "dynamically scalable servers." 我相信他们仍然有一家销售移动应用程序的公司的文章 "soccer moms." 当没有人使用该应用程序时,相应的 "containers" 不会 运行ning。当周末到来时,每个妈妈都一边翻动屏幕一边看着他们的小宝贝 运行 在田野里转来转去,可调节数量的容器动态地联机处理负载......然后最终再次消失。
所以,是的,你的推理是合理的,而且你的要求很常见。在这里你可以站在巨人的肩膀上
let's say that I get 100 or 1000 players in the first week
我认为您不必担心这个播放器数量的配置。但是我将写下您应该注意哪些可能的事情,以使您的系统足够强大以处理大流量
检查 mysql max_connections limit
查看 apache2 MaxRequestWorkers limit
了解更多信息 view this question
查看 max number of open files at system level
了解更多信息 view this
如果您的玩家数量增加,您可以使用 ELB
多个实例和 MySql Master Slave
对此没有简单的答案,但是对于在配置良好的服务器上 运行 编写良好的应用程序,逻辑的执行只需要处理请求 - 响应所花费时间的一小部分时间通常由网络往返时间和与 DBMS 对话所花费的时间决定。多用户系统经常无法扩展的地方在于处理并发性;程序员认为并行 运行 的事情需要顺序 运行 并且可以使用锁定来强制执行。因此,编程语言的选择(只要它不是 CGI,其中声明了一个程序来处理每个请求)并不那么重要。
您需要能够对这些操作中的每一个进行基准测试 - 在客户端收集有关端到端响应时间的数据并在中央位置(不一定是实时的)收集数据并收集关于应用程序中的数据库等待时间。
PHP 会话可能是主要瓶颈 - 还要尽量减少每个请求对数据库的调用次数。
我见过臃肿的 Wordpress 安装在 256Mb RAM 的情况下难以在 3 秒内处理请求,并且在合理指定的主机上不支持超过 20 个并发连接 - 我还看到内容管理系统能够在 4Mb RAM 限制下在 10 毫秒内处理请求。容量相差千倍以上
我一直在开发一个伪多人游戏,它将每个玩家的重要数据存储在我的 MySQL 数据库中。游戏与《部落冲突》类似,玩家可以建造自己的基地,也可以选择攻击其他玩家的基地。
为了防止作弊,所有重要功能都通过 PHP 在我的服务器上 运行。例如,如果玩家想要盖房子,服务器会被告知:Player wants to build BUILDING_A to grid{x,y},然后 PHP 脚本会从数据库中检查该区域是否是免费,如果玩家有技术、资金等。
这些功能都比较简单。他们只是检查谁试图访问数据库,以及他们是否可以做他们想做的事。然后服务器将更新玩家在数据库中的数据,并return向设备发送消息。
所以,基本上我的游戏将始终遵循相同的过程:
1) 播放器设备发出请求,
2) 服务器对玩家进行身份验证并允许或拒绝请求,
3) 服务器向播放器设备发送响应,设备跟随它。
但我不确定我的方法是否可行或可扩展。我只是在单独测试它并且效果很好,但假设我在第一周获得了 100 或 1000 名玩家。高峰时每秒可能有几百个服务器请求,其中调用 PHP 脚本并访问和更新数据库。如果它大受欢迎并且有成千上万的人同时访问我的 PHP 脚本和数据库怎么办?
这种方法一开始是否可行?如果我的服务器足够强大,一个 PHP 脚本可以被这么多人同时访问,并且服务器可以在一秒钟内向我的数据库写入数百次吗?它会排队操作,会忽略一些操作,重叠操作会失败吗?
例如,如果我购买了 AWS EC2 并在那里设置了我的 LAMP,这种系统是否可以工作,或者我是否会 运行 遇到某种我不知道的限制或问题的?
是的,LAMP 环境可以轻松管理每秒超过 10k 的请求。
这里只有一个建议,而不是 Apache2
服务器使用性能优于 Apache2
服务器的 Nginx
服务器。因为在大多数情况下 Nginx
仍然是更好的性能选择。
参考:https://theorganicagency.com/blog/apache-vs-nginx-performance-comparison/
如果你想自己做基准测试,你可以使用:https://www.litespeedtech.com/benchmarks/php-hello-world
因为您计划将其部署在 EC2 上,所以最初您可以使用 m5a.large,然后在流行的情况下再创建(克隆)一个 m5a.large Ubuntu 服务器并将它们都放在在 ELB 下。
祝你好运!
PHP script be accessed by so many people at the same time, and can the server write to my database hundreds of times within a second? Would it queue the operations, would it ignore some, would overlapping operations just fail?
- 每秒数百次 -- 好的。数以千计——视情况而定。
- 排队操作 -- 是的,但这相当快;这些操作将主要并行执行。
- 忽略一些 -- 不。好吧,如果他们保持排队的时间超过
lock_wait_timeout
,默认为 50 秒。 (不太可能发生。) - 'just fail' -- 没有.
您可能应该计划有足够的 RAM 来处理所有涉及的数据。 (听起来这不会有问题。)如果查询必须过于频繁地访问磁盘,that 将成为扩展游戏的限制。 AWS EC2 使用 SSD,对吗? (HDD 会太慢。)
是否涉及图形?什么处理那个?是否完全在每个用户的客户端浏览器中?我问是因为如果重绘屏幕涉及 SQL 个查询, 那 可能是一个沉重的负担。
听起来典型的'session'是
- 启动PHP
- 连接到 MySQL
SELECT
用户信息- 做一些PHP处理
- `更新用户信息
这会发生,平均每隔几秒发生一次。一千个用户做到这一点应该很容易实现。
假设这是一个单人游戏。相反,如果它是一款多人游戏,那么 "newly built house" 是否需要广播给所有其他用户?
首先,您可能需要寻找用您选择的语言编写的 "AJAX server" 或 "Remote Procedure Call (RPC) server" 包。您实际上不需要 "a web server" 来完成这项特定的工作。您可以找到专门针对 this 目的的更专业、更轻量级的工具。 (对于通常用于此类任务的 "containerized deployments,"。)
像 Rackspace 这样的供应商在他们的网站上写了很多关于各种部署方式的文章 "dynamically scalable servers." 我相信他们仍然有一家销售移动应用程序的公司的文章 "soccer moms." 当没有人使用该应用程序时,相应的 "containers" 不会 运行ning。当周末到来时,每个妈妈都一边翻动屏幕一边看着他们的小宝贝 运行 在田野里转来转去,可调节数量的容器动态地联机处理负载......然后最终再次消失。
所以,是的,你的推理是合理的,而且你的要求很常见。在这里你可以站在巨人的肩膀上
let's say that I get 100 or 1000 players in the first week
我认为您不必担心这个播放器数量的配置。但是我将写下您应该注意哪些可能的事情,以使您的系统足够强大以处理大流量
检查 mysql max_connections limit
查看 apache2 MaxRequestWorkers limit
了解更多信息 view this question
查看 max number of open files at system level
了解更多信息 view this
如果您的玩家数量增加,您可以使用 ELB
多个实例和 MySql Master Slave
对此没有简单的答案,但是对于在配置良好的服务器上 运行 编写良好的应用程序,逻辑的执行只需要处理请求 - 响应所花费时间的一小部分时间通常由网络往返时间和与 DBMS 对话所花费的时间决定。多用户系统经常无法扩展的地方在于处理并发性;程序员认为并行 运行 的事情需要顺序 运行 并且可以使用锁定来强制执行。因此,编程语言的选择(只要它不是 CGI,其中声明了一个程序来处理每个请求)并不那么重要。
您需要能够对这些操作中的每一个进行基准测试 - 在客户端收集有关端到端响应时间的数据并在中央位置(不一定是实时的)收集数据并收集关于应用程序中的数据库等待时间。
PHP 会话可能是主要瓶颈 - 还要尽量减少每个请求对数据库的调用次数。
我见过臃肿的 Wordpress 安装在 256Mb RAM 的情况下难以在 3 秒内处理请求,并且在合理指定的主机上不支持超过 20 个并发连接 - 我还看到内容管理系统能够在 4Mb RAM 限制下在 10 毫秒内处理请求。容量相差千倍以上