大型网站架构核心要素之扩展性:可扩展架构

2023-11-04

前言

续上节大型网站架构核心要素性能之后,我们今天要讲的是第四个要素:扩展性,什么叫扩展性呢?简单的说就是在对现有系统影响最小的情况下,系统功能可持续扩展及提升的能力,讲扩展性之前,我先讲下扩展性和伸缩性的区别,因为这两个点经常有人会混淆;

扩展性:指对现有系统影响最小的情况下,系统功能可持续扩展或提升的能力,表现在系统基础设施稳定,不需要经常变更,应用之间较少依赖和耦合,对需求变更可以快速敏捷响应。它是系统设计层面的开闭原则(对扩展开放,对修改关闭),架构设计考虑未来功能扩展,当系统增加新功能时,不需要对现有系统的结构和代码进行修改;

伸缩性:指系统能够通过增加或者减少自身资源规模的方式来增强或者减小自己计算处理事务的能力,如果这种增减是成比例的,那就称作线性伸缩性。在网站架构中,通常指利用集群的方式增加服务器数量、提高系统的整体事务吞吐能力。

搞清楚扩展性和伸缩性之间的区别之后,那么我们就从下面这几个方面开始讲如何构建可扩展性的架构设计:构建可扩展的网站架构、利用分布式消息队列降低系统耦合性、利用分布式服务打造可复用的业务平台、可扩展的数据结构、利用开放平台建设网站生态圈

 

构建可扩展的网站架构

开发低耦合系统是软件设计的终极目标之一,低耦合的系统更容易扩展,低耦合的模块更容易复用,一个低耦合的系统设计也会让开发过程和维护变得更加轻松和容易管理。那么如何分解系统的各个模块,如何定义各个模块的接口、如何复用组合不同的模块构成一个完整系统就成了软件设计中最有挑战的工作;

设计网站的可扩展性架构的核心思想在于模块化,并在此基础之上,降低模块间的耦合性,提高模块的复用性;上节我们讲到网站通过分层和分割的方式进行架构伸缩,分层和分割也是模块化设计的主要手段,利用分层和分割的方式将软件分为若干个低耦合的独立化组件,这些组件模块以消息传递及依赖调用的方式聚合成一个完整的系统。

在大型网站中这些模块通过分布式部署的方式,独立的模块部署在独立的服务器(集群)上,从物理上分离模块之间的耦合关系,进一步降低耦合性提高复用性;模块分布式部署以后具体聚合方式主要有分布式消息和分布式服务

 

利用分布式消息队列降低系统耦合性

