网站架构模式
关于设计模式,相信很多基础中级开发人员甚至初级开发人员都知道,什么是设计模式? 关于设计模式,我的理解就是为了开发出一个优秀的软件系统,使这个软件系统具备更好的可维护性的复用,灵活性和可插入性,总结出来的一套满足面向对象设计原则的方式。我更喜欢理解为公式。
今天我要整理的就是不是设计模式,而是架构模式,关于大型网站开发中会用到的一些架构模式。那么什么是架构模式呢??
在大型网站中,基本都会面临一系列高并发访问,海量数据处理,高可靠运行等一系列问题,许多大型互联网公司随着网站架构的演变,都总结出了许多解决方案,以实现高性能,高可用,已伸缩,可拓展,安全等满足各种架构目标。这些解决方案又被更多公司使用,从而渐渐形成一套架构模式。
下面就来整理一下:
一、分层
关于分层,相信许多开发人员都很熟悉,这是最常见的一套架构模式,分层的目的是能够分清单一职责,各个模块的职责层次分明,才能更明确的开发,其次是抽离出最基本的依赖和基础服务,可以更好的复用,通过上层对下层的依赖,组成完整的系统。
分层的设计一般是将网站软件系统划分为应用层、服务层、数据层,每一层都有各自对应负责的职责:见下图分层后,能够将一个庞大的软件系统安装职责切分成不同的部分,便于分工合作与开发。分层的话,需要考虑边界和接口的划分,开发时遵循分层的约束,禁止跨层次调用。
一般来说,分层都是逻辑上的,物理部署可以不用分层,但是随着网站业务发展,必然需要对已经分层的模块分离部署。
总结,在分布式高并发网站中,分层的架构模式几乎是必然的,因此最好在小规模的时候就采用,为以后做大做准备。
二、分割
上面说了,分层是将软件在横向方面划分,那么分割就是在纵向对软件划分。将软件按照功能和服务进行划分,包装成高内聚低耦合的模块单元,一方面是方便软件开发和维护,一方面是便于分布式部署,提高网站并发处理能力和功能拓展能力。
比如一个订单模块,按照功能可以分割出: 订单、财务、支付、结算、库存这几个模块。
三、分布式
上面说的分层以及分割后,一个主要目的之一是为了分布式部署的。就是把不同模块部署在不同机器上,可以使用更多的机器完成功能,能够解决高并发的问题,将大量请求分布到不同服务器上处理。
但同时也带来新的问题:
- 网络传输慢问题,网络抖动。
2.分布式数据如何保持一致性。
3.分布式事务
4.脑裂问题(部分服务宕机)
5.维护管理。。。。
很多一系列问题。
常用的分布式方案包括:
1.分布式应用和服务:将分层分割后的模块分布式部署,还可以抽离基础服务,提高复用。
2.分布式静态资源(CDN:比如css、js、图片等)
3、分布式数据和存储:大型网站的大数据量能够以T为单位,单台计算机无法存储,使用分布式存储,比如mysql分库分表开发。但是要考虑几个问题:数据同步问题,数据一致性问题等等以及事务。
4.分布式计算:分布式计算,应用,服务,实时数据处理其实都算计算,网站除了处理这些,还需要处理很多跟用户没有关系的后台业务:
比如海量日志的分析处理,搜索引擎的索引构建,数据分析统计,这些业务的计算规模很大,目前基本使用大数据技术Hadoop以及MapReduce分布式计算框架来进行类的批处理计算,特点是移动计算而不是移动数据。
5.分布式锁
6.分布式事务
7.分布式文件系统等。。。
四、集群
分层和隔离后的模块独立部署,但是对于访问量很大数据量很大的模块比如订单系统等,需要将独立部署集群化,就是多台服务器都部署相同的应用,就叫集群。请求进来,通过负载均衡算法来选择不同的服务器上的服务。
五、缓存
缓存就是将数据放在距离计算机比较近的位置或者说操作比较快的位置加快处理速度。跟我们知道的redis缓存不同,这里的缓存是指以下几个方面:
-
CDN:也就是内容分发网络,部署在距离终端用户最近的网络服务商,用户的网络请求会先到达距离他最近的网络服务商处,获取一些静态资源以及热点内容。
-
反向代理:反向代理服务器,这里缓存网站的静态资源无需再将请求转发给应用服务器就可以返回给用户。
3.本地缓存: 应用服务器本地的缓存,一级二级三级,主要存放热点数据,不需要再访问数据库:redis、spring cache等。
4.分布式缓存: 比如用户登录信息,在分布式系统中,就需要设计成SSO单点登录系统。
六、异步
异步的主要两点作用: 削峰、解耦。
在单服务器内部,可以通过多线程共享内存队列的方式实现异步,比如使用线程池,或者阻塞队列的方式处理任务。在分布式系统中主要是通过分布式消息队列去实现异步的,基本主流的有RabbitMQ、ActivityMQ、RocketMQ、kafka这几种。
异步架构也是典型的生产者消费者模式。使用异步消息队列还具备以下一些好处:
- 提高系统可用性。消费者服务器故障或宕机,数据会在消息队列中堆积,不会影响生产者。
2.提高网站响应速度。举个例子: 比如下订单包括一个完整的原子操作: 验证库存,减库存,计算价格,计算优惠券,生成订单号,减库存,。。。这一系列操作需要调用的服务非常多,使用消息队列,这些操作可以进行解耦,订单模块只需要操作生成订单部分。其他部分加入消息队列,如果操作失败,可以进行回滚或者补偿机制。
3.削峰
使用消息队列将突然访问增加的数据放入消息队列中,可以等待消费者依次处理,不然突然暴增的请求量容易导致服务器宕机等更严重的操作。
七、冗余
冗余指的是服务器冗余以及数据冗余。因为网站需要保证24小时都在运行,因此服务器宕机不可避免,想要让服务器宕机情况下,网站仍然可以服务,不丢失数据,需要一定数量的服务器冗余运行,数据冗余备份。
八、自动化
在无人值守的情况下,一切以都自动化是网站的最理想状态。自动化包括很多方面:
- 自动化发布
2.自动化代码管理
3.自动化测试
4.自动化安全检测
5.自动化部署
。。。
自动化发布:发布对网站都是头等大事, 许多网站故障出在发布环节, 网站工程师经常加班也是因为发布不顺利。通过减少人为干预,使发布过程自动化可有效减少故障。发布过程包括诸多环节。
自动化代码管理, 代码版本控制、代码分支创建合并等过程自动化, 开发工程师只要提交自己参与开发的产品代号,系统就会自动为其创建开发分支,后期会自动进行代码合并;
自动化测试,代码开发完成, 提交测试后,系统自动将代码部署到测试环境, 启动自动化测试用例进行测试,向相关入员发送测试报告, 向系统反馈测试结果;
自动化安全检测 , 安全检测工具通过对代码进行静态安全扫描及部署到安全测试环境进行安全攻击测试, 评估其安全性;最后进行自动化部署,将工程代码自动部署到线上生产环境。
自动化监控:网站在运行过程中可能会遇到各种问题:服务器岩机、程序 Bug、存储空间不足、 突然爆发的访问高峰。网站需要对线上生产环境进行自动化监控, 对服务器进行心跳检测, 并监控其各项性能指标和应用程序的关键数据指标。如果发现异常、超出预设的阙值,就进行自动化报警, 向相关人员发送报警信息, 警告故障可能会发生。在检测到故障发生后 , 系统会进行自动化失效转移, 将失效的服务器从集群中隔离出去, 不再处理系统中的应用请求。待故障消除后,系统进行自动化失效恢复, 重新启动服务, 同步数据保证数据的一 致性。在网站遇到访问高峰, 超出网站最大处理能力时, 为了保证整个网站的安全可用,还会进行自动化降级, 通过拒绝部分请求及关闭部分不重要的服务将系统负载降至一 个安全的水平, 必要时, 还需要自动化分配资源, 将空闲资源分配给重要的服务, 扩大其部署规模。
九、安全
互联网的开放特性使得其从诞生起就面对巨大的安全挑战 , 网站在安全架构方面也积累了许多模式:通过密码和手机校验码进行身份认证;登录 、 交易等操作需要对网络通信进行加密,网站服务器上存储的敏感数据如用户信息等也进行加密处理;为了防止机器人程序滥用网络资源攻击网站, 网站使用验证码进行识别;对于常见的用于攻击网站的 xss攻击、SQL 注入、 进行编码转换等相应处理;对于垃圾信息、 敏感信息进行过滤;对交易转账等重要操作根据交易模式和交易信息进行风险控制。
待续
阅读整理笔记:《大型网站技术架构之核心原理与案例分析》
网友评论