村头李老二 發表於 2019-8-29 09:02:00

集群、限流、缓存 BAT 大厂无非也就是这么做

<p><img src="https://img2018.cnblogs.com/blog/109211/201908/109211-20190829090014855-1830895669.jpg"></p>
<h2 id="前言">前言</h2>
<p>前阵子有网友询问,如何优化网站?这个问题真的很大,跟他简单的聊了一下,随便说了几点,觉得有必要整理一篇文章出来,正好前阵子在做爬虫博客,于是把大体思路分享出来,与大家互通有无,共同进步。</p>
<h2 id="优化">优化</h2>
<h3 id="版本一">版本一</h3>
<p><img src="https://img2018.cnblogs.com/blog/109211/201908/109211-20190829090028048-2049714450.png"></p>
<p>系统开始是这样子的,一个 Tomcat 拖着一个 MySql 服务,跑在一个 2C 4G 的Linux服务器上,所有的请求都走 Tomcat,所有的查询都走 MySql,看起来像一句废话?</p>
<p>资源是有限的,那么如何有效的利用资源,提升服务性能?Tomcat 号称能抗住数十万并发访问,但是这事也得分场景,还得有足够牛逼的机器。</p>
<h4 id="tomcat-优化">Tomcat 优化</h4>
<p>Tomcat支持以下三种模式:</p>
<ul>
<li>
<p>BIO:一个线程处理一个请求,缺点:并发量高时,线程数较多,浪费资源,Tomcat7或以下在Linux系统中默认使用这种方式。</p>
</li>
<li>
<p>NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7 必须修改Connector配置来启(conf/server.xml配置文件):</p>
</li>
</ul>
<pre><code>&lt;Connector port="8080"
              protocol="org.apache.coyote.http11.Http11NioProtocol"
              connectionTimeout="20000"
              redirectPort="8443"/&gt;
</code></pre>
<ul>
<li>APR(Apache Portable Runtime):从操作系统层面解决io阻塞问题。Linux如果安装了apr和native,Tomcat直接启动就支持apr。</li>
</ul>
<p>为了方便易用这里我们选择NIO模式,小伙伴们直接下载使用 Tomcat8 以上版本即可,连接池什么的一般使用默认的即可。</p>
<h3 id="版本二">版本二</h3>
<p><img src="https://img2018.cnblogs.com/blog/109211/201908/109211-20190829090036959-2019954216.png"></p>
<p>可能部分小伙伴知道 Tomcat 容器处理静态请求的性能力并不强,所以这里需要一款能处理静态文件请求又超牛逼的服务,这里推荐 Nginx,当然你可以使用其变种 Tengine、OpenResty 才实现动静分离。</p>
<h3 id="版本三">版本三</h3>
<p><img src="https://img2018.cnblogs.com/blog/109211/201908/109211-20190829090043644-1081393162.png"></p>
<p>后端服务链接资源是宝贵的,在高并发下,会拖慢整个系统的响应时间。这里我们可以把一些热点数据进行缓存,后端读取缓存,如果数据存在则直接返回,否则再去读取数据库。</p>
<h3 id="版本四">版本四</h3>
<p><img src="https://img2018.cnblogs.com/blog/109211/201908/109211-20190829090051231-1976413172.png"></p>
<p>资源是有限的,但用户可能是无限的,还可能有一些恶意用户、爬虫、热点搜索。为了大部门用户可以正常访问,这里我们使用前置限流,通过令牌桶算法或者漏桶算法实现多样的限流方案。</p>
<h3 id="版本五">版本五</h3>
<p><img src="https://img2018.cnblogs.com/blog/109211/201908/109211-20190829090057753-1761920921.png"></p>
<p>在博客系统中,为了提升响应速度,加入了 Redis 缓存,把文章主键 ID 作为 key 值去缓存查询,如果不存在对应的 value,就去数据库中查找 。这个时候,如果请求的并发量很大,就会对后端的数据库服务造成很大的压力。这里我们使用布隆过滤器对空命中进行拦截处理。</p>
<h3 id="终极版">终极版</h3>
<p><img src="https://img2018.cnblogs.com/blog/109211/201908/109211-20190829090105341-2077169586.png"></p>
<ul>
<li>
<p>如果仅仅对于一个博客而已一个Nginx 足够了,后面可以带多个Tomcat 做负载均衡进群</p>
</li>
<li>
<p>Nginx 应用层面做限流,后端单个服务可以做接口限流</p>
</li>
<li>
<p>后端服务用户 Session 可以集中存储到 Redis 中</p>
</li>
<li>
<p>布隆过滤拦截防止缓存穿透</p>
</li>
<li>
<p>热点数据读取 Redis 缓存</p>
</li>
<li>
<p>如有必要 Redis 、MySql 可以做主从集群</p>
</li>
</ul>
<h2 id="小结">小结</h2>
<p>优化过程可能仅仅是冰山一角,但大体思路差不多就是这个样子,发现问题然后解决问题,本来架构就是演进而来的。</p>
<h2 id="参考">参考</h2>
<p>从SpringBoot构建十万博文聊聊缓存穿透</p>
<p>SpringBoot开发案例之打造十万博文Web篇</p>
<p>从SpringBoot构建十万博文聊聊高并发文章浏览量设计</p>
<p>从0到1构建分布式秒杀系统,脱离案例讲架构都是耍流氓</p>
<p>很多小伙伴问作图工具是什么 ? 点这里:https://www.processon.com/i/58c8a5c7e4b06344137ffc14</p>


</div>
<div id="MySignature" role="contentinfo">
    <div style="font-size: small">
<img src="https://blog.52itstyle.vip/usr/uploads/6359488940289160158582279.gif">
<p>
      作者:
      小柒
</p>
<p>
      出处:
      https://blog.52itstyle.vip
</p>
<img src="https://blog.52itstyle.vip/usr/uploads/2018/08/3608211975.jpg">
<p>
分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。
</p>
<p>
         本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出,
            如有问题, 可邮件(345849402@qq.com)咨询。
</p>
</div><br><br>
来源:https://www.cnblogs.com/smallSevens/p/11427689.html
頁: [1]
查看完整版本: 集群、限流、缓存 BAT 大厂无非也就是这么做