二.隔离
隔离:是指将系统或者资源分隔开
隔离的好处:当系统发生故障时,能限定故障的传播范围,只影响出问题的服务,其次,可以通过隔离减少服务间的资源竞争,互不影响可用性
常用隔离手段:线程隔离,进程隔离,集群隔离,机房隔离,读写隔离,快慢隔离,动静隔离,爬虫隔离
1.线程隔离:不同的请求应该用不同的线程池隔离,当某种业务请求量突然暴增时,业务线程也只会打满自己的业务线程池,不会影响其他业务,可以将耗时比较大的,或者核心业务单独放一个线程池,其他的再放另一个线程池
2.进程隔离:不同的业务系统应该隔离,比如推荐系统和商场系统,当推荐系统oom时,不会影响商场系统
3.集群隔离:为一并发较高的业务单独设置集群,比如秒杀系统,再比如灰度
4.机房隔离:防止物理原因(比如光缆断了),切流量
5.读写隔离:读取应先读取从集群,再读写主集群
6.动静隔离:静态资源可以放cdn
7.爬虫隔离:对一些恶意ip,应该进行限流,不过考虑到公司的公网ip一般是同一个。可以用ip+cookie的方式限制,或者访问带验证码
8.热点隔离:对于读热点,可以用多级缓存处理,写热点可以用缓存+队列削峰
9.资源隔离:docker容器
隔离利器,Hystrix:使用,命令模式+线程池实现线程隔离
三.限流
限流的意义:一个系统中的资源不是无限的,当流量突然暴增的时候,总有系统资源耗尽的时候,限流的意义就在于当这种情况出现时,对请求拒绝服务,排队或者等待,降级,以保护系统的可用性。
常见的限流:限制总并发,限制瞬时并发,限制时间窗口内平均速率,限制消息队列速率,限制远程调用数
限流算法:
1.令牌桶算法:
2.漏桶算法:
两者区别:
令牌桶算法是固定速率添加令牌,有令牌则处理,无令牌则拒绝,漏桶算法是固定速率处理请求,请求流入速率随意,桶满了则拒绝
令牌桶限制请求流入速率,允许一定程度突发,漏桶平滑流出速率
这两种限流算法在guava中有实现
3.服务内接口限流:信号量或原子类型
4.集群接口限流:redis+lua实现,lua脚本先检测是否超过阈值,超过则返回失败,没有超过则redis中key+1
5.接入层限流:
nginx的连接数限流模块:ngx_http_limit_conn_module与漏桶算法实现的请求限流模块:ngx_http_limit_req_module
6.节流
throttleFirst/throttleLast:在时间窗口内,如果有相同的请求,只处理第一个或者最后一个
throttleWithTimeOut:限制两个连续事件的先后执行时间间隔不小于某个时间窗口