导图社区 大厂互联网公司高可用系统设计导图
大厂互联网公司高可用系统设计,包括web攻击与防护、压测、预案、演练、告警、超时重试、服务保护、负载均衡等内容。
编辑于2024-12-20 03:13:34高可用
负载均衡
负载均衡算法
失败重试机制
健康检查机制
动态负载均衡
服务保护
限流
通过对并发访问进行限速。
用户增长过快(这是好事) 因为某个热点事件(微博热搜) 竞争对象爬虫 恶意的刷单
限流是从系统的流量入口考虑,从进入的流量上进行限制,达到保护系统的作用
限流算法
计数器算法
限流策略为在 1 秒内只允许有 100 个请求通过,算法的实现思路是第一个请求进来时计数为 1,后面每通过一个请求计数加 1。当计数满 100 后,后面的请求全部被拒绝
这种技术算法非常简单,当流量突发时,它只允许前面的请求通过,一旦计数满了,拒绝所有后续请求,这种现象称为「突刺现象」。
弊端就是,在开始的时间,访问量被使用完后,1S内会有长时间的真空期是处于接口不可用的状态的.
漏桶算法
漏桶算法可以消除「突刺现象」,其内部有一个容器,类似漏斗,当请求进来时,相当于水倒入漏斗,然后从容器中均匀地取出请求进行处理,处理速率是固定的
不管上面流量多大,都全部装进容器,下面流出的速率始终保持不变。当容器中的请求数装满了,就直接拒绝请求。
漏斗的好处就是,大批量访问进入时,漏斗有容量,不超过容量(容量的设计=固定处理的访问量*可接受等待时长)的数据都可以排队等待处理,超过的才会丢弃.
实现方式可以使用队列,队列设置容量,访问可以大批量塞入队列,满队列后丢弃后续访问量.队列的出口以固定速率拿去访问量处理. 这种方案由于出口速率是固定的,那么当就无法应对短时间的突发流量.
令牌桶算法
令牌桶算法算是漏斗算法的改进版,为了处理短时间的突发流量而做了优化
令牌桶算法能够在均匀处理请求的情况下,应对一定程度上的突发流量。
令牌流:流通令牌的管道,用于生成的令牌的流通,放入令牌桶中. 数据流:进入系统的数据流量 令牌桶:保存令牌的区域,可以理解为一个缓存区.令牌保存在这里用于使用.
算法原理 令牌桶算法会按照一定的速率生成令牌放入令牌桶,访问要进入系统时,需要从令牌桶获取令牌,有令牌的可以进入,没有的被抛弃.由于令牌桶的令牌是源源不断生成的,当访问量小时,可以留存令牌达到令牌桶的上限,这样当短时间的突发访问量来时,积累的令牌数可以处理这个问题.当访问量持续大量流入时,由于生成令牌的速率是固定的,最后也就变成了类似漏斗算法的固定流量处理.
Google开源的guava包中RateLimiter类实现了令牌桶算法,不过这是单机的.集群可以按照上面的实现方式实现,队列使用中间件MQ实现,配合负载均衡算法,考虑集群各个服务器的承压情况做对应服务器的队列是比较建议的做法
使用acquire()方法,如果没有可用令牌,会一直阻塞直到有足够的令牌。 使用tryAcquire()方法,如果没有可用令牌,就直接返回false。 使用tryAcquire()带超时时间的方法,如果没有可用令牌,就会判断在超时时间内是否可以等到令牌,如果不能,就返回false,如果可以,就阻塞等待。
应用级限流
分布式限流
接入层限流
种类
单个限流
ConcurrentHashMap+limiter
总限流
分布式限流
有哪些行为
拒绝服务
服务降级
特权请求
延时处理
降级
降级预案
自动降级/开关降级
读服务/写服务降级
多级降级
配置中心
降级
降级就是为了解决资源不足和访问量增加的矛盾
怎么做
减少强一致性就能释放更多资源
停止访问不重要的功能,从而释放出更多的资源
简化功能流程。把一些功能简化掉
吞吐量、响应时间、失败次数等达到一个阈值才进行降级处理
降级,是从系统内部的平级服务或者业务的维度考虑,流量大了,可以干掉一些,保护其他正常使用;
熔断
电闸上都有保险丝模块,当电压出现短路问题时,自动跳闸
分布式系统中,我们往往需要依赖下游服务,不管是内部系统还是第三方服务,如果下游出现问题,我们还是盲目地去请求,及时失败了多次,还是傻傻的去请求,去等待
第一,是增加了整个链路的请求时间
第二,下游系统本身就出现了问题,不断的请求又把系统问题加重了,恢复困难
熔断的作用
防止应用程序不断地尝试可能超时和失败的服务
让应用程序自我诊断下游系统的错误是否已经修正,如果没有,不放量去请求,如果请求成功了,慢慢的增加请求,再次尝试调用
阿里出的Sentinel,以及最多人使用的Hystrix
熔断强调的是服务之间的调用能实现自我恢复的状态
Hystrix
常用的容错
线程池隔离、信号量隔离、熔断、降级回退
超时重试
代理层超时与重试
web容器重试
中间件客户端超时重试
nosql客户端超时
业务超时
前端Ajax超时
隔离
线程进程隔离
请求分类交给不同线程池
集群/机房隔离
读写隔离
动静隔离
爬虫/热点隔离
使用基于serverler隔离
回滚
事务回滚
代码库回滚
部署版本回滚
数据版本回滚
静态资源版本回滚
压测、预案、演练、告警
系统压测
压测方案
压测接口/并发量/压测策略/压测指标
压测报告
机器负载/QPS/相应时间/成功率
压测方式
线下/线上压测
读写/仿真/引流/隔离集群/缩容压测
单机/集群/离散/全链路压测
系统优化和容灾
单机调优
架构优化/系统扩容
跨机房容灾
应急预案
网络接入层
DNS/LVS/HaProex
应用接入层
web接入层
服务层
数据层
故障演练
故障演练(简称演练)作为稳定性建设的重要环节,是提前发现风险的有效手段。演练的基本流程是:挖掘故障场景->模拟注入故障->(处理故障)->度量解决故障的能力(人和系统)->总结改进措施
监控报警
预防监控
风险规则管理、风险事件扫描、风险事件运营
监控
服务器监控/系统监控/JVM监控/接口监控
告警
报警策略:监控时间段、报警阀值、通知方式
故障排查
常见问题
页面展示有问题
报警
异常较多
JVM
502
nginx
问题分类
应用
业务逻辑
并发编程
JVM
死锁
存储
慢查询
数据不一致
主从延迟
大KEY
基础中间件
升级
消息积压
使用不当
不限流
基础设施
网络抖动
SLB配置
证书过期
域名劫持
流程
上线流程
数据库变更
配置变更
缓存变更
安全
幂等
风控
越权
方法
心态
不慌乱
方法
理思路
耐心
积累
预防
发现问题
渠道
报警
自我意识
业务反馈
响应问题
保留现场
提供信息
恢复服务
禁用节点
回滚
重启
扩容
降级
双重确认
业务、指标、数据
故障通告
web攻击与防护
基础安全
统一认证
授权中心
云存储
统一配置
安全平台
扫描器
防火墙
主机应用检测
反爬平台
网络入侵检查
APP反爬
源码扫描器
常见安全漏洞及检查
越权漏洞
水平越权
修改订单ID查看其他人信息
垂直越权
低级操作高级
sql注入
定义:指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息
如何避免?
采用预编译语句
JDBC
PrepareStatement
使用正则过滤传入的参数
屏蔽不安全的字符
不使用$
XSS攻击
定义:跨站脚本攻击,指攻击者在用户端注入恶意的可运行脚本,让其在用户浏览网页时运行,从而通过脚本来获得用户的信息
如何避免?
对用户输入和URL参数进行过滤,过滤脚本相关的内容
对输出进行编码
CSRF攻击
CSRF攻击也叫跨站请求伪造,攻击者通过伪造用户的浏览器请求,向用户自己曾经认证过的网站发送,使目标网站误以为使用户的真实操作而去执行命令
如何避免?
令牌机制
token验证
请求随机数
跨域参数验证
白名单
URL跳转
微信跳转认为是引流
反垃圾与风控