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),看见日志,能基本判定问题。
故障预处理
即使止损,尽可能保用户体验,最后再定位问题。
回滚:上线、配置
兜底:验证兜底是否正常生效
降级:启动降级预案,非核心依赖、接口降级
熔断:是否正常触发、更改阈值强制触发