什么是模式

每一个模式,描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样,你就能一次又一次的使用该方案而不必做重复的工作”。模式的关键在于模式的可重复性,问题与场景的可重复性带来解决方案的可重复性。

网站架构模式

大型互联网公司为实现网站高性能、高可用、易伸缩、可扩展、安全等各种技术架构目标,在实践中提出了许多解决方案。这些解决方案又被更多网站重复使用,从而逐渐形成大型网站架构模式。

1、分层

分层式企业应用系统中最常见的一种架构模式,将系统在纵向维度上切分成几个部分,每个部分负责相对单一的职责,然后通过上层对下层的依赖和调用组成一个完整的系统。

分层结构在计算机世界中无处不在,如:

  • 网络的7层通信协议
  • 计算机分为硬件、操作系统、应用软件
  • 网站软件系统分为应用层、服务层、数据层

通过分层,可以更好地将一个庞大的软件系统切分成不同的部分,便于分工合作开发和维护;各层之间具有一定的独立性,只要维持调用接口不变,各层可以根据具体问题独立演化发展而不需要其他层必须做出相应调整。

分层必须合理规划层次边界和接口,在开发过程中,严格遵循分层架构的约束,禁止跨层次的调用(应用层直接掉数据层)和逆向调用(数据层调用服务层,或者服务层调应用层)。

在实践中大的分层结构内部可以继续分层。分层架构师逻辑上的,物理上可部署在同一台机器上,随业务发展,必然需要对已分层的模块分离部署。

分层架构模式最初的目的是规划软件清晰的逻辑结构便于开发维护,但在网站发展过程中,分层结构对网站支持高并发向分布式方向发展至关重要。因此在网站规模还很小的时候就应该采用分层的架构,便于将来网站做大更好应对。

2、分割

分层偏向纵向技术架构,分割偏向横向业务架构。

网站越大,功能越复杂,服务和数据处理的种类也越多,将这些不同的功能和服务分割开来,包装成高内聚低耦合的模块单元,一方面有助于软件的开发和维护;另一方面,便于不同模块的分布式部署,提高网站的并发处理和功能扩展能力。

大型网站的分割粒度可能会很小。比如在应用层,将不同业务进行分割,如将购物、论坛、搜索、广告分割成不同应用,由独立的团队负责,部署在不同的服务器上;在同一应用内部,如果规模庞大业务复杂,可继续分割,使这些模块不管在逻辑或物理部署上都是独立的。

3、分布式

对于大型网站,分层和分割的一个主要目的就是切分后的模块便于分布式部署,即将不同模块部署在不同服务器上,通过远程调用协同工作。

简单分布式在解决高并发的同时也带来了其他问题:

1、分布式意味着服务调用必须通过网络,这可能对性能造成比较严重的影响。

2、非集群情况下,服务器越多,宕机的概率也就越大,一台服务器宕机造成服务不可用可能会导致很多应用不可访问,使网站可用性降低。

3、数据在分布式环境中保持一致性非常困难,分布式事务也难以保证,这对网站业务正确性和业务流程有可能造成很大影响。

4、网络依赖错综复杂,开发管理困难。

因此分布式设计要根据具体情况量力而行,切莫为了分布式而分布式。

常见分布式方案:

1、分布式应用和服务:将分层和分割后的应用和服务模块分布式部署,除了可以改善网站性能和并发性、加快开发和发布速度、减少数据库连接资源消耗外;还可以使不同应用复用共同的服务,便于业务功能扩展。

2、分布式静态资源:网站的静态资源如JS、CSS和Logo图片等资源独立分布式部署,并采用独立的域名,即人们常说的动静分离。静态资源独立分布式部署可以减轻应用服务器的负载压力;通过使用独立域名加快浏览器并发加载的速度,同时有利于分工合作。

3、分布式数据和存储:大型网站需要处理海量数据,单台计算机无法提供如此大的存储空间,因而需要分布式存储。出来传统数据库,各种NOSQL产品几乎都是分布式的。

4、分布式计算:严格来说,应用、服务、实时数据处理都是计算,网站除了要处理这些在线业务,还有很大一部分用户没有直观感受的后台业务要处理。这些业务计算非常庞大,目前网站普遍使用Hadoop及其MapReduce分布式计算框架进行此类批处理计算,其特点是移动计算而非数据,将计算程序分发到数据所在位置以加速计算和分布式计算。

此外,还有分布式配置、分布式锁、分布式文件系统等。

4、集群

分布式虽然已经将分层和分割后的模块独立部署,但对用户访问集中的模块,比如网站首页,还需要将独立部署的服务集群化,即多台服务器部署相同的应用构成一个集群,通过负载均衡设备共同对外提供服务。

集群可以提供更好的并发特性和高可用性(负载均衡或失效转移),即使是很小的分布式应用和服务,也至少要部署两台服务器构成一个小集群。

5、缓存

缓存就是将数据存放在距离计算最近的位置以加快计算速度。缓存是改善软件性能的第一手段,大型网站设计在很多方面使用了缓存。

CDN:即内容分发网络,部署在距离用户最近的网络服务商。用户的请求总是先到达他的网络服务商,在这里缓存一些静态资源(较少变化的数据),可以以最快的速度返回给用户。如视频或门户网站将访问量大的热点内容缓存在CDN。

反向代理:反向代理属于网站前端架构的一部分,部署在网站的前端,当用户请求到达网站的数据中心时,最先访问的就是反向代理服务器。这里缓存网站的静态资源,无需将请求转发给应用服务器就能返回给用户。

本地缓存:在应用服务器本地缓存着热点数据,应用程序可直接在本机内存中访问数据而无需访问数据库。

