详解PHP服务器如何在有限的资源里最大提升并发能力


Posted in PHP onMay 25, 2021

概述

假设报考app是用5W rmb 向供应商采购,报名当天涌入海量考生,并发数飙升至30W+,导致系统宕机,拒绝服务,致使考生无法报名,那么5W rmb 能否支持30W+并发呢?

不过对于我们来说,不妨把问题上升一个角度:「如何在有限的资源里最大提升服务器并发能力」。假设你是一名技术负责人,你在面对一个并发量较大的项目时会如何设计和架构呢?

首先我们可以针对这个项目捋一下大体的思路,从上述描述中不难看出,该项目的瓶颈在于「并发写」而非「读」,因此从资源分配上我们可以向「写」倾斜,在此我将数据全部写入在Redis中。除此之外,我们也需要尽量的将MySQL的读操作迁移到Redis上来,MySQL所做的工作更倾向于一些常规非并发的读写操作。

详解PHP服务器如何在有限的资源里最大提升并发能力

服务器

当用户请求过来,由负载均衡器负载到各个服务器上

详解PHP服务器如何在有限的资源里最大提升并发能力

这是一张来自symfony的压测数据,使用的是1 CPU, 4 GB and PHP 7的配置。

详解PHP服务器如何在有限的资源里最大提升并发能力

上图的数据来自于swoole官网,在加上我们在实际业务逻辑的执行之后,可以发现,当我们在使用常驻内存的启动方式时,3台更低配服务器就能解决上述需要16台才能解决的问题。

数据库

其实许多人在接触后端有一定的阶段之后都会了解,现在的许多互联网项目的瓶颈更多的集中在数据库I/O这块,各个语言之间并没有特别大的差距。包括广被大家所诟病的PHP-FPM的启动方式,也可以使用swoole等方式来替代。因此,在这个项目中,会将更多的把精力集中于数据库这一块,可以尝试使用Redis来解决,当然,在具体代码中,也需要提前准备好一定数量的数据连接池。 另外,也考虑MongoDB虽然在同等配置下的写入速度要比MySQL快得多,但是相比于Redis,还是存在明显不足。

注册登录

注册和登录其实应该分成两块来讲,二者分别对应的是「写」和「读」。在高并发读写情况下,直接使用MySQL,如你期待的那样,会爆。因此,我们在构建整个项目的过程中,可以将用户数据缓存到Redis中。 「写」的问题:在用户数量不明确且并发量较大的情况下,我更倾向于用户数据不直接入库。我们可以设计一个开关或阈值,来设置用户的入库方式,当并发大的情况下可以通过MQ来异步让用户入库,而平时则可以正常入库。

提交表单

因为该项目并非我们所常见的秒杀,且需要即时通知的,因此给我们项目的设计大大减少了难度。在提交表单的功能也跟注册类似,我们完全可以让数据异步入库,然后后台审核。

总结

其他的像CDN、MySQL是否需要主从之类的就不再赘述了,视实际情况而定。从理论上,如果使用PHP-FPM的方式,大概需要19000元/月来解决项目的这个问题,而当使用swoole时,大概需要4500元/月,在这里并没有鼓吹swoole,想说明的是当我们在面对大并发项目时,尤其是业务逻辑相对复杂,我们使用常驻内存更能解决问题,而这与语言无关。 最后,需要说明的是,上述仅是理论阶段,至于实际数据如何都需要进一步检验。文章素材来源于网络,如果有写的不正确的地方,望指出。

以上就是详解PHP服务器如何在有限的资源里最大提升并发能力的详细内容,更多关于PHP服务器如何在有限的资源里最大提升并发能力的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
人大复印资料处理程序_输入篇
Oct 09 PHP
PHP中foreach循环中使用引用要注意的地方
Jan 02 PHP
使用PHP计算两个路径的相对路径
Jun 14 PHP
php Session存储到Redis的方法
Nov 04 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
Nov 26 PHP
Laravel实现autoload方法详解
May 07 PHP
php面向对象的用户登录身份验证
Jun 08 PHP
php使用ftp实现文件上传与下载功能
Jul 21 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
PHP接口类(interface)的定义、特点和应用示例
May 18 PHP
详解PHP设计模式之依赖注入模式
阿里云服务器搭建Php+Apache运行环境的详细过程
php+laravel 扫码二维码签到功能
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
解析laravel使用workerman用户交互、服务器交互
Apr 28 #PHP
You might like
thinkphp获取栏目和文章当前位置的方法
2014/10/29 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
javascript中对对层的控制
2006/12/29 Javascript
一个js实现的所谓的滑动门
2007/05/23 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
控制台报错object is not a function的解决方法
2014/08/24 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
HTML5+setCutomValidity()函数验证表单实例分享
2015/04/24 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
js中获取键盘按下键值event.keyCode、event.charCode和event.which的兼容性详解
2017/03/15 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
Python中操作mysql的pymysql模块详解
2016/09/13 Python
python 把列表转化为字符串的方法
2018/10/23 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
python 消费 kafka 数据教程
2019/12/21 Python
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
物理教育专业求职信
2014/06/25 职场文书
保卫工作个人总结
2015/03/03 职场文书
幼儿园教师求职信
2015/03/20 职场文书
重温入党誓词主持词
2015/06/29 职场文书
学生会主席任命书
2015/09/21 职场文书
小学思品教学反思
2016/02/20 职场文书