文章目录
- 一.何谓模式
- 二.通用架构模式
- 1.分层
- 2.分割
- 3.分布式
- 4.集群
- 5.缓存
- 6.异步处理
- 7.冗余备份
- 8.自动化
- 9.安全
本文主要参考自《大型网站技术架构:核心原理与案例分析》一书第二章节和其他网络文章,如有遗漏或错误,还望海涵并指出。谢谢!
好的设计绝对不是模仿,不是生搬硬套某个模式,而是在对问题深刻理解之上的创造与创新,即使是“微创新”,也是让人耳目一新的似曾相识。山寨与创新的最大区别不在于是否抄袭,是否模仿,而在于对问题和需求是否真正理解和把握。
–《大型网站技术架构:核心原理与案例分析》
一.何谓模式
“每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复工作”。
模式的关键在于模式的可重复性,问题与场景的可重复性带来解决方案的可重复使用。
例如23种设计模式就是后端开发领域前人对于如何设计程序的可拓展性、可靠性和易用性的高度总结,许多经典的软件以及框架都参考和借鉴了这些经典的设计模式,并且在这之上做出了许多的创新。
对于技术的学习也是一样的,当务之急是知道如何使用技术来解决现实问题(how?),但是更重要的一点在于了解技术到底是如何解决问题的、背后的思想是什么、模式是什么(why?),然后应用在自身的技术或业务中。要站在巨人的肩膀上创新。
二.通用架构模式
1.分层
分层是计算机领域中一种常见的思想,例如计算机网络中,通过将不同的技术和规范分为七层,由下层来服务上层,而上层可以只做好自己的事情就好了,不必理会下层是如何提供的服务,上下层之间只需要约定好接口就够了,降低了耦合度。
如在Java的Web服务开发过程中,也常常需要将整个项目分为控制层、业务层、数据交互层等层次,让它们各种来解决各自的问题即可。这样能够起到逻辑清晰,代码依赖性低的作用
2.分割
分层可以是做将项目进行水平切分,而分割可以视为将项目进行垂直切分。
分割指的是将项目分割为不同的业务线和模块,譬如一个购物网站可以按业务的不同分为首页业务、购物车业务、商品管理业务、用户管理业务等,然后由不同的团队负责开发。
3.分布式
随着应用越来越大,并发的访问也越来越多,此时单体的应用可能无法承受这么大的压力,所以此时出现了分布式的服务,一台机器处理不了的请求,可以分发给其他的机器处理。
分布式系统指的是由多台不同的主机共同提供资源来组成服务。
常见的分布式方案有一下几种:
1.分布式的应用与服务:将大应用拆分为多个小应用或服务分开部署
2.分布式静态资源:将网站的静态资源如JS、CSS、图片和文件等独立部署
3.分布式数据与存储:将数据库和应用分离,单独部署
4.分布式计算:将耗费大量计算资源的服务,例如大数据分析、机器学习训练集等进行单独等部署
分布式系统会出现哪些挑战或问题?
1.分布式的主机之间需要通过网络连接,所以网络状况可能会对分布式系统造成重大影响。根据CAP理论,当网络分区(Partition)发生时,分布式主机数据间的一致性(Consistent)和服务的可用性(Avaliable)只能保证一个。要不就是一致性等不到保证、要不就是可用性等不到保证。
2.各种服务和资源分散在不同的机器上,如何保证机器宕机时数据的不丢失以及服务的恢复。
4.集群
分布式的系统下,将不同作用的服务拆分到不同的机器上面,而集群要做的事情和分布式相似,就是提高可接受的访问压力和保证服务的可用性;但是对于集群来说,集群中的不同机器提供的是同一服务。
例如Redis的集群由两台服务器组成,每台服务器提供的服务都是一样的,客户端的请求具体会被哪台服务器处理需要通过负载均衡算法来判断;当其中一台机器宕机时,仍有一台机器可以继续提供服务。
5.缓存
缓存就是通过将数据放到能够更快速访问到的地方以加快访问速度。
缓存可以分为以下几种:
1.CDN:内容分发网络可以将请求转发到距离用户最近的服务器,或者是直接返回已经存在的数据,加快资源的访问速度
2.反向代理:通常反向代理服务器中缓存有网站的静态资源(如Nginx),可以加快访问速度
3.本地缓存:本地缓存即存在于应用程序中或是本地服务器上的缓存数据,可用ehcache技术来实现
4.分布式缓存:对于大量的请求和大量的缓存数据,更常见的做法是使用分布式缓存服务,例如Redis集群等
使用缓存有以下两个前提:
1.被缓存的数据应该是经常被访问、但是更改不是很频繁的热点数据。
2.被缓存的数据应该具有一定的时效,而不能很快就过期,不然会产生脏读现象
6.异步处理
大型网站架构中,不仅可以通过分层、分割、分布式来进行解耦和提高性能,还可以使用异步处理的方式,异步处理主要是通过消息队列(如Kafka、ActiveMQ)来构建不同系统或机器、应用之间的通信,消息队列的两端被称为生产者与消费者,其主要的作用如下:
1.提高系统可用性:设想这样的一个场景,系统正在处理大量的订单数据,此时服务器突然宕机,那么订单数据可能没被处理完就丢失了,此时如果使用消息队列来存储订单数据,如果系统出现宕机,那么在重启机器之后,消息队列由于拥有持久化机制,所以消息队列中的数据并不会丢失,而是可以继续被消费者消费并处理,这就提升了系统的可用性。
2.加快服务响应速度:当生产者接收到数据,并且放入消息队列时即可返回响应,而不需要等待整个业务的处理完成,而消费者取到消息后才会进行真正的业务处理。
3.消除并发访问高峰:有时系统突然出现了高于平常的访问大于系统处理能力时,可能会发生阻塞或使系统宕机,例如抢购等操作。此时可以将请求放入消息队列中排队,由消费者来进行逐一的处理,就不会对应用产生过大对负载。
7.冗余备份
网站由于需要24小时地运转,但是请求过大或某些原因可能导致某台机器宕机,例如MySQL可能出现宕机的情况,那么就无法对外提供数据服务。
为了保证某台机器宕机后,系统仍能对外保持服务,此时的做法是做数据的冗余与备份,这样才可以在机器挂掉之后,迅速地启动其他机器提供服务。
例如微软为了防止地震或自然灾害的影响造成系统瘫痪,将数据服务器拆分成上千台放入深海之中,以便在任何突发情况下,都存在数据的备份。
8.自动化
对于一切应用来说,最理想的情况下是完全自动化的,例如代码是自动化部署更新的、测试是自动化测试、宕机后的机器切换也是自动化的、自动化的代码管理、接口出错可以自动化报警、请求量大可以自动化降级等等,这也是现在运维最新的发展方向。
9.安全
越大的网站越容易遭受黑客的攻击,例如XSS攻击、DDos攻击、CSRF攻击、SQL注入攻击等等,所以在特别需要保证安全的场景下,例如登陆、支付等场景需要引入验证码校验、请求签名校验等。