如何利用 Go 语言开发高可用服务

        高可用的含义是尽量减少服务的不可用(日常维护或者突发系统故障)时长,提升服务的可用时长。如何衡量一个服务的可用性呢?或许你也听说过,通常企业可能会要求服务的可用性能能够达到三个 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语言开发,开发语言,Go,高可用)