如果模块之间不存在直接调用,那么新增的模块或者修改的模块就对其他模块影响最小,这样系统的可扩展性就会好些;

  • 事件驱动架构:通过在低耦合的模块之间传输事件消息,以保持模块的松散耦合,并借助事件消息的通信完成模块间合作,典型的事件驱动就是生产者消费者模式,在大型网站架构中,具体的实现方式很多,典型的就是分布式消息队列

    消息队列利用发布-订阅模式工作,消息发送者发布消息,一个或者多个消息接收者订阅消息。消息发送者是消息源,在对消息进行处理后将消息发送至分布式消息队列,消息接收者从队列中获取消息进行处理。整个过程中,消息发送者和消息消费者之间没有直接耦合,消息发送者将消息发送给消息队列之后就结束了对消息的处理,而消息接收者只需要从队列去获取消息进行处理就可以,不需要知道消息从何而来,由谁生产。对新增业务,如果需要调用消息,只需要订阅该消息,对原有系统和业务没有任何影响,从而实现了网站业务的可扩展性;

    消息接收者在对此消息进行过滤、处理、包装后,可以构成一个新的消息,继续发送出去,等待其他消息接收者订阅处理该消息;因此基于事件驱动的业务架构可以是一系列流程;

    事件驱动设计优势:由于消息发送者不需要等待消息接收者处理数据就可以直接返回,系统具有更好的响应延迟;同时在网站访问高峰的时候,消息可以暂时存储在消息队列里面,等待接收者根据自身负载处理能力控制消息处理速度,减轻数据库等后端存储的负载压力。

  • 分布式消息队列:队列是一种先进先出的数据结构,之前我们也讲过这点,分布式消息队列可以看作将这种数据结构部署到独立服务器上,应用程序可以通过远程访问接口使用分布式消息队列,进行消息存取操作,进而实现分布式的异步调用,基本原理如下图:

    消息生产者通过远程访问接口将消息推送给消息队列服务器,消息队列服务器将消息写入本地内存队列后立即返回成功响应给消息生产者。消息队列服务器根据消息订阅列表查找订阅该消息的消息消费者应用程序,将消息队列中的消息按先进先出的原则通过远程通信接口发送给消息消费者程序。

    目前开源的分布式消息队列有很多,比如RocketMQ,kafka等等,这些产品除了实现分布式消息队列的一般功能,在可用性,伸缩性,数据一致性,性能和可管理性方面也做了很大改善。

    伸缩性:由于消息队列服务器上的数据可以看作是被即时处理的,因此类似于无状态的服务器,伸缩性设计比较简单,将新服务器加入分布式消息队列集群中,通知生产者服务器更改消息队列服务器列表即可;

    可用性:为了避免消费者进程缓慢,分布式消息队列服务器内存空间不足造成的问题,如果内存队列满了,就会将消息写入磁盘,消息推送模块在将内存队列消息处理完以后,将磁盘内容加载到内存队列继续处理;

    防消息丢失:为了避免消息队列服务器宕机造成消息丢失,会将消息成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者处理之后才删除消息,在消息队列服务器宕机时,生产者服务器会选择分布式消息队列服务器集群中其他的服务器发布消息;

    分布式消息队列可以很复杂,例如企业总线ESB或者面向服务架构SOA;也可以很简单,例如我们就用MySQL来当做分布式消息队列,生产者将消息存入数据库,消费者按生成时间从数据库取消息消费,这就实现了一个简单的分布式消息队列,而且还有结合MySQL的主从,读写分离手段达到较高的可用性和性能指标。

 

利用分布式服务打造可复用的业务平台

使用分布式服务是降低系统耦合性的另一个手段,如果说分布式消息队列通过消息对象分解系统耦合性,不同子系统处理同一个消息;那么分布式服务则是通过接口分解系统耦合性,不同子系统通过相同的接口进行服务器调用。

随着网站由小变大,表现为整个网站单一应用系统逐步膨胀发展的过程,在这个过程中,网站功能业务日益复杂,整个应该系统逐渐变成一个错综复杂的大系统,如果不使用分布式服务来解耦的话就会带来如下问题:编译部署困难;代码分支管理困难;数据库连接耗尽;新增业务困难。

解决上述的问题方案就是拆分,将模块独立部署,降低系统耦合性。拆分又分为横向拆分和纵向拆分;

横向拆分:将复用业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式业务,不需要依赖具体的模块代码,即可快速搭建一个应用系统,而模块内部业务逻辑变化时,只要接口保持一致就不会影响业务程序和其他模块。

纵向拆分:将一个大应用拆分为多个小应用,如果新增业务较为独立,那就直接将其设计部署为一个独立的web应用系统。

