本文记录对于高并发web架构的一些经验积累和思考,后续会就此话题继续更新。
欢迎讨论和吐槽。
写在前面
- 作为web开发工作者,高并发的处理是大家比较关心的问题之一。
- php上手简单,开发业务迭代迅速,但是他的性能一直为人们诟病。
- php7发布后,php的性能有了更近一步的提升,但是相对于c++,java来说还存在差距。
- 我们可以通过架构满足业务的高并发需求,本文主要基于此点进行讨论和记录。
- 作为php的开发者,希望可以为优化他的性能贡献一份力量,现在swoole的思路个人认为是值得学习的思考方向,
- 异步和协程的特性使用可以很好的提高性能,更好的利用服务器资源。
- 毕竟php底层是基于c实现的,我相信一定可以更好的将c的高性能和php的高效开发特性很好的结合,在大家的努力下。
高并发的处理思路
这里简单总结一些处理高并发的架构思路:
- 动态页面和静态资源分离
- 前端页面的静态化
- 多级缓存提高数据响应速度,减轻数据层压力
- 业务逻辑异步处理
- 数据分库分表,读写分离
- 业务分离,业务服务化
……
后续我会附上一个整体的结构图,对以上内容概括和整理
部分具体实施讨论
- 静分离 页面静态化
- 页面上的图片等静态化资源放在单独的服务器,且资源用不同的域名,提升浏览器获取资源的速率;
- 利用cdn,服务器文件缓存,yac缓存等进行静态化缓存,减少后端服务的压力(不推荐cdn,cdn节点的刷新效率较慢);
- 数据上动态的部分,可以在服务器层讲静态页面和从缓存获取的动态数据拼接成模板页面,在请求时直接返回给前端;
- 多级缓存
- 页面的动态数据通过缓存获取,部分数据可以直接存在yac服务本地内存,减少redis服务器通信损耗;
- 数据的缓存分为多级,第一级缓存失效,后面可以放置一层惰性非实时更新的缓存,通过定时任务等手段更新,可能数据量和存储结构较上一层
- 缓存数据而言更大更不精准。目的是尽可能的是减少直接访问db的频率;
- 可以直接使用内存+磁盘的存储模式,所有数据读取来自内存(如yac),写入的时候会异步写入多处磁盘进行备份;
- 业务异步处理
- 如使用php的swoole框架将业务更好的分离,提升代码层的执行效率,现在很多编程语言如go都是自带异步和协程的处理特性;
- 对于耗时的业务做一些特殊处理,如异步,使用长连接等;
- 数据层优化
- 高并发场景复杂且多样化,需要根据业务的具体情况有重点的去调整架构;
- 有时候对于很大的请求需求,不得不进行服务降级,减少部分服务质量和少数用户的体验换取业务的可用,下篇会举例讨论。
- 后续会继续讨论此问题,并加上详细的处理经历与大家分享。