怎么解决高并发
解决高并发的整体流程大概是:
- 先进行性能评估、
- 再进行性能测试、
- 然后找到程序可以承受的临界点、最后针对出问题的地方,进行优化。
- 当然硬件设置对高并发的影响也很重要,如果达到硬件天花板,那么再怎么优化程序都是没有用的。
一:压力测试
- 会找一个时间对项目进行压测,直到压崩,找到系统最高承受压力的临界点。
- 整个过程产品、测试、开发、运维需要全程盯着。
- 每个开发都盯着自己的接口,具体分析吞吐量和响应时间。
- 找到系统的短板,进行优化。
- 最后针对每个接口做限制,设置最多可以支持多少人同时访问,多余的用户则排队等候。
二:降低峰值带宽
减少单次请求的数据量,按需拿取数据。即先加载首屏数据条数,根据用户手势滑动行为,预加载后面数据。
三:负载均衡
把任务拆分到多个单元进行执行,共同完成工作任务。
拿今日头条作为例子分析:
- 可以把评论、文章、用户信息、视频分别写一个管理系统,单独进行管理。
- 像后续添加的放映厅和西瓜视频这个模块,也单独开发一个系统,其中需要的文章、视频,用户信息这一块从对应的系统调接口获取信息。
- 像一个经常要用到的接口,比如获取用户信息这个接口,可以单独封装到一个服务里面,每次都从这个服务调接口。
- 每一个模块都在k8s上建立多个结点,分摊访问压力。
四:缓存的使用
- 前端可以把后续经常用到的信息临时保存下,等到用户下次访问时,不需要再调接口。
- 把经常需要显示的信息,存到redis中。调接口时,先查询redis中的值,如果redis中没有,再查库,然后将对应信息给存到redis上。
- 像点赞量、访问量这种经常需要计算的数据。如果有大数据相关人员,则大数据负责提供。如果没有可以写个定时任务,每隔五分钟计算一下,存到数据库中,需要信息时,直接查库就行。
- 图片、视频、一些静态资源和大文件,都先存到cdn中,可以极大的加快访问速度,节省服务器带宽。(这一块是运维组负责的,具体的我不太了解,可百度cdn缓存进行学习)
五:数据库
读写分离、分库分表
六:接口提高性能
-
for循环和if判断最多不超多三层。
-
查询接口,就只做查询,不要牵扯其他操作。
-
需要大量显示的信息,接口设计输入参数为list集合,查询也用这种方式进行查询,效率比较快。
-
代码避免重复计算。
-
避免频繁创建对象,及时释放不再使用的对象。
七:分布式可以用来解决高并发吗
分布式可以用来解决高并发。所谓分布式就是把整个项目拆分成微服务,然后按需进行扩容。
八:SpringCloud Dubbo Redis Cluster ES这些是怎么解决高并发的
SpringCloud: 把服务按模块拆分开,按照每个模块评估性能,按需扩容。
Dubbo: 把服务按模块拆分开,按照每个模块评估性能,按需扩容。
Elastic Search: 简单来说,就是把数据库的数据放到内存里,