安全稳定第十一周作业「架构师训练营第 1 期」
导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。
系统不可用的原因,可能有硬件故障,应用本身严重 bug,系统发布时需要停机等操作,并发压力资源耗尽,垃圾回收压力,网络攻击,外部灾害,服务器宕机,网络不稳定闪断情况,光纤挖断等。
提升高可用,可以从解耦,隔离,异步,备份,失效转移,幂等性,事务补偿,重试,熔断,限流,异地多活等方式改善。
解耦,软件设计使用面向对象的设计原则与模式,使用领域驱动设计建模等工具方法。
隔离,业务与子系统隔,生产者与消费者通过消息队列隔离,使用微服务架构进行物理隔离,使用虚拟机与容器将不同业务,应用物理隔离。
异步方式,涉及多线程编程,异步通信的方式网络编程,事件驱动异步架构进行主题订阅模式。
备份的方式,主备分式,备节点不提供服务,当主节点失效,备节点自动切换变成主节点。主从,一个主节点多个从节点,读写分离等设计。集群设计,多个平等节点配合负载均衡对外提供服务。
失效转移,数据库主主失效转移,负载均衡失效转移,通过设计无状态的服务,设置连接响应一定超时与失败次数,是否需要投票等方式减少误判等确认失效进行转移。
服务的写请求保障幂等性,让失效转移重发到其它服务请求,多次处理的结果都是一样。创建交易编号,处理完成设置交易编号的状态,每次处理时先判断交易编号是否存在和状态是否完成。
事务补偿,通过逻辑层进行业务的反向操作,失败的时候,通过逆操作反向操作,让数据还原。这种方式也能实现事务的一致性。
重试,上游的超时时间要下游的超时时间之和,当服务失效或超时,则发起重试,一般写服务需要保证幂等性才可以自动重试,读服务一般可以自动重试。
熔断,减少一个服务故障时,级联让其它服务也故障,最后系统崩溃。服务故障时,当达到一定阀值,则拒绝。过一段时间,偿试放开一些请求,处于半开失败,如果后续请求也正常了,则变成开发状态。
限流,控制流量输入。计数限流,可以使用固定窗口与滑动窗口。使用令牌桶限流,往令牌桶以固定频率放令牌,没有获取令牌则不能访问,使用漏桶限流让收到的请求固定频率。自适应限流,根据系统 CPU 等指标,自动计算当前限流的参数,自动控制限流参数,达到系统最优值。
降级,当系统压力大时,停止一些非核心功能,保障核心功能正常。
异地多活,防止机房自然灾害或是停电,系统自动切换数据中心,让系统可以正常提供服务。
版权声明: 本文为 InfoQ 作者【天天向善】的原创文章。
原文链接:【http://xie.infoq.cn/article/a7845eb2ca329fefe969b5d2b】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论