在网站的架构设计时就要考虑稳定性:考虑到网络光纤有可能被挖断,如果只有一个机房那就悲剧了,100%的流量都没了,甚至要考虑自然灾害的影响而多地建设机房。
稳定性的建设中有两个重要因素:一是思想上重视,开发人员对稳定性的重视(也就是敬畏之心)可以避免70%~80%6的故障;二是规范和工具的建设,用以保障稳定性。
(1)架构阶段的稳定性建设项目
一个网站要有好的稳定性,必须在架构设计阶段就做长远考虑,就像建房子要先打好地基一样,否则楼建得越高越危险。建设高稳定性的架构必须注意以下几点。
避免单点。高可用架构设计的第一条就是要避免单点,从概率出发来看,无论是机器还是人,没有什么东西是不会犯错的,尽量避免某个完整的环节成为单点是架构设计的原则。但是,在某些场景中,有些功能必须放在同一个应用中,例如统一登录、网关、安全过滤等,此时要保证尽量按照人群来划分,不要在逻辑上出现单点;或者尽量把服务拆成组件迁到不同的端上执行,例如,可以把安全服务作为一个模块集成到 Nginx或者应用机器中,而不是把它做成一个远程服务接口。
分组隔离。把应用拆得更细一点,不同的功能模块做成单独的分组,每个分组占用一部分机器集群,这样可以做到服务分组隔离,避免不太重要的分组对重要分组的影响。现在非常流行的微服务就是一种非常好的分组隔离的实践。异步化。在系统设计中要让尽可能多的远程调用异步化,这也是一项重要原则。很多时候会因为一个不太重要的功能的强依赖拖垮了整个应用,所以要尽量把不太重要的依赖改成异步调用,避免影响主调用链路的稳定性。
异地容灾。考虑到很多不可抗力因素的影响,我们需要设计网站的异地容灾甚至全球部署策略,这些不可抗力的事件往往会影响网站的整个架构,必须做长远打算
(2)编码阶段的稳定性建设
编程阶段的稳定性建设尤其重要,一个好的程序在编码阶段就决定了整个应用系统的质量,所以在编码阶段要注意下面一些规则。
错误捕获。一个优雅的系统必然有一套优雅的异常处理机制,在适当的地方如1O处理、远程调用、多线程等关键处捕获异常非常重要,防御性编程可以更好地保证系统的健壮性。
异步线程。在一些批处理调用的地方采用异步线程可以保证主请求的正常返回,同样也可以做到部分的隔离,防止部分请求挂起整个应用。
超时处理。在远程调用或者调用外围设备时,非常有必要设定超时时间,这样可以保证所有的请求都有一个可预知的返回结果。
。限流保护。每个应用都有一个承载极限,超过这个极限就会带来很大的不确定性,因此,设置自我保护机制可以保证程序的健壮性。
(3)测试阶段的稳定性建设
测试是程序上线前的最后一道保障,测试也是验证程序是否达到预期功能的手段,在本阶段要注意以下事项。
自动化对比测试。对比测试就是用线上真实的环境和数据与预发环境对相同的业务接口做返回值的比较,以此判断新上线的代码是否符合预期。Beta测试。在线上的真头坏境中远取着个言机器上的数据,以此验证程序是否正确。
(4)发布阶段的稳定性建设
发布阶段稳定性建设应留意以下事项。
分批发布。分批发布可以降低发布风险,不仅可以减少系统部署重启引起的RT抖动,也可以在发现问题时立即终止发布。
多版本发布。合并部署是将多个应用系统同时部署在同一个Web容器实例中、共享同一个进程,每个应用之间相互隔离,但是应用之间的RPC是通过本地调用而不通过网络调用。
(5)运行阶段的稳定性建设项目
运行阶段稳定性建设要做好几件事:实时监控报警、过载保护和自动降级、实时数据对账,核心原则是实时发现问题,提供必要的保护措施。
实时监控报警。线上监控必须包含系统监控,主要是监控服务器的CPU、Load磁盘、内存等一些系统指标的异常情况;应用监控主要是监控响应时间、QPS异常错误等;业务监控主要是监控一些业务指标是否有异常(如实时的下单量、司机和乘客的在线数量业务指标)。
过载保护和自动降级。线上运行中的系统需要有一些保护措施,如系统的某些指标达到瓶颈时要有必要的保护;当Load达到系统的最高瓶颈时需要拒绝些请求,以防止系统被压垮;涉及一些远程调用时可以设置最大并发数,一旦超过该阀值就自动 fast fail以保护系统。
实时数据对账。这属于业务监控范围。在涉及一些敏感信息时,为了确保正确性,需要有实时的对账校验,最典型的就是资金数据,以及涉及跨单元数据复制时对数据一致性的对账检查。(6)故障发生时的稳定性建设
一旦发生故障,最重要的就是快速止损、定位故障并快速恢复。按照经验,当故障发生时,第一反应就是快速回滚了解故障现象,根据故障现象判读故障原因,进而找出解决办法。
减少故障的定位时间和快速恢复策略在故障发生时是至关重要的。
快速定位障可以缩短故障的复时间。如何定位故障?据统计,90%6的故障都是由变更所致,所以快速收集变更信息和线上机器的异常数据非常重要,但难点在于这些数据往往散落在各个地方,并且格式多样。
快速恢复。影响故障恢复时间的一是故障定位时间,二是所采用的快速恢复的手段。例如在多版本部署出现故障时,可以通过快速网站建设切换版本来恢复;在异地多活的情况下可以把流量切换到不同的单元来止损。
本文地址://cosda.cn//article/4547.html