纵向拆分相对比较简单,通过梳理业务,将较少相关的业务剥离,使其成为独立的web应用,而横向拆分,不但需要识别可复用的业务,设计服务接口,规范服务依赖关系,还需要一个完善的分布式管理框架。

  • 大型网站分布式服务的需求与特点

    • 服务注册与发现:基本上现在都是基于zk来实现的

    • 服务调用:通过SOAP协议实现

    • 负载均衡:对热门服务,需要部署在一个集群上,分布式服务框架要能够支持服务请求者使用可配置的负载均衡算法访问服务,使服务提供者集群实现负载均衡

    • 失效转移:分布式服务框架支持服务者提供的失效转移机制,当某个服务实例不可用,就将访问切换到其他服务实例上,以实现服务整体高可用

    • 高效远程通信:对于大型网站,核心服务每天的调用次数达到数以亿计,如果没有高效的远程通信手段,服务调用就会成为整个系统性能的瓶颈

    • 整合异构系统:由于网站可能会使用不同的语言开发部署在不同的平台上,所以分布式服务框架需要整合这些异构系统

    • 对应用最少侵入:网站技术是为业务服务的,是否使用分布式服务需要根据业务发展规划,分布式服务也需要渐进式的演变,甚至出现反复,即使用了分布式服务后又退回到集中式部署,分布式服务框架需要支持这种渐进式演变和反复,当然服务模块本身也需要支持可集中式部署,也可分布式部署

    • 版本管理:分布式服务框架支持服务多版本发布,服务提供者先升级接口发布新版本服务,并同时提供旧版本的服务供请求者调用,当请求者调用接口升级后才可以关闭旧版本服务

    • 实时监控:没有监控的服务是不可能实现高可用的,分布式服务框架还需要监控服务提供者和调用者的各项指标

  • 分布式服务框架设计:大型网站需要更简单更高效的分布式服务框架构建其SOA,这里以阿里巴巴的Dubbo为例,分析其架构设计,如下图所示:

    流程分析

    服务消费者程序通过服务接口使用服务,而服务接口通过代理加载具体服务,具体服务可以是本地的代码模块,也可以是远程的服务,因此对应用侵入较少(应用程序只需要调用服务接口,服务框架根据配置自动调用本地或者远程实现);

    服务框架客户端模块通过服务注册中心加载服务提供者列表(服务提供者启动后自动向服务注册中心注册自己可提供的服务接口列表),查找需要的服务接口,并根据配置的负载均衡策略将服务调用请求发送到某台服务提供者服务器。如果服务调用失败,客户端模块会自动从服务者列表选择一个可提供同样服务的另一台服务器重新请求服务,实现服务的自动失效转移,保证服务高可用;

    Dubbo的远程服务通信模块支持多种通信协议和数据序列化协议,使用NIO通信框架具有更高的网络通信性能。

 

可扩展的数据结构

传统的关系数据库为了保证关系运算(SQL)的正确性,在设计数据库表结构的时候,就需要指定表的schema-字段名称,数据类型等,并要遵循特定的设计范式,这些规范带来的一个问题就是僵硬的数据结构难以面对需求变更带来的挑战,有些应用系统设计者通过预先设计一些冗余字段来应对,但是显然这是很糟糕的设计,难以做到扩展,那么有没有更好的方案呢,无需修改表结构就可以新增字段呢?很多NoSQL数据库使用ColumnFamily(列族)设计就是一种解决方案,这是一种面向列族的稀疏矩阵存储格式,使用ColumnFamily结构的NoSQL数据库,创建表的时候,只需要指定ColumnFamily的名字,无需指定字段(Column),可以在数据写入时在指定,通过这种方式数据表可以包含数百万的字段,使得应用程序的数据结构可以随意扩展,而在查询时,可以通过指定任意字段名称和值进行查询。

 

利用开放平台建设网站生态圈

大型网站为了更好的服务自己的用户,开发更多的增值服务,会把网站的服务封装成一些调用接口开放出去,提供开发接入文档,供外部的第三方开发者使用,这个提供开放接口的平台称为开放平台。第三方开发者利用这些开放的接口开发应用程序或者网站,为更多的用户提供价值。网站、用户、第三方开发者互相依赖,形成一个网站的生态圈,既为用户提供更多的价值,也提高了网站和第三方开发者的竞争力和盈利能力。

开放平台是网站内部和外部交互的接口,外部需要面对众多的第三方开发者,内部需要面对网站内许多的业务服务。开放平台的架构设计大同小异,如下图所示:

 

                     

API接口:开放平台暴露给开发者使用的一组API,其形式可以是restful,RPC等各种形式;

协议转换:将各种API输入转换成内部服务可以识别的形式,并将内部服务的返回封装成API的格式;

安全:除了一般应用需要的身份识别,权限控制等安全手段,开放平台还需要分级的访问带宽限制,保证平台资源被第三方应用公平合理使用,也保护网站内部服务不会被外部应用拖垮;

审计:记录第三方应用的访问情况,并进行监控。计费等;

路由:将开放平台的各种访问路由映射到具体的内部服务;

