宁夏水产品加工联盟

好刚: 网站架构七之扩展性【7分钟视频】

好刚编程2020-04-02 12:24:44

你好,我是好刚,再上一节介绍了网站的伸缩性架构,了解伸缩性定义和实现伸缩性的主要手段后,这一节我们继续学习大型网站技术架构这本书的第七章:网站的扩展性架构。

这一节将介绍网站架构扩展性的定义,实现可扩展的两种方式:消息队列和分布式服务,消息队列通过事件消息降低系统耦合性;分布式服务通过将系统拆分成子模块降低耦合。最后将简单介绍开放平台的基本架构。


1. 扩展性

首先扩展性的定义是:在对现有系统影响最小的情况下,系统可以持续扩展提升功能的能力。这种系统的特点是系统基础设施稳定不需要经常变更,应用之间依赖较少,低耦合。

这里需要说明下扩展性和伸缩性的区别,伸缩性指系统通过改变计算资源规模的方式改变处理事务的能力,关注点是用更多的机器做更多相同的事情;扩展性的关注点是怎样更好地做更多不同的事情。

大型网站经过长期演化和发展,功能复杂,产品众多,而且产品之间的依赖关系错综复杂,导致开发维护异常困难。解决方案就是提高架构扩展性,扩展性的核心思想是模块化,将大型系统分解成若干个低耦合的独立组件模块,各模块分离部署,运行在独立服务器上,而且模块可以复用,使系统更容易维护和扩展。

模块化的难点是,如何分解系统的各个模块,如何定义模块的接口,如何复用组合不同的模块以构成一个完整的系统。

模块化后,各模块通过无直接调用的消息队列和直接调用的分布式服务进行聚合,为用户提供服务。


2. 消息队列

2.1 事件驱动

首先是消息队列,基于事件驱动,通过在各模块间传递事件消息,完成模块间的合作。

工作流程为,消息生产者在产生消息后,将消息发送至消息队列,消费者从队列中获取该消息继续进行处理。期间生产者与消费者没有直接调用,并且消息生产者不需要等待接收者处理完成就可以返回。同时可以不断增加新的生产证和消费者,而对已有的业务没有任何影响。

消费者在处理完消息后,可以构造一个新的消息类型,并且推到下一个消息队列,等待其他订阅该消息类型的消费者处理。这样基于事件驱动架构可以形成一系列的工作流程。

事件驱动的特点是用户请求返回快速;并且在访问高峰,具有削峰填谷的作用,因为消息队列可以暂存消息,由消费者根据自身负载以及处理能力控制消息处理速度,减轻数据库等后端服务压力。

2.2 分布式消息队列

这里我们需要专门提一下分布式消息队列,队列是一种先进先出的数据结构,分布式消息队列部署在独立的服务器上,通过远程接口访问,主要负责接收生产者推送的消息数据,并且根据消息订阅列表将消息推送给消费者。

因此消息队列也具有很多特性:

  1. 首先是伸缩性:消息队列主要负责转发消息,是无状态的,因此可以通过直接添加新机器的方式持续提升处理能力

  2. 第二点是可用性上:为了避免消费者处理过慢,导致数据积压,造成消息队列服务器内存不足的问题,队列会将消息写入磁盘,等内存中数据处理完后,再处理磁盘中的内容

  3. 第三点是数据的确定性:为了避免服务器宕机导致数据丢失,只有再收到消费确认处理的通知后,才会将消息从队列中删除

现在常见的消息队列是通过redis 实现,也可以使用MySQL 数据表实现。


3. 分布式服务

再来介绍下分布式服务,随着网站功能日益复杂,网站中聚合大量的应用和服务组件,会引发整个网站的开发,维护,部署问题,像编译缓慢,打包构建一个巨型应用极为耗时;代码分支管理困难,多个团队在一个代码库上开发修改时难免出现冲突;巨型应用耗尽数据库连接资源;还有依赖关系复杂,新增加一个业务也很困难。

