高并发解决方案
更新:HHH   时间:2023-1-7


流量优化:

        防盗链

前端优化:

        减少http请求

        添加异步请求

        启用浏览器缓存和文件压缩

        cdn加速

        建立独立图片服务器

服务端优化:

        页面静态化

        并发处理(比如多线程、多进程)

        队列处理

数据库优化

        数据库缓存(redis、memcache、mongodb等)

        分库分表、分区操作

        读写分离

        负载均衡

web服务器优化

        负载均衡

                通过lvs的三种基本模式实现负载均衡

                mycat数据库中间件实现负载均衡




qps:每秒请求或查询的数量,每秒响应请求数(如http请求)

吞吐量:单位时间内处理的请求数量(通常由qps与并发数决定)

响应时间:从请求发出到收到并且响应所花时间

pv:综合浏览量,即页面浏览量或点击量(如果一个用户刷新一个页面若干次也只能算一个pv),一个访客在24小时内访问的页面数量。同一个人浏览你的网站同一个页面,只算一次pv

uv:独立访客,一定时间范围内相同访客多次访问网站,只计算为一个独立访客

日网站带宽=pv/统计时间(换算到秒)*平均页面大小(单位kb)*8(峰值一般是平均的倍数,根据实际情况来定)

并发连接数不等于qps,qps是每秒http请求数量,并发连接数是系统同时处理的请求数量







常用性能测试工具:

        ab、wrk、http_load、web bench、siege、apache jmeter

        ab全程apache benchmark,模拟多个访问者同时对某一url地址进行访问,它的测试目标基于url,可以测试apache、nginx、lighthttp、tomcat、iis等web服务器的压力

注意事项:

        测试机器与被测试机器要分开

        不对线上服务做压力测试

        观察测试工具ab所在机器,以及被测试的前端机的cpu,内存,网络等都不超过最高限度的75%




防盗链(当流量很大,但访问量没有响应大的时候,考虑这种情况)

        可以减轻服务器压力

        工作原理:通过referer或者签名,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址,一旦检测到来源不是本站即进行阻止或者返回指定页面

                referer:

                        nginx模块ngx_http_referer_module用来阻挡来源非法的域名请求。nginx指令valid_referers,全局变量$invalid_referer。

                                

                                为什么加none:因为通过浏览器访问本身就是空,要确保通过浏览器也可以访问

                                (可以通过伪造referer来进行盗链)

                加密签名:

                        使用第三方模块HttpAccessKeyModule实现Nginx防盗链

                                

                                

                                




减少http请求

        只有10%-20%响应时间花在接收请求的html文档上,剩下的80%-90%时间花在html文档所引用的组件(图片、js、css、flash等)进行的http请求上

        改善:

                合并组件数量:

                        压缩js、css等(去掉空格、回车)

                        合并js、css等

                        图标放到一个图片上(图片地图)

                图片使用base64编码减少页面请求数:

                        




http缓存

        缓存分类:

                200 ok (from memory cache):(浏览器调试工具显示)

                304 not modified:协商缓存,本地缓存失效,会去服务端请求,带头信息过去,让服务器判断该资源在服务端是否过期,如果没过期,告诉浏览器继续使用本地缓存。(快速,发送的数据少,只返回基本的响应头信息,不发送实际响应体)

                200 ok:以上两种缓存都失败,服务器返回完整响应。没用到缓存,相对较慢

                (其中,本地缓存最快,无需请求服务器)

        适合做缓存的内容:

                不变的图像,如logo、图标等

                js、css静态文件

                可下载的内容,媒体文件

        建议使用协商缓存:

                html文件(数据可能变化)

                常变动的图片

                经常修改的js、css文件

                (js、css文件的加载可以加入文件的签名来拒绝缓存,如index.css?签名、index.签名.js)

        不建议做缓存的内容:

                用户隐私等敏感数据

                经常改变的的api数据接口

        nginx本地缓存配置:

                

                

                        例子:

                                

                

                        



图片压缩:

        压缩工具:tinypng、jpegMini、imageOptim

gzip压缩




cdn(内容分发网络):

        

        cdn服务商:bat、七牛等




动态语言静态化:

        将php等动态语言逻辑代码生成静态html文件

        

        (一般框架中自带该功能。步骤:判断是否有xx.html文件,无则生成,有则返回文件内容)




并发处理:

        swoole、golang等

                例子:异步发送邮件、短信等 




数据库缓存:

        mysql自带查询缓存,但一般不用

        redis、memcache等

        redis持久化:aof、快照

        比如社交系统(微博等)的关注关系、session存入redis、




mysql数据层优化

        数据表数据类型优化

                如:ip地址,用整型存比字符串型更节省空间(php用ip2long转换存入数据库)

        索引优化

        sql语句优化

        存储引擎优化

        数据表结构设计的优化

        数据库服务器架构的优化

        (详情:https://blog.51cto.com/5660061/2386930)




web服务器的负载均衡

        七层负载均衡:基于url等应用层信息的负载均衡

                如nginx的proxy:

                        功能强大、性能卓越、运行稳定

                        配置灵活简单

                        能自动剔除工作不正常的后端服务器

                        上传文件使用异步模式

                        支持多种分配策略,可以分配权重,分配方式灵活

                        

                        

                        

                        

                        

                        

        四层负载均衡:如lvs

                

返回web开发教程...