高可用的含义是尽量减少服务的不可用(日常维护或者突发系统故障)时长,提升服务的可用时长。如何衡量一个服务的可用性呢?或许你也听说过,通常企业可能会要求服务的可用性能能够达到三个 9(也就是 99.9%)或者 4个 9 (也就是 99.99%),可是你知道这是如何计算的吗?需要重点强调的是,可用性是每一个 Go 开发者都必须关注的事情。
1. 可用性定义与高可用性三板斧
我们的目标是构建高可用的 Go 服务,那如何定义服务的可用性呢?我们又该如何提升服务的可用性呢?其实这些都是有固定套路的。
1.1 可用性定义
我们总说提升服务的可用性,可是如何衡量服务的可用性呢?如果没有一个量化的指标,你又怎么知道服务的可用性是提升了还是降低了。我们可以按照下面的方式定义服务的可用性:
其中 MTTF (Mean Time To Failure) 指的是服务的平均无故障时间,即服务从正常运行到出现故障的平均时间:MTTR ( Mean Time To Repair)指的是服务的平均修复时间(故障时间),即服务从出现故障到修复成功的平均时间。根据这个定义,我们可以计算出在不同的可用性目标下,全年服务可以接受的最长故障时间,如下表所示:
可用性级别 | 可用性目标 | 全年故障时间 | 每天故障时间 |
1 | 90% | 36.5天 | 2.4h |
2 | 99% | 3.65 天 | 14min |
3 | 99.9% | 8.76h | 86s |
4 | 99.99% | 53min | 8.6s |
当我们的可用性目标是 4 个 9(也就是 99.99%)时,全年故障时间为 53min,每天故障时间为 8.6s。也就是说,如果全年的故障时间超过 53min,那么当年的可用性指标肯定就无法达到 99.99% 了。
根据上述可用性的定义,提升服务可用性最直观的方式就是减少故障时长。如何减少呢?我们可以从两方面入手:
1)预防:尽可能避免服务发生故障。
2)故障处理:当服务发生故障时,尽可能快速地恢复服务的正常运行。当然,这样的描述还是过于泛化,具体的可用性提升方案还需要进一步细化,可以参考下表:
预防 | 故障处理 |
质量提升 | 1. 研发质量提升:比如技术方案评审,代码评审,单元测试等 2. 测试质量提升:比如白盒测试,自动化测试,仿真环境建设等 |
变更管控 | 1. 变更窗口:比如业务高峰期禁止线上变更 2. 任何变更都需要双重检查,都需要有回滚方案,都需要有检查清单 3. 灰度发布 ,小流量发布 |
容错设计 | 1. 资源隔离:比如服务部署隔离、网关侧隔离、数据库隔离等 2. 错误隔离:比如请求级的错误隔离、进程级的错误隔离、服务级的错误隔离等 3. 限流、熔断与降级:非核心功能可降级,非核心依赖可熔断 4. 故障演练 |
冗余设计 | 1. 避免单点:主备/集群化部署,服务可快速扩容 2. 容量冗余:性能评估与性能压测 3. 异地多活 |
发现 | 1.核心业务监控与报警:比如订单服务、支付服务 2. 服务可用性监控与报警:比如服务错误日志、网关侧异常状态码等 3. 基本指标的监控与报警:比如 CPU、内存、网络等 |
定位 | 1. 日志与全链路追踪:业务日志、网关侧访问日志、全链路日志 2. 监控:多维度多特征监控、容量监控、基本指标监控、端到端监控 |
止损 | 1. 流量调度:主要针对集群故障、机房故障 2.限流、熔断与降级:紧急限流、非核心功能降级、非核心依赖熔断 3. 变更回滚:针对变更引起的异常 4. 快速扩容:针对容量不足的情况 5. 服务重启 |
恢复 | 1. 复原:问题修复,数据修复,执行过的止损操作还原 2. 复盘:分析根本原因,制订改进计划 |
1.2 高可用三板斧
高可用三板斧指的是限流、熔断与降级。限流是通过对并发请求进行限速来保护自身服务;熔断是为了避免依赖的第三方服务影响自身服务;降级是通过牺牲非核心功能来保障核心功能。为什么要单独介绍限流、熔断与降级呢?因为这是构建高可用服务不可缺少的三种手段。下面将分别介绍限流、熔断与降级的基本原理。
1.2.1 限流
首先来说限流,限流是通过对并发请求进行限速来保护自身服务。当请求速率超过限制速率时,服务端可以直接拒绝请求(返回固定的错误,或者定向到错误页面),或者将请求排队等待后续处理。常见的限流方式有:限制瞬时并发数,限制单位时间窗口内的平均速率。当然,也可以根据网络连接数、网络流量、CPU 和 内存负载等进行限流。
以限制单位时间窗口内的平均速率为例,常用的限流算法有计数器算法、漏桶算法、令牌桶算法。下面我们详细介绍这几种限流算法。
(1)计数器算法
计数器算法是限流算法中最简单且最容易实现的一种算法。例如,假设我们规定某个接口的平均每秒访
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 如何利用 Go 语言开发高可用服务
发表评论 取消回复