分布式缓存:大型网站数据非常庞大,即使只缓存一小部分,也不是单机能承受的,所以除了本地缓存,还需要分布式缓存。将数据缓存在一个专门的分布式缓存集群中,应用程序通过网络通信访问缓存数据。

使用缓存有两个条件:

1、数据访问热点不均衡,某些会被频繁访问的数据应放在缓存中

2、数据在某个时间段内有效,不会很快过期,否则缓存的数据就会因为失效而产生脏读,影响结果的正确性。

网站应用中,缓存可加快数据访问速度、减轻后端应用和数据储存的负载压力,这一点对网站数据库架构至关重要,网站数据库几乎都是按照有缓存的前提进行负载能力设计的。

6、异步

除了分层、分割、分布等,系统解耦还有一重要手段,就是异步。将一个业务操作分成多个阶段,每个阶段之间通过共享数据的方式异步执行进行协作。

在单一服务器内可通过多线程共享内存队列的方式实现异步,处在业务操作前面的线程将输出写入到队列,后面的线程从对内中读取数据进行处理;在分布式系统中,多个服务器集群通过分布式消息队列实现异步,分布式消息队列可以看作内存队列的分布式部署。

异步架构师典型的生产者消费者模式,两者不存在直接调用,只要保持数据结构不变,彼此功能实现可以随意变化而不互相影响,这对网站扩展新功能非常便利。除此之外,使用异步消息队列还有如下特性:

1、提高系统可用性:消费者服务器故障,数据会在消息队列服务器中存储堆积,生产者服务器可以继续处理业务请求,系统表现无故障。消费者服务器恢复正常后继续处理消息队列中的数据。

2、加快网站响应速度:处在业务处理前端的生产者服务器在处理完业务请求后,将数据写入消息队列,不需要等待消费者服务器处理就可以返回,响应延迟减少。

3、消除并发访问峰值:使用消息队列将突然增加的访问请求数据放在消息队列中,等待消费者服务依次处理,就不会对整个网站造成太大的压力。

需要注意的是,使用异步方式处理业务可能对用户体验、业务流程造成影响,需要网站产品设计方面的支持。

7、冗余

要想保证在某一服务器宕机的情况下网站依然可以继续服务,不丢失数据,就需要一定的服务器冗余运行,数据冗余备份,这样当某台服务器宕机时,就可以将其上的服务和数据访问转移到其他机器上。

访问和负载很小的服务也必须部署至少两台服务器构成一个集群,其目的就是通过冗余实现高可用。数据库除了定期备份,存档保存,实现冷备份外,为了保证在线高可用,还需要对数据库进行主从分离,实时同步实现热备份。

为了抵御地震、海啸等不可抗力导致的网站完全瘫痪,某些大型网站会对整个数据中心进行备份,全球范围内部署灾备数据中心。网站程序和数据实时同步到多个灾备中心。

8、自动化

在无人值守的情况下网站可以正常运行,一切都可以自动化是网站的理想状态。目前大型网站的自动化架构设计主要集中在发布运维方面。

发布过程自动化

自动化代码管理

自动化测试

自动化安全检测

自动化部署

自动化监控

自动化报警

自动化失效转移

自动化失效恢复

自动化降级

自动化分配资源

9、安全

互联网的开发特性使其从诞生起就面对巨大的安全挑战,网站在安全架构方案也积累了许多模式:

1、通过密码和手机校验码进行身份验证

2、登录、交易等操作需要对网络通信进行加密,网站服务上存储的敏感信息,如用户信息也进行加密处理

3、为防止机器人程序滥用网络资源攻击网站,网站使用验证码进行识别

4、对常见用于攻击网站的XSS攻击、SQL注入、进行编码转换等相应处理

5、对垃圾信息、敏感信息进行过滤

6、对交易转账等重要操作根据交易模式和交易信息进行风险控制

架构模式在新浪微博的应用

系统分为三个层次,最下层是基础服务,提供数据库、缓存、存储、搜索等数据服务,以及其他一些基础技术服务。这些服务支撑了新浪微博的海量数据和高并发访问,使整个系统的技术基础。

中间层是平台服务和应用服务,新浪微博的核心服务是微博、关系和用户,他们是新浪微博业务大厦的支柱。这些服务被分割为独立的服务模块,通过依赖调用和共享基础数据构成新浪微博的业务基础。

最上层是API和新浪微博的业务层,各种客户端(包括Web网站)和第三方应用,通过调用API集成到新浪微博的系统中,共同组成一个生态系统。

分布式部署,每个模块都部署在一个独立的服务器 集群上,通过远程调用的方式进行依赖访问。新浪微博使用 异步推拉结合的模式,用户发表微博,系统将消息写入消息队列后立即返回,用户响应迅速,消息队列消费者认为将微博推送给所有当前在线粉丝的订阅列表上,非在线用户登录后根据关注列表拉去微博订阅列表。由于微博刷新频繁,新浪微博使用多级 缓存策略,热门微博和明星用户微博缓存在所有微博服务器上,在线微博和近期微博缓存在分布式缓存服务器集群中。所谓刷微博,几乎全部是在刷缓存,可获得很好的系统性能。同时新浪微博在 冗余、 自动化和 安全方面,都采取了相应措施。

小结

好的设计绝对博士模仿,不是生搬硬套某个模式,而是对问题深刻理解之上的创造与创新,即使是“微创新”,也是让人耳目一新的似曾相识。山寨和创新的最大区别不在于是否抄袭,是否模仿,而在于对问题和需求是否真正的理解和把握。