GO 训练营第 6、7 周——可用性设计
隔离
资源分割
超时控制
良好的超时策略,保证请求不堆积,释放资源给正常的流程使用。
过载保护
拒绝服务也会消耗资源,所以过载保护无法完全保护系统
参考:
token-bucket rate limit algorithm: /x/time/rate
token-bucket rate limit algorithm: /x/time/rate
限流
单机限流
分布式限流
拒绝服务也会消耗资源,所以限流也无法完全保护系统;
系统一般需要立体保护,如客户端+服务端
熔断
挂起操作,能够在高负载、高并发时候保护系统
做法:
全关闭:google sre 熔断概率计算
半开半闭
客户端流控:避免失败时,客户积极重试
gutter 双熔断,用少量资源支撑主线熔断溢出的流量
降级
必要时减少不重要的工作,提供有损的服务
重试
问题:
客户端积极重试
内部不必要的重试:nginx upstream 重试过大;多层级重试;
解决:
约定过载条件,不进行重试
负载均衡
均衡的流量分发
动态根据机器负载进行分发,参考:The power of two choices in randomized load balancing https://ieeexplore.ieee.org/document/963420
最佳实践
以上+极限压测+故障演练
评论