架构师训练营第 0 期 - 第 11 周 - 命题作业
一、导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。
原因
硬件故障:服务器故障、各类硬件设备故障
软件bug:代码质量问题、测试不足
系统发布:往往是发布流程问题
并发压力:业务量太大,压垮了系统
网络攻击:外部恶意攻击,DDOS等等
外部灾害:网络线路断了、机房意外事故、自然灾害等等
保障手段
解耦
大多数普通公司、系统,首当其冲的问题是代码质量问题。
解耦可以使代码质量更优,问题更好定位。
在逻辑层面可以有隔离的效果
隔离
和解耦类似,是物理层面的隔离
业务与子系统隔离
微服务与中台隔离
消费者与生产者隔离
虚拟机与容器隔离
异步
多线程编程
反应式编程
异步通信网络编程
事件驱动异步架构
备份
集群设计:
多台服务器、异地、负载均衡、分布式等等特性,既可以减少单台压力,也可用提升可用性。
任何应用都要考虑单台服务器故障的问题,要考虑重要数据的备份。
数据库复制
失效转移
这点需要与备份互相配合
要设计诸如数据库失效、负载均衡失效的转移逻辑
尽量设计无状态的服务
幂等
同一个操作执行多次的情况下结果是相同的。
防止备份、失效转移的情况下产生的重复操作不影响业务最终的正确性。
事务补偿
通过执行业务逻辑逆操作,使事务回滚到事务前状态。
重试
主要是避免垃圾回收和网络抖动等概率低但难以完全避免异常情况。
熔断
设计断路器阻断对故障服务的调用,防止级联失效、防止故障影响扩大。
限流
在高并发时的保护手段
丢弃超过限额的请求,保护系统能在合理范围内运行。
几种常用算法:
计数器算法
令牌桶算法
漏桶算法
自适应限流
负反馈调节
降级
在高并发压力下,根据具体业务实际情况,关闭非核心功能,以腾出系统资源给核心功能。
异地多活
解决现实世界中的不可控因素
难点:数据一致
高可用系统的运维
发布:发布过程中需要保证发布本身的高可用
自动化测试:保障每次发布都能得到充分的测试。
自动化部署
CI/CD
预发布验证:准备预发布环境,解决测试环境和正式环境不同的问题,只供工程师访问。
代码版本控制:对代码版本、分支进行妥善管理。要有一套规范。
自动化发布
灰度发布:按一定比例发布,从低百分比开始,分步发布到全网,每步过程中逐步观察验证服务是否正常,才推进到下一步,如果有故障则回滚。
系统运行监控
监控数据采集
用户行为日志收集
服务器性能监控
业务运行数据报告
监控管理
监控系统
高可用的价值观
保持简单:使问题易于发现、快速解决。
目标明确:解决特定环境下的具体问题。
价值回归:成本收益要合理。
二、请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文)返回密码是否正确 boolean 值,密码加密算法使用你认为合适的加密算法。
评论