限流
在高峰时,限制客户端连接的数量,一般在服务端进行。
常见的策略有:
1,令牌桶法
固定频率在桶中生成令牌,来一个客户端发放一个令牌,令牌发完了就等待或者拒绝
springcloud实现:zuul网关,gateway
dubbo:TPSLimiter
2,读取资源
读取CPU或者mem资源,到达一定门限就让客户端等待或者直接拒绝
3,细粒度的限流-信号量(自己设置一个值)限流,线程池限流
- 对请求的目标URL进行限流(例如:某个URL每分钟只允许调用多少次)
- 对客户端的访问IP进行限流(例如:某个IP每分钟只允许请求多少次)
- 对某些特定用户或者用户组进行限流(例如:非VIP用户限制每分钟只允许调用100次某个API等)
- 多维度混合的限流。此时,就需要实现一些限流规则的编排机制。与、或、非等关系。
容错
严格来说容错和熔断不是一个概念,容错包含了熔断,大部分的容错在服务端处理,而熔断一般在客户端处理。
容错处理的逻辑比正常业务可能要复杂很多。
熔断
常见策略:
1,超时
客户端调用超时则回调fallback方法
springcloud实现:hystrix
2,断路器
对某个下线的服务调用则直接返回fallback
降级
在高负载的情况下,临时下线某些非核心服务,例如著名的“双十一快递无法修改收货地址,宝贝寄往前女友家”事件,一般在服务端进行控制
常见策略:
1,服务异步调用,最终一致性即可
2,返回缓存数据,本地mock,例如dubbo中可以mock
3,直接拒绝,页面返回失败友好页