架构师训练营第 11 周作业

用户头像
Bruce Xiong
关注
发布于: 2020 年 08 月 25 日

作业一:导致系统不可用的原因有哪些?保障系统稳定高可用的方案有哪些?请分别列举并简述。

1、导致系统不可用的原因有哪些

1)硬件故障(例如:硬盘满了、硬盘坏了、CPU烧了)

2)程序Bug (例如:某个原因导致线程死锁,导致大量线程等待;)

3)系统发布 (例如:开发、测试环境修改了表结构,部署生产机时未完成同步修改表结构,就直接部署代码;或者被运维人员不小心执行了 rm -rf /)

4)并发压力 (例如:突然某个功能遭遇并发请求,从而引起雪崩效应导致整个系统不可用)

5)网络攻击(例如:DDOS攻击,导致服务器出口带宽被打满,导致无法对正常用户提供服务)

6)外部灾害 (例如:主数据中心机房遭遇网络光纤被市政施工挖断、或者数据中心遭遇毁灭打击)

2、保障系统稳定高可用的方案有哪些

主要用以下手段和代码或者程序组织结构遵循一些软件设计原则、软件设计模式来保障系统稳定高可用。

手段:

分层 通过对系统按横向维度分成多个部分,每个部分职责单一、通过上层对下层的依赖调用完成整个系统。如:网关层 -> 业务层 -> 服务层 -> 存储层。

分割 就是对系统按纵向维度分成多个独立的模块。形成内聚低耦合的功能模块,便于分布式部署。如:会员服务、订单服务、商品服务 等。

分布式 就是根据分层分割后的系统服务部署在不同的机器,通过远程调用(RPC)、MQ将各个模块进行协作,这里不单指我们编写的服务代码、应该还包含:数据库、文件数据等。

集群 就是将独立的模块集群化,通过负载均衡共同对外提供服务,从而达到处理更多的并发。

缓存 是我们提升应用性能的第一手段,通过常会采用 CDN、反向代理、应用服务器本地缓存、分布式缓存

异步化:可以加快系统响应的速度、消除并发访问高峰(减小阻塞)、提升系统的高可用性。

负载均衡:将用户请求通过算法分流到各个集群中,从而提升系统的并发处理能力。

隔离: 故障隔离,当某一个业务或者子系统发生故障失败后,不能把这种情况传播到整个系统中,只能把故障或者失败隔离在故障系统内。

冗余:7X24小时高可用就是要服务器永不宕机、数据永不丢失 冗余就是一种解决问题的手段,所以我们的服务器要冗余运行、数据要冗余备份。

失效转移【Failover】:数据库主主失效转移、LVS失效转移、服务失效转移

重试:远程服务可能会由于线程阻塞、垃圾回收或者网络抖动,而无法即时响应返回,调用者可以通过重试的方式修复单次调用故障。需要注意的是:上游调用者超时时间要大于下游调用者超时时间之和,即调用链路最低层超时间最短,最好不要做多层次的链路调用。

幂等:应用调用失败,会重新将请求发送到其他服务器(重试),但是这个失败可能是假失败。有可能这个服务是处理成功的,只是因为网络原因调用者没有收到响应,调用者重新提交请求就会导致服务重复调用。服务重复调用是不可避免的但是我们的服务实现是需要考虑幂等问题,可以通过业务单号、状态等判断业务是否重复处理过。即:update set xxx where id = ? and status = ?

事务补偿:由于我们的系统是采用分布式架构,必然会涉及分布式事务问题,分布式事务是基于BASE原则【Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性)】。因此当事务不一致时可能需要通过业务逆向/正向操作,完成业务数据的回滚或者commit操作。

熔断:当某个服务出现故障、响应延迟或者失败率增加,继续调用该服务会导致调用者请求阻塞,资源消耗增加,从而引发更大范围的故障,这个时候就需要引入熔断机制阻断新的调用者请求该服务,直到该服务恢复正常为止。

限流:在高并发场景中如果请求量超过系统处理的最大能力,就需要将一部份用户请求丢弃,保证整个系统的高可用。同时也可以应对突然间某一服务遭遇流量洪峰而导致整个出现故障。

降级:例如在双11这类大型促销活动场景,系统在这天将处于极限高并发状态,像确认收货支付给卖方货款、评价这类非核心功能但是又会给系统产生一些压力。这时候我们可以这类非核心不影响用户成交的功能下线,将系统资源让给满足用户成交。

异地多活:在多个城市建设数据中心,形成一主多从结构,可以保证当主数据中心发生因为灾害等原因不可用时,可以转移到从数据中心提供服务。

自动化:自动化可以分为运维层、产品交付层两个方面的协作。

交付层:例如:开发人员交付测试代码后、系统可以自动的根据测试人员编写的测试脚本 自动测试出结果并反馈;当一切测试完成之后系统可以自动的完成线上发布工作。

运维层:日常的服务器巡检、日志清理、系统漏洞修复等等,都可以自动的完成。

数据采集与监控 采集用户访问行为、服务器指标、服务器日志,监控服务器状态、应用程序状态、调用链路监控等。例如:淘宝通过采集服务一些指标参数,通过算法动态调节服务最大QPS值,更大化的利用服务资源。

安全:主要涉及对外部的黑客、恶意攻击者、竞争对手的 安全防范问题,还有对内部员工的安全防范问题(例如:rm -rf / 之类的误操作、导出客户资料等等)。

解决这个问题通常会采用这些手段来处理。

1、代码安全编码规范(例如:不能明文保存密码、敏感数据加密保存、接口防重放机制、防刷机制、防SQL注入、防XSS注入攻击、涉及资金相关的操作都需要明细账、遵循最小权限原则等)

2、蜜罐技术(入侵检测)、防火墙(软、硬)

3、定期安全扫描、升级漏洞(系统、第三方jar包)

4、相关审计(如:用堡垒机去操作服务器维护、操作数据库维护;)

5、自动化的监控(如:某个功能突然访问量暴涨)



原则:

遵循以下原则或者设计模式思想对系统进行拆分解藕,业务模块服务化。

高内聚、低耦合组件设计原则

S.O.L.I.D原则【单一职责(Single Responsibility)、开闭原则(Open-Close, Open for extension, close for modification)、里氏替换(Liskov Substitution)、接口分离(Interface Segregation)、依赖反转(Dependency Inversion)】

面向对象设计模式(如:工厂模式、适配器模式等等)

领域驱动建模思想对系统服务进行梳理、分析、划分。

作业二:请用你熟悉的编程语言写一个用户密码验证函数,Boolean checkPW(String 用户 ID,String 密码明文,String 密码密文)返回密码是否正确 boolean 值,密码加密算法使用你认为合适的加密算法。



public boolean checkPW(String userId, String inputPwd, String dbPwd){

return dbPwd.equals ( DigestUtils.sha512Hex(DigestUtils.sha512Hex(inputPwd) + DigestUtils.sha512Hex(userId)));

}



用户头像

Bruce Xiong

关注

熊大 2017.10.18 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第11周作业