上节讲了《大型网站架构之架构演变》,今天讲下架构的模式,什么是模式呢?每个模式描述了一个再咱们周围不断重复发生的问题及问题解决方案的核心,这样你就能一次次重用该方案而没必要去作重复的工做,可见模式的关键在于可重复性。css
网站架构模式的目标:面临高并发访问,海量数据处理,高可靠运行等问题和挑战,咱们在实践中提出不少解决方案,主要为了实现网站的高性能、高可用、易伸缩、可扩展、安全等架构目标。前端
网站架构模式具体方案以下:数据库
一、分层后端
分层是一种常见的架构模式,将系统在横向维度上切分为几个部分,每一个部分负责单一的职责,而后经过上层对下层的依赖和调用完成整个系统工做。通常大型网站系统都分为下面3层:浏览器
应用层:负责具体业务和视图展现;缓存
服务层:为应用层提供服务支持;安全
数据层:提供数据存储访问服务;服务器
分层架构的挑战:必须合理规划层次边界和接口;网络
分层架构的约束:禁止跨层次调用及逆向调用(数据层不容许调用服务层,服务层不容许调用应用层)多线程
二、分割
分层是横向切分,分割则是纵向切分,将不一样的功能和服务分割开,包装成高内聚低耦合的模块单元,这样作的好处在于:
有助于软件开发和维护;
便于不一样模块的分布式部署,提升网站的并发处理能力和功能扩展能力;
三、分布式
对于大型网站,分层和分割的目的都是为了便于分布式部署,将不一样的模块部署在不一样的服务器上,经过远程调用协同工做,分布式意味着咱们可使用更多的计算机完成同一个任务,计算机物理机越多,CPU,内存,存储资源就越多,能处理的并发访问和数据量也就更大,可是分布式也会带来一些问题:
分布式服务意味着经过网络调用,会对性能形成影响;
服务器越多,服务器宕机的几率就越大,使网站的可用性下降;
数据在分布式环境下保持数据一致性也就比较困难;
分布式下的事务也难以保证;
分布式管理增了开发和维护的难度,切记不要为了分布式而分布式;
分布式的常见几种方案:
分布式应用和服务:将分层和分割后的应用和服务模块分布式部署,能够改善网站性能和并发性,加快开发和发布的速度,减小数据库链接资源消耗,使不一样的应用复用共同的服务,便于业务扩展;
分布式静态资源:网站的静态资源例如js,css,图片等资源独立分布式部署,并采用独立的域名,即动静分离;静态资源分布式部署能够减轻应用服务器的负载压力,经过域名独立加快浏览器并发加载的速度;
分布式数据和存储:大型网站须要处理以P为单位的海量数据,单台计算机没法提供如此大的存储空间,这些数据须要分布式存储;
分布式计算:目前网站广泛使用Hadoop和MapReduce分布式计算框架进行批处理计算,其特色就是移动计算而不是移动数据,将计算程序分发到数据所在的位置,以加速计算和分布式计算;
分布式配置:网站线上服务器配置实时更新;
分布式锁:分布式环境下实现并发和协同工做;
分布式文件:支持云存储的分布式文件系统;
四、集群
对于用户访问集中的模块,咱们还须要考虑将其集群化,多台服务器部署相同应用构成一个集群,经过负载均衡器将请求分发给集群中不一样的服务器处理。集群模式能够很好的扩展,当有更多用户访问时,只须要向集群中添加一台新的服务器加入集群便可,同时由于一个应用由多台服务器提供服务,当某台服务器发生故障时,负载均衡器或者系统的失效转移机制会将请求转发到集群中其余的服务器上,因此咱们在配置集群时,至少须要2台以上服务器构成一个集群,目的就是为了提供系统的可用性。
五、缓存
将数据存放在距离计算最近的位置,加快处理速度。大型网站架构设计通常在下面几个方面使用缓存设计:
CDN:即内容分发网络,部署在距离终端用户最近的网络服务商,用户网络请求老是先到达他的网络服务商那里,在这里缓存一些静态资源,就能够以最快的速度返回资源给用户;
反向代理:属于网站前端部分,部署在网站的前端,当用户请求到达网站的时候,最早访问到的就是反向代理服务器,这里缓存网站的静态资源,无需将请求继续转发给应用服务器就能直接返回给用户;
本地缓存:在应用服务器本地缓存一些热点数据(段时间内常常被访问的数据),应用程序能够在本机内存中直接访问数据,而无需访问数据库;
分布式缓存:将数据缓存在一个专门的分布式缓存集群中,应用程序经过网络通讯获取缓存的数据;
使用缓存有2个前提条件:
数据访问热点不均衡,某些数据会被更频繁的访问,这部分数据就该放入缓存;
数据在某个时间段内有效,不会很快过时,不然缓存失效的数据就会由于失效而产生脏读,影响结果的正确性;
使用缓存的优点:加快数据访问速度以及减轻后端应用和数据存储的负载压力;
六、异步
大型网站的一个重要目标是下降软件的耦合性,系统解耦合的手段除了前面提到的分层、分割和分布式等,还有一个异步,业务之间的消息传递不是同步调用,而是将业务操做分红多个阶段,每一个阶段之间经过共享数据的方式异步的进行协做;
在单一服务器内部能够经过多线程共享内存队列的方式实现异步,业务前执行的线程将数据写入队列,后续线程从队列中读取数据进行处理;
在分布式系统中,多个服务器集群经过分布式消息队列实现异步,分布式消息队列能够看作是内存队列的分布式部署;
异步架构是典型的生产者和消费者模式,此外异步消息队列还有以下特性:
提升系统可用性:消费者服务器宕机时,数据会堆积在消息队列中,生产者服务器能够继续处理业务请求,不影响系统总体运行,当消费者服务器恢复正常后能够继续处理消息队列中的数据;
加快网站响应速度:处在业务处理前端的生产者服务器在处理完业务请求后,能够将数据写入消息队列,不须要等待结果直接返回,减小响应延迟;
消除并发访问高峰:使用消息队列将突发的高峰访问请求数据放入消息队列中,等待消费者依次处理,不会对整个网站负载形成太大的压力;
七、冗余
网站须要24小时为用户提供服务,想要保证在服务器宕机的状况下,不影响网站的运行,不丢失数据,就须要将必定程度的服务器冗余运行,数据冗余备份,这样,当某台服务器宕机时,能够将其上面的服务和数据访问转移到其余冗余的服务器上。
数据库除了按期备份,存档保存,实现冷备份以外,为了保证在线业务高可用,还须要对数据库进行主从分离,实时同步实现热备份。
为了抵制一些非人为的天灾,通常还须要对整个网站数据中心进行备份,全球范围内部署灾备数据中心,网站程序和数据实时同步到多个灾备中心。
八、自动化
主要包括自动化代码管理、自动化测试、自动化安全检测、自动化部署等实现发布过程自动化;此外还须要对服务器进行自动化监控、自动化报警、自动化失效转移(将失效的服务器从集群中隔离出去)、自动化失效恢复(重启服务以后同步数据保证数据的一致性)、自动化降级(经过拒绝部分请求及关闭一些不重要的服务将系统负载降至一个安全的水平)以及自动化分配资源(将空闲资源分配给重要的服务,扩大部署规模)。
九、安全
主要从下面几点考虑
经过密码手机校验码进行身份验证;
登陆,交易等操做对网络通讯进行加密;
防止机器人程序滥用网络资源攻击网站,使用验证码进行识别;
对常见的XSS攻击、SQL注入进行编码转换等处理;
对垃圾信息。敏感信息进行过滤;
对交易转帐等重要操做根据交易模式和交易信息进行风险控制;
十、总结