容灾稳定性

SLA服务等级协议

Service Level Agreement,包括:

服务目录:如feed流(推荐信息流)

服务可用性:99.9,99.99等

服务故障恢复时间:多长时间可以恢复如10分钟

依赖性

强依赖:挂掉后用户无法使用

弱依赖:挂掉后用户可以使用,但体验不佳

核心依赖:挂掉后用户体验损伤很大

非核心依赖:挂掉后用户体验基本无损

核心概念

并发数:同一时刻处理的请求数,并发能力受限于worker数量、cpu、memory等

吞吐量QPS:每秒钟处理的请求数

响应时间:处理一个请求的响应时间

avg:平均响应时间

pct99: 99%的请求相应时间

并发数 / 平均相应时间 = qps

目标

在任何情况下,尽可能保证SLA

准则:Design for failure,墨菲定律,自动化

产品核心指标

新增,留存,活跃,营收

故障预防

超时

核心从宽,非核心从严

核心依赖:1~3 * p99.5

非核心依赖:1~2 * p99.5

重试

解决下游单机/网络抖动等问题,提高接口可用性。

重试一次会导致两倍流量,会引起雪崩。

原则是核心从宽,非核心从严。

核心依赖:1次重试+10%比例限制。非核心依赖:0次重试。

合理的超时+合理的重试+适当的缓存策略。超时timeout = 2 * time_pct99.5

熔断

为了保护下游,防止无效等待和占用资源,可以引入熔断,即一段时间内直接返回不去请求。

兜底

服务异常时,通过策略尽可能保证用户体验。如增加默认数据,Redis,local cache(热内容,上已刷等)

编码设计

良好的设计

服务职责单一、高内聚、低耦合

读写分离、部署隔离(非核心和核心分开部署)、存储隔离(不同的app不同的数据库和Redis)

服务异常外抛(有异常抛exception),api异常屏蔽

防御性编程

防御依赖(假定下游一定会有异常)、使用方(参数校验非常重要)、自己

单元测试、集成测试、故障演练

上线

防止上线带来的问题(编码+配置)

开发-》自测ci-》双人review-》上线-》小流量-》单机房-》全流量

上线检测(先小流量检测),灰度机制(小流量,单机房,全流量)。

上线过程中观察:错误日志,流量正常,监控(业务核心指标、接口和下游错误、机器负载),报警,回归线上功能。

单点

去单点:防止机器、网络局部故障,导致整体不可用。

异地双机房,无状态水平扩容,db多主。

容量

防止DAU、依赖等的动态变化,容量不足带来的异常。

流量高峰前容量排查,核心服务保证3倍高峰期容量;

压测常态化,确定服务容量,优化性能;

根据压测,设置qps上线,进行过载保护(处理不了的请求直接抛弃),定期review;

核心使用方单独集群保证容量。

监控报警

指标和日志。

指标

接口时延、流量、错误率;

依赖时延、错误率;

业务正确性;

机器指标(cpu,网卡);

正确覆盖(有问题确保要报警)。

日志

规范日志,去除无效日志;

过滤器分类,配置不同报警阈值。预期日志分类,设置预期报警阈值;非预期日志>0即报警,需要立马解决。

DEBUG/TRACE:开发人员开发/调试使用

INFO:重要业务处理流程

WARN:主业务处理流程可以继续,但需要关注

ERROR:错误需要立马处理,影响用户使用

FATAL:系统基本不可用

日志需要携带上下文信息(context),看见日志,能基本判定问题。

故障预处理

即使止损,尽可能保用户体验,最后再定位问题。

回滚:上线、配置

兜底:验证兜底是否正常生效

降级:启动降级预案,非核心依赖、接口降级

熔断:是否正常触发、更改阈值强制触发

原文地址:https://www.cnblogs.com/codingforum/p/11635502.html