针对这种巨型应用,主要通过将系统拆分成独立模块,降低系统内耦合度来解决,这里拆分分为两种:

  1. 首先是纵向拆分:根据产品业务拆分,将较少相关的业务剥离,大应用拆分成小应用,新增业务比较独立时,直接设计为独立的应用。

  2. 第二种是横向拆分:将可复用的功能拆分成服务,新增功能通过调用这些分布式服务来快速搭建应用系统。拆分后,不同服务需要相互调用,也可以通过分布式服务框架实现。


3.1 分布式服务框架

开源的分布式服务框架有Facebook 的Thrift,阿里巴巴 的Dubbo,框架运行基本包含以下步骤:

  1. 首先在服务启动时向注册中心注册服务部署的机器地址,可提供的服务接口列表

  2. 然后是调用方通过服务框架客户端调用接口,具体又可以分为4 个步骤

    1. 第一步是框架客户端把请求数据序列化

    2. 第二步是框架客户端根据从注册中心获取的服务提供列表,并且通过负载均衡策略选定服务实际地址

    3. 第三部是框架客户端将请求通过约定的网络协议发送到对应服务器上处理

    4. 再此期间如果调用失败,框架客户端会自动选择另一台服务器重新请求,实现失效转移。

  3. 最后服务收到请求后,反序列化请求参数,处理完成后,再序列化响应数据,并将结果数据返回给调用方。

3.2 分布式服务框架特性

这里介绍下分布式服务框架的特性,分布式服务框架为了实现不同服务之间的调用,需要具备如下功能:

  • 服务注册,服务方将部署地址以及可处理的功能写入注册中心,调用方从注册中心发现服务实际地址

  • 负载均衡,服务集群化部署时,分布式服务框架需要支持可配置的负载均衡算法

  • 失效转移,在一个服务实例不可用时,请求能自动切换到其他服务实例上

  • 整合异构,网站可能使用不同的语言开发,框架需要整合这些异构的系统

  • 实时监控,需要对服务的各项指标进行监控,提供运维支持,出现问题时可以及时发现,保障服务高可用

  • 数据序列化,数据在进行网络传输前需要转换为可传输的格式,框架需要高效的序列化方法

  • 远程通信,分布式服务通过远程调用实现功能,需要有高效的网络协议

  • 少侵入,框架需要尽量少地依赖项目代码,这样框架升级或改变时不需要专门修改业务代码

  • 版本管理,服务接口可能由于功能升级而发生变化,但是服务请求者可能不能同时升级,因此框架需要支持服务多版本发布,在提供新接口的同时,维持旧版本的接口可用

4. 开放平台

接下来介绍开放平台,大型网站作为价值提供者,由于用户量极为庞大,所以无法面面俱到地满足所有用户的需求。

但是可以把网站内部服务封装成接口对外开放,形成开放平台,由第三方开发者利用这些接口开发应用程序,为更多用户提供服务。

开放平台的架构一般包含以下几个部分:

  • 对于第三方开发者,最外层是API 接口层,它是平台提供给开发者的API,通过调用内部服务,实现第三方请求的处理。

  • 然后是安全模块,用于接口访问控制,限制接口调用次数,保证开放接口不被滥用,也保护内部服务不会被外部应用拖垮

  • 再就是审计,主要负责对第三方应用的访问情况进行监控,计费等


5. 小结

最后小结一下,这一节介绍网站架构的扩展性定义,实现可扩展的两种方式:消息队列和分布式服务,以及开放平台的基本架构。具有良好扩展性的架构,可以快速响应不断产生的新需求新功能,保持网站的竞争优势。

大型网站技术架构这本书的第七章:网站的扩展性架构就先介绍到这,如果你想详细了解网站架构扩展性,建议阅读这本书的第七章。我是好刚,下一节我将介绍网站架构的第五个衡量标准:架构的安全性。

如果你觉得视频内容不错,关注我的微信公众号:好刚编程,观看更多技术小视频吧。

Copyright © 宁夏水产品加工联盟@2017