集群、限流、缓存 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 可以集中存储到 Redis 中
布隆过滤拦截防止缓存穿透
热点数据读取 Redis 缓存
如有必要 Redis 、MySql 可以做主从集群
小结
优化过程可能仅仅是冰山一角,但大体思路差不多就是这个样子,发现问题然后解决问题,本来架构就是演进而来的。
参考
很多小伙伴问作图工具是什么 ? 点这里:https://www.processon.com/i/58c8a5c7e4b06344137ffc14
集群、限流、缓存 BAT 大厂无非也就是这么做的更多相关文章
- 从-99打造Sentinel高可用集群限流中间件
接上篇Sentinel集群限流探索,上次简单提到了集群限流的原理,然后用官方给的 demo 简单修改了一下,可以正常运行生效. 这一次需要更进一步,基于 Sentinel 实现内嵌式集群限流的高可用方 ...
- 快速体验 Sentinel 集群限流功能,只需简单几步
️ Pic by Alibaba Tech on Facebook 集群限流 可以限制某个资源调用在集群内的总 QPS,并且可以解决单机流量不均导致总的流控效果不佳的问题,是保障服务稳定性的利器. S ...
- 更好用的集群限流功能,Sentinel 发布 v1.4.2
摘要: 感谢 Sentinel 社区的贡献者们 ️ Sentinel 发布 v1.4.2 正式发布,该版本主要变更如下: 特性/功能改进 新增 Zuul 1.x 适配模块(sentinel-zuul- ...
- KingbaseES R6 集群创建流复制只读副本库案例
一.环境概述 [kingbase@node2 bin]$ ./ksql -U system test ksql (V8.0) Type "help" for help. test= ...
- redis高可用、redis集群、redis缓存优化
今日内容概要 redis高可用 redis集群 redis缓存优化 内容详细 1.redis高可用 # 主从复制存在的问题: 1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个sl ...
- Memcached集群:Magent缓存代理使用
小结: 先启动memcached 然后启动magent memcached -d -p 11211 -u memcached -m 64 -c 5120 memcached -d -p 11212 - ...
- 流量治理神器-Sentinel的限流模式,选单机还是集群?
大家好,架构摆渡人.这是我的第5篇原创文章,还请多多支持. 上篇文章给大家推荐了一些限流的框架,如果说硬要我推荐一款,我会推荐Sentinel,Sentinel的限流模式分为两种,分别是单机模式和集群 ...
- sentinel 集群流控原理
为什么需要集群流控呢?假设需要将某个API的总qps限制在100,机器数可能为50,这时很自然的想到使用一个专门的server来统计总的调用量,其他实例与该server通信来判断是否可以调用,这就是基 ...
- Sentinel 发布里程碑版本,添加集群流控功能
自去年10月底发布GA版本后,Sentinel在近期发布了另一个里程碑版本v1.4(最新的版本号是v1.4.1),加入了开发者关注的集群流控功能. 集群流控简介 为什么要使用集群流控呢?假设我们希望给 ...
随机推荐
- 解决tensorflow模型保存时Saver报错:TypeError: TF_SessionRun_wrapper: expected all values in input dict to be ndarray
TypeError: TF_SessionRun_wrapper: expected all values in input dict to be ndarray 对于下面的实际代码: import ...
- wp伪静态网页打开慢之提速方案1s内打开 wp的静态化插件测试
自上篇文章,我做了伪静态话.可是伪静态访问还是php动态页面,还需要服务端分析如何处理,访问页面时会发现有一个漫长的等待响应的时间.这是打开速度在4s左右.而静态页面则是直接打开,不需要服务器操作,不 ...
- PHP对接口执行效率慢的优化
PHP对接口执行效率慢的优化 PHP对接口执行效率慢的优化 造成执行效率低的原因可以由很多方面找原因 从代码层面,代码质量低,执行效率也会有很大影响的. 从硬件方面,服务器配置低,服务器配置是基础,这 ...
- maven打包添加依赖
<plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <versio ...
- Redis(四)--- Redis的命令参考
1.简述 数据类型也称数据对象,包含字符串对象(string).列表对象(list).哈希对象(hash).集合对象(set).有序集合对象(zset). 2.String数据类型命令 string ...
- Java编程基础阶段笔记 day04 Java基础语法(下)
day04 Java基础语法 (下) 笔记Notes要点 switch-case语句注意 switch-case题目(switchTest5) 循环执行顺序 if-else 实现3个整数排序 Stri ...
- 【JDK】JDK源码分析-Map
Map 接口 Map 是一个接口,它表示一种“键-值(key-value)”映射的对象(Entry),其中键是不重复的(值可以重复),且最多映射到一个值(可以理解为“映射”或者“字典”). Map 常 ...
- 认识 tomcat 被占用问题
(1) Server 中的 port 该端口为tomcat使用jvm的端口,必须保证唯一性,否则tomcat启动不成功: (2) Connector 中的 port 该端口为tomcat中所有web应 ...
- AUTOSAR学习之RTE - 基本概念
1.什么是RTE? The Run-Time Environment (RTE) is at the heart of the AUTOSAR ECU architecture. The RTE is ...
- SVG和canvas渲染的性能比较
1.什么是SVG? 描述: 一种使用XML描述的2D图形的语言 SVG基于XML意味着,SVG DOM中的每个元素都是可用的,可以为某个元素附加Javascript事件处理器. 在 SVG 中,每个被 ...