流程:将一组离散的服务组织成一个上下文相关的新服务,隐藏服务细节,提供统一接口供开发者调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大型网站架构核心要素之扩展性:可扩展架构 的相关文章

  • Android App 架构设计

    简介 本文是对谷歌原生文档的翻译 xff0c 仅供学习参照 原文链接 此文档写给希望学习最优编程实践和架构以开发健壮 高质量APP的开发者 开发者常遇到的问题 传统的桌面程序大多数使用场景是有一个启动入口 xff0c 作为一个独立进程运行
  • 23种设计模式

    目录 创建型 1 Factory Method 工厂方法 2 Abstract Factory 抽象工厂 3 Builder 建造者 4 Prototype 原型 5 Singleton 单例 结构型 6 Adapter Class Obj
  • 好的软件架构设计

    什么是软件架构 前言 软体设计师中有一些技术水平较高 经验较为丰富的人 他们需要承担软件系统的架构设计 也就是需要设计系统的元件如何划分 元件之间如何发生相互作用 以及系统中逻辑的 物理的 系统的重要决定的作出 在很多公司中 架构师不是一个
  • Weblogic 12c 负载均衡和session复制

    在上一篇 我们介绍了weblogic集群的部署和session的复制 如何将请求负载均衡到这个三个服务器上呢 这里提供两种方式 1 weblogic自带的proxy代理 2 nginx实现负载均衡 一 通过proxy实现负载均衡 1 创建p
  • Weblogic 12c 集群环境搭建

    本文是在windows7操作系统下配置的 jdk版本1 7 weblogic版本12 1 3 0 0 搭建集群前的规划 其中AdminServer是总控制端 server1 server2 server3是集群中的三个服务节点 其中Admi
  • 大型网站架构之架构模式

    上节讲了大型网站的演变 今天讲下架构的模式 什么是模式呢 每一个模式描述了一个再我们周围不断重复发生的问题及问题解决方案的核心 这样你就能一次次重用该方案而不必去做重复的工作 可见模式的关键在于可重复性 网站架构模式的目标 面临高并发访问
  • 自底向上和自顶向下的架构设计区别

    某日小明上数学课 他的老师给了很多个不同的直角三角板让小明用尺子去量三角板的三个边 并将长度记录下来 两个小时过去 小明完成任务 把数据拿给老师 老师给他说 还有一个任务就是观察三条边之间的数量关系 又是两个小时 聪明的小明连蹦带跳走进了办
  • VMware vSphere Client 安装虚拟机

    一 VMware vSphere Client安装虚拟机步骤 1 启动虚拟机安装 如下图所示 2 选择所需要安装的虚拟机类型 例如Centos7 ubuntu debian等 3 选择磁盘 内存 CPU大小 4 启动虚拟机 5 选择操作系统
  • 怎么提高编程能力?逻辑思维能力?

    一 对于程序员的编程能力的提升 学习一门简单而且可用性强的语言 写点自动签到 自动下动漫之类的日常小程序 提高编程兴趣 比如 python 可以选择教材 Learn Python The Hard Way 学习常见的算法和数据结构 根据个人
  • [深入研究4G/5G/6G专题-59]: 以太网交换平台软件如何升级成基站平台软件

    前言 本文从全局的视角阐述把一个通用的Linux平台软件升级成基站平台软件 一 基站的硬件 1 1 设备硬件 1 2 SOC芯片
  • LVS、Nginx、HAProxy、keepalive 的工作原理详解

    当前大多数的互联网系统都使用了服务器集群技术 集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务 这些集群可以是 Web 应用服务器集群 也可以是数据库服务器集群 还可以是分布式缓存服务器集群等等 在实际应用中 在 Web 服务
  • 架构设计之道【精】

    一 本质 在了解架构本质之前先了解下架构的定义 百度百科对架构的定义 架构又名软件架构 是有关软件整体结构与组件的抽象描述 用于指导大型软件系统各个方面的设计 从定义中我们提炼出几个关键字 组件 结构 关系 组件 也可以称为软件元素或者是架
  • 大型网站架构核心要素之可用性:高可用架构

    前言 上节我们讲了网站核心要素之性能 这节我们接着讲第二个核心要素可用性 网站的可用性 描述的是一个网站是否可以正常使用的特性 这个特性是比较关键的 直接影响公司形象和利益 因此也有很多大公司把这点作为技术人员的绩效考核之一 既然那么重要
  • 【Spring Boot 集成应用】 OAUTH2统一认证单点登录中的各种模式说明

    1 OAUTH2统一认证介绍 OAuth 2 0 是一个行业的标准授权协议 OAuth 2 0 专注于简化客户端开发人员 同时为 Web 应用程序 桌面应用程序 手机等各种设备接入提供特定的授权流程 2 传统登陆认证 传统登陆方式是在每个服
  • Weblogic 12c 集群部署和session复制

    在上一篇Weblogic12c集群搭建的基础上 这一篇介绍Weblogic12c集群应用的部署和session复制 1 启动服务 首先在weblogic12c控制台 启动受托管服务server1 server2 server3 2 将要部署
  • 量化交易框架开发实践(一)

    量化交易平台指支持通过对数据进行多维度的定量分析 结合发现的特征定制策略 并能够基于历史数据对策略进行回测 最后支持实盘买卖的交易平台 从业务流上看 量化交易可以分解成 行情获取 gt 数据清洗 gt 指标计算 gt 策略开发 gt 策略回
  • 同城双活与异地多活架构分析

    本文首发于 vivo互联网技术 微信公众号 链接 https mp weixin qq com s OjfFcjnGWV5kutxXndtpMg 作者 vivo官网商城开发团队 采用高可用系统架构支持重要系统 为关键业务提供7x24的不间断
  • 简单spring cloud服务升级实现

    1 升级原则 隔离性 v1升级到v2时 相互独立 互不不干扰 稳定性 服务不停止 完成升级 接口保持畅通 2 具体实现 2 1 eureka项目 搭建eureka 网上很多 就省略了 2 2 feign接口项目 2 2 1 依赖
  • kubeadm 安装k8s

    关于k8s集群化部署 以下均是个人一步一步的完成部署 并且会罗列出在部署过程中遇到的各种问题及其解决方式 一 环境准备 环境准备阶段试用与master节点部署与work节点部署 即master和work节点全部都需要执行这些步骤 1 关闭防
  • Eureka迁移到Nacos之服务名称大小问题解决

    我们应用往Eureka中注册使用的名称以及应用内部通过Feign调用 使用的服务名称都是小写 如user service 但是注册到Eureka中后 应用的名称全部都是以大写的形式存储及展现 由于Eureka客户端对大小写的支持都是一样的

