架构师训练营 -week11- 作业
本周作业:
导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。
请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文),返回密码是否正确 boolean 值,密码加密算法使用你认为合适的加密算法。
作业 1:
导致系统不可用的原因可能有如下这些(包括但不限于):
内部原因导致:
应用系统的配置错误(发布过程中可能出现)
系统 bug(例如:慢 SQL、缓存中存在大对象、Java 应用的内存泄露造成频繁的 FullGC 等)
系统中的中间件故障(网关, MQ 等中间件不可用)
系统超过容量
外部原因导致:
大并发请求造成应用系统过载
硬件和网络故障
系统漏洞被黑客攻击, 比如 SQL 注入后删除了关键业务表或者数据库, XSS 攻击造成系统的页面执行恶意的脚本
不可抗拒的自然灾害, 如数据中心被破坏, 到数据中心的网络光纤被挖掘机挖断
保证系统高可用的方案有:
系统间解耦:通过减少依赖,逻辑上减小故障的影响范围,一方面从软件设计层面来进行优化;一方面从架构设计层面来优化,例如引入消息队列等中间件。
冗余: 避免系统应用集群的单点故障问题,小规模系统采用负载均衡,大规模系统可以考虑使用异地多活。
引用灰度发布机制:在版本升级的过程中引入预发环境发现和避免验证系统配置问题。
引入监控系统:监控系统的关键参数: 应用服务宿主机的负载, 内存, CPU, 硬盘, Linux 服务的 INode 信息; 应用服务的堆栈信息, 线程池信息,Java 进程的 GC 状况,接口的异常信息, 接口服务的调用链路节点耗时信息, 中间件和数据存储的关键参数等。
性能测试:了解系统容量的瓶颈, 在监控系统中设置合理的关键参数的预警阈值。
安全防护:防止系统被攻击,比如在网关中引入 WAF 等设备, 在 Java 应用数据库访问层适用 PrepareStatement 防止 SQL 注入,并且对系统要定期做漏扫,补丁升级等工作。
限流熔断:在系统过载的时候引入服务的限流和降级的机制防止系统过载。
评论