week 11
导致系统不可用的原因有哪些?
硬件故障:cpu烧了/磁盘坏了/主板坏了
软件bug:死循环
系统发布:请求被分配到正在启动/下线的机器上
并发压力:并发量超过系统承受能力,接收请求无法处理
网络攻击:DDOS
外界影响:光线挖断了
保证稳定性的方案有哪些?
软件方面:
代码设计上保持简洁,靠封装和抽象降低复杂度,复杂度越低软件出bug的机会越小,出错也容易排查
代码review,上线前自动/人工测试
硬件方面:
设备冗余,保持一个服务有至少一个冗余的备份节点,而且能够在一个节点down掉时承受所有流量的压力
并发:
限流-》把请求量限制在系统承受能力之内,保证承受能力内的请求可以正常处理
熔断-》避免rpc级联失败
降级-》节省不重要的服务占用的资源,留给核心服务使用
异步-》提升应用服务处理能力
消息队列-》削峰填谷,平滑流量,解耦调用发起/处理方
服务最好能够无状态,无状态服务容易扩容缩容
应用服务器前放置负载均衡服务器,应用服务器dow掉提供故障转移能力
对有状态的保持调用方操作幂等,在失效重试时不会产生副作用
对数据库跨分布式事务准备事务补偿方案,可处理事务失败的情况
上游服务超时应该大于下游服务超时之和,且RPC可重试
网络攻击:
使用防火墙
系统发布:
部署时proxy先摘掉一部分机器,停止这些机器上的服务,更新可执行文件/jar包,启动服务,检测成功后再挂到proxy后面接收正常的请求
分批部署,对于回滚慢的服务,上一批机器,观察一段时间再上下一批机器
外界影响:
异地多活,比如在多个城市部署机房
实现密码校验:
单向散列
评论