集群、限流、缓存 BAT 大厂无非也就是这么做
前言
前阵子有网友询问,如何优化网站?这个问题真的很大,跟他简单的聊了一下,随便说了几点,觉得有必要整理一篇文章出来,正好前阵子在做爬虫博客,于是把大体思路分享出来,与大家互通有无,共同进步。
优化
版本一
系统开始是这样子的,一个 tomcat 拖着一个 mysql 服务,跑在一个 2c 4g 的linux服务器上,所有的请求都走 tomcat,所有的查询都走 mysql,看起来像一句废话?
资源是有限的,那么如何有效的利用资源,提升服务性能?tomcat 号称能抗住数十万并发访问,但是这事也得分场景,还得有足够牛逼的机器。
tomcat 优化
tomcat支持以下三种模式:
bio:一个线程处理一个请求,缺点:并发量高时,线程数较多,浪费资源,tomcat7或以下在linux系统中默认使用这种方式。
- nio:利用java的异步io处理,可以通过少量的线程处理大量的请求。tomcat8在linux系统中默认使用这种方式。tomcat7 必须修改connector配置来启(conf/server.xml配置文件):
<connector port="8080" protocol="org.apache.coyote.http11.http11nioprotocol" connectiontimeout="20000" redirectport="8443"/>
- apr(apache portable runtime):从操作系统层面解决io阻塞问题。linux如果安装了apr和native,tomcat直接启动就支持apr。
为了方便易用这里我们选择nio模式,小伙伴们直接下载使用 tomcat8 以上版本即可,连接池什么的一般使用默认的即可。
版本二
可能部分小伙伴知道 tomcat 容器处理静态请求的性能力并不强,所以这里需要一款能处理静态文件请求又超牛逼的服务,这里推荐 nginx,当然你可以使用其变种 tengine、openresty 才实现动静分离。
版本三
后端服务链接资源是宝贵的,在高并发下,会拖慢整个系统的响应时间。这里我们可以把一些热点数据进行缓存,后端读取缓存,如果数据存在则直接返回,否则再去读取数据库。
版本四
资源是有限的,但用户可能是无限的,还可能有一些恶意用户、爬虫、热点搜索。为了大部门用户可以正常访问,这里我们使用前置限流,通过令牌桶算法或者漏桶算法实现多样的限流方案。
版本五
在博客系统中,为了提升响应速度,加入了 redis 缓存,把文章主键 id 作为 key 值去缓存查询,如果不存在对应的 value,就去数据库中查找 。这个时候,如果请求的并发量很大,就会对后端的数据库服务造成很大的压力。这里我们使用布隆过滤器对空命中进行拦截处理。
终极版
如果仅仅对于一个博客而已一个nginx 足够了,后面可以带多个tomcat 做负载均衡进群
nginx 应用层面做限流,后端单个服务可以做接口限流
后端服务用户 session 可以集中存储到 redsi 中
布隆过滤拦截防止缓存穿透
热点数据读取 redis 缓存
如有必要 redis 、mysql 可以做主从集群
小结
优化过程可能仅仅是冰山一角,但大体思路差不多就是这个样子,发现问题然后解决问题,本来架构就是演进而来的。
参考
下一篇: 面向对象写的小游戏,欢迎玩耍