随机推荐

  • 【Cinemachine】VirtualCamera虚拟相机详解(一)

    摘要 VirtualCamera虚拟相机是Cinemachine系统中的核心组成部分 咱们一起来看看虚拟相机是怎么用的吧 你好 我是跟着大智学Unity的萌新 我叫小新 这是我本周的学习总结报告哦 虚拟相机 Cinemachine中的Vir
  • 《数据仓库与数据挖掘》期末复习总结

    数据仓库与数据挖掘 期末复习总结 适用教材 数据挖掘概念与技术 第3版 Jiawei Han Mieheline Kamber Jian Pei著 机械工业出版社 提示 与教材内容不完全匹配 有所取舍 写在前面 这份复习总结是笔者根据老师授
  • 数据库期末复习(SQLserver)

    数据库期末复习 填空 1 数据库技术经历了 人工处理 文件系统 数据库系统 三个阶段 2 SQL语言集 数据定义 数据查询 数据 操纵 数据控制 功能于一体 3 E R图的主要元素是 实体型 属性 联系 4 关系系统的完整性控制包括 实体完
  • scrapy DNS lookup failed: no results for hostname lookup

    版权声明 更多最新原创文章请访问 最新原创主页 更多最全原创文章请访问 更多原创主页 DNS lookup failed 问题 第一天还可以正常跑起来的代码 第二天就跑不起来了 scrapy 中 解决方法
  • C语言第二节 分支结构

    1 BOOL数据类型 BOOL数据类型是一种表示非真即假的数据类型 只有 YES和 NO两种情况 YES 1 代表真 NO 0 代表假 BOOL数据类型的变量可以用来接收表达式的返回值 只要返回非0 那么BOOL类型的变量的值就为YES B
  • hdu 1078 FatMouse and Cheese

    Problem acm hdu edu cn showproblem php pid 1078 题意 n n 个洞 每个洞都放有 0 100 个芝士块 老鼠从 0 0 出发 每次都能横着或竖着走最多 k 格 且要走到芝士块数比当前洞多的洞里
  • 支付宝拿技术开刀把扫码无情地革掉

    随着互联网和数据的积累 计算机算力的跃升和算法的优化 人工智能正在让生活变得更加便捷 二维码扫码支付横空出世没多久 我们刚刚习惯扔掉现金的后现代生活 支付宝却突然宣布刷脸支付将全面接管扫码支付 又一次 支付宝拿自己较得心应手的技术开刀 把自
  • AOP功能代码实例---Spring源码从入门到精通(十七)

    上篇文章主要介绍了 Profile注解 可以对不同的开发环境 test dev 选择性加载不同的组件 如果用AnnocationConfigApplicationContext 需要用无参构造函数 先自己getEnviroment 设置指定
  • Unity_Raycasters

    Raycasters The Event System needs a method for detecting where current input events need to be sent to and this is provi
  • Atlantis 【POJ - 1151】【扫描线模板讲解】

    题目链接 是第二次写这道题了 但是也加深了我对扫描线的印象了 具体什么是扫描线 我们就如是讲讲吧 扫描线就是为了方便处理有重的区间面积的方式 我们通过线段树的方式去优化它 可以做到更少的时间复杂度 对于一个二维平面 我们用一个平行于Y轴的线
  • conda遇到的问题

    在使用conda安装python时 使用conda install python 3 6 0出现以下错误 Solving environment failed CondaHTTPError HTTP 000 CONNECTION FAILE
  • cpp基础:对象和类

    1 类名首字母大写 Wakawaka 2 类接口 编写类的人提供的一个操作类成员的方法 3 通过关键字实现类成员的访问控制 4 封装 将实现细节和抽象分开被称为封装 如 h和 cpp文件分开 接口是实现封装的重要一环 5 默认访问权限pri
  • 《Linux C++项目必备》glog日志管理

    一 简介 Google Glog 是一个C 语言的应用级日志记录框架 提供了 C 风格的流操作和各种助手宏 二 下载 git clone https github com google glog git cd glog autogen sh
  • Matplotlib-绘制3D曲面-plot_surfaceh与plot_trisurf函数-数据结构

    Matplotlib 绘制3D曲面 plot surfaceh与plot trisurf函数 数据结构 3D平面绘制示例 plot surfaceh 网格采样点的生成函数np meshgrid 3D平面绘制示例 plot trisurf 3
  • Windows下nvm的安装与Idea内如何配置使用

    nvm node npm 区别 nvm nodejs 版本管理工具 类似于python的Miniconda 一个 nvm 可以管理很多 node 版本和 npm 版本 nodejs 是一个开源 跨平台的 JavaScript 运行时环境 n
  • 英伟达点开后显示无法连接服务器,解决win10提示“无法连接到 NVIDIA 检查您的互联网连接”的教程...

    nvidia控制面板是windows系统中自带的一个程序 我们一般会使用它来更新系统中的显卡驱动 有部分win10用户在使用这个软件的时候被系统提示 无法连接到 NVIDIA 检查您的互联网连接 但是该用户的网络是可以正常的使用的 别的软件
  • java中占位符的使用

    java中占位符的使用 SimpleDateFormat simple new SimpleDateFormat yyyy年MM月dd日 HH点mm分ss秒 String newDate simple format new Date Str
  • 国内常用镜像源

    国内常用镜像源 阿里云官方镜像站 https developer aliyun com mirror 清华大学开源软件镜像站 https mirrors tuna tsinghua edu cn 浙大镜像源 http mirrors zju
  • Segmentation with deep atlas prior

    文章目录 前言 一 Probabilistic Atlas 二 Deep Atlas Prior 三 Objective Function 四 Experiment Results 五 Analysis 前言 最近还是在看一些医学图像分割的
  • 大型网站架构核心要素之扩展性:可扩展架构

    前言 续上节大型网站架构核心要素性能之后 我们今天要讲的是第四个要素 扩展性 什么叫扩展性呢 简单的说就是在对现有系统影响最小的情况下 系统功能可持续扩展及提升的能力 讲扩展性之前 我先讲下扩展性和伸缩性的区别 因为这两个点经常有人会混淆