转:AKF 扩展立方体

转: https://www.cnblogs.com/fengyc/p/12286726.html

 

AKF 扩展立方体(AKF Scale Cube)是一个描述从单体应用到可扩展架构的模型,见 (https://akfpartners.com/growth-blog/scale-cube)[https://akfpartners.com/growth-blog/scale-cube]。这个模型在 Scalability Rules (架构真经)一书中进行了描述。

AKF 扩展立方体把单体应用扩展到可扩展架构的方式的过程划分为3个正交维度:

x 轴:水平复制
y 轴:业务拆分
z 轴:数据分片

这 3 个维度描述了从单体到可扩展架构的方法,在实践中有比较大的作用,x、y、z组合而成的向量大小正是系统的扩展性。

x 轴扩展

x 轴扩展描述了比较简单的扩展方式,又称水平扩展,通过复制节点,实现多个节点同时提供服务,从而大大提高系统的总体容量、解决单点问题等。

水平扩展是比较理想的扩展方式,一般来说开发难度不大,但增加部署复杂度。这种扩展最为典型的例子是数据库的主从复制和读写分离。

典型的 web 应用读写比例非常悬殊,通常是 10:1100:1 甚至是 1000:1 ,因此需要更多的资源来支持读操作。同时,从数据的时效性上看,大部分数据并不需要非常高的实时性,3、5s 的少量的延迟往往是可被接受的。从数据的访问频率上看,基本上数据会遵守局部性法则(8020 法则),即大部分访问都是访问热点数据。从这些业务上的特点出发,往往有 2 类的手段来进行数据层面上的优化:加缓存、复制节点读写分离。

加缓存是非常有效的优化手段。数据库本身也带有缓存,像 mysql 的 innodb_buffer_pool ,用提高响应速度,除此之外,还可以:

本地内存、文件缓存,如 ehcache
中央缓存,如 redis / memcached

既然有缓存,就有缓存的有效性、有效时间,就会有缓存相关的问题,包括:

缓存穿透,用不存在的 id 访问系统,达成攻击
缓存击穿,特别的热的某个数据失效,所有的流量瞬间到了后端
缓存雪崩,某个时间缓存批量失效,所有流量到后端

读写分离通过加强基础设施的容量进行扩展。大部分的数据库,mysql、oracle、sqlserver 会支持某种主从备份(甚至是双主),这使得在基础设施层面能实施非常有效的扩展。以 mysql 为例,可把事务型的sql 放到主库执行,简单查询型的 sql 分布到多个从库读取数据,这一下子就把原来的负载分配到了几个数据库实例来承担,容量放大 n 倍。这种方式需要实现上做一些改动,在数据库访问层上需要支持某种形式的 sql 路由,而这些在成熟的 orm 、sqlmap 框架都已经提供,可看对应的 mybaits、hibernate 等文档。

当然 x 轴扩展不单只是加缓存或读写分离,像 dns 负载均衡、多接入服务器等都是 x 轴扩展方法。

y 轴扩展

y 轴扩展从业务层面来考虑扩展方式,因此又称为业务扩展或资源扩展,这点基本上就等同于微服务化。系统从业务层面拆分为多个子系统,各子系统由单独的团队负责整个生命周期的维护,单独部署运行,子系统间具备故障隔离的能力。

拆分的方式有水平的拆分和垂直拆分。垂直拆分是把接入、前端、安全、监控等不同技术层面的组件进行拆分,让各组件更加专注于自己的工作,体现在结构图上就是在垂直方向上进行了划分;水平拆分是按照不同的业务线,各业务线拆分开来,结构图上是按照水平方向上进行划分。y 轴的扩展更多是水平拆分这种方式。

每个子系统拥有自己的运行资源,可以有针对性地采用更加激进的优化手段。像与文档相关的子系统,可以减少使用关系式数据库,转而采用对分布式支持更好的文档型数据库,进行热点预测,对热点数据提前进行预处理等等。

拆分子系统后,通常数据库要进行拆分(分库)。分库带来了事务处理能力的直接提升,对于高事务型应用,可在数据库层面用一些比较高的配置,非事务型应用使用低点的配置,使得整体的运行成本更加合理,让好钢用到刀刃处。

需要注意的是,分库将无可避免地导致需要使用分布式事务。典型的分布式事务模式,目前常见的有数据库自带的 XA,java 中的 JTA,TCC,支持长时间业务的 Saga 等。这里给一个警告,尽可能避免分布式事务,目前并没有 100% 可靠而又高效的分布式事务解决方案。因此在进行 y 轴扩展拆分时,一个很有效的方法是事务应该尽量集中在子系统中,只有必须无可避免的时候才采用分布式事务,同时对分布式事务必须使用先写 undo_log 日志,以便在必要时进行自动甚至人工恢复。

拆分后同时带来了跨业务集成的问题。在《微服务设计》书中提到有两种风格的集成方式:请求响应、事件。请求响应有 RPC、REST方式,事件式可用各种消息队列(kafka、rabbitmq、activemq)等进行事件消息传递(openstack 里面的集成方式比较有意思,采用事件队列来进行 RPC)。

y 轴扩展需要比 x 轴扩展花费更多的精力,从开发、运维甚至组织架构都需要做出相应的调整。大家熟知的康威定律,系统的架构反映了组织的沟通结构,以技术至上的角度来实现 y 轴扩展,到头来只会让业务层面无法适应新系统而导致效率低下。

z 轴扩展

z 轴扩展是基于数据集本身的特性来进行扩展的方式,也即数据分片,在实践中,就是分表了。

对于关系型数据库而言,拆分数据意味着需要进行反模式的设计,依赖于数据库自身机制的完整性约束(主键、外键、域、唯一性)的设计也需要拆开。

数据的拆分需要对业务领域有较高的认识才好处理,拆分的代价相当高,需要引入一系列支持拆分的底层框架,像 sharding-jdbc、mycat 等,在数据层面需要配置相应的分片逻辑。正确的拆分对提高系统的容量有很大的帮助,失败的拆分可能会造成热点集中,得不偿失。

数据拆分可以和业务扩展共同使用,让业务跑在部分的数据上,实现故障隔离。在升级时,先对小范围进行升级,在出错时小范围的数据更加容易修复,待验证之后再进行整个系统层面的升级,这种控制范围的灰度发布在实践中非常实用,在各种云平台、 k8s 上都可以实现。

最后...

所有的扩展都会带了复杂度、成本提升的代价,要视业务的真正需要来进行扩展设计,避免过度的扩展。

通常来说,在设计阶段要设计 10 到 100 倍左右的逻辑容量,因为在后期修改设计会带来很高的难度,所以要提前设计好冗余容量。在实现阶段,通常要按照 5 到 10 倍左右的容量进行实现,实现阶段需要付出一定的成本,没有必要为非常长远的将来实现,可以随业务的进展而逐步实现设计时最大容量。部署阶段,以 2 到 5 倍的容量进行部署,可以应付一段时间内的容量增长,但如果是预期的增长非常大,就要采用更加灵活的云部署手段,并为突发峰值做好预案准备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漫画:三分钟了解敏捷开发

转载自 漫画:三分钟了解敏捷开发 什么是敏捷开发? 敏捷开发(Agile)是一种以人为核心、迭代、循序渐进的开发方法。 在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试&#xff0c…

微信小程序数组的坑

定义和用法 splice() 方法用于添加或删除数组中的元素。 注意:这种方法会改变原始数组。 返回值 如果仅删除一个元素,则返回一个元素的数组。 如果未删除任何元素,则返回空数组。 主要:array.splice(index,howmany&#xff09…

转: 理解RESTful架构

转自: http://www.ruanyifeng.com/blog/2011/09/restful.html 作者: 阮一峰 日期: 2011年9月12日 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。 这种"互联网软件"采用客户端/服务器模式&a…

Git 12 岁了,送给你 12 个 Git 使用技巧

转载自 Git 12 岁了,送给你 12 个 Git 使用技巧Git,一个分布式版本控制系统,它已经成为了开源世界的源码控制默认工具,在4月7号12岁了。但是使用Git中更另人沮丧的是,你需要了解多少才能让你更有效的使用它。同时这也是…

转:Kafka、RabbitMQ、RocketMQ等消息中间件的介绍和对比

转自: https://blog.csdn.net/yunfeng482/article/details/72856762 前言 在分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。现在开源的消息中间件有很多,前段时间产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注。 概念 MQ简…

微信小程序定时器setInterval()的使用注意事项

setInterval(function(){}, number 时间间隔/ms) 注意在setInterval中定义的函数中使用 this 指向的是该计时器,若要用到页面数据应如下操作: let thatthis setInterval(function(){ that.data.a0; },number 时间间隔/ms) …

图解分布式架构的演进

转载自 图解分布式架构的演进一、什么是分布式架构分布式系统(distributed system) 是建立在网络之上的软件系统。内聚性:是指每一个数据库分布节点高度自治,有本地的数据库管理系统。透明性:是指每一个数据库分布节点…

转:微服务架构:BFF和网关是如何演化出来的?(这篇文章相当棒)

转自: https://juejin.im/entry/6844903806208049159 这篇文章写得非常棒,从服务,到bff, 到gateway 的一步步演化,描述的非常清晰易懂。 1、介绍 BFF(Backend for Frontend)和网关Gateway是微服务架构中的两个重要概…

微信小程序的坑

<input>组件后台接受到的是字符串类型&#xff0c;若要用数字类型应用Number()进行转化 微信小程序中许多API会是页面的 this 转向应注意用 let that this 来获取页面的指针&#xff01;

实现滚到div时淡入效果

首先实现淡入的动画 CSS代码如下&#xff1a; keyframes float { from { position: relative; margin-top:200px; opacity: 0; } to { position: relative; margin-top: 50px; opacity: 1; } } 接下来用JS判断当前滚动的位置并加入…

高级 Java 面试通关知识点整理

转载自 高级 Java 面试通关知识点整理1、常用设计模式单例模式&#xff1a;懒汉式、饿汉式、双重校验锁、静态加载&#xff0c;内部类加载、枚举类加载。保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。代理模式&#xff1a;动态代理和静态代理&#xff0c;…

windows查找端口占用并杀死端口进程

tasklist 查看进程netstat -ano|findstr "8080" 查找端口 8080 占用信息&#xff1b; tasklist|findstr 7176 查找进程id为 7176的进程信息&#xff1b; taskkill /F /PID 7176 杀死进程7176

Angular项目打包到nginx部署过程

Angular项目打包到nginx部署过程 一. 打包Angluar ng build,会在项目文件夹下生成dist文件&#xff0c;里面是打包后的文件 二. 部署nginx 在nginx官网中下载nginx 把dist文件夹下的打包文件拷贝到nginx/html下并重命名为myProj 修改conf/nginx.conf文件 location / {root…

SpringMVC表单验证器的使用

转载自 SpringMVC表单验证器的使用本章讲解SpringMVC中怎么通过注解对表单参数进行验证。 SpringBoot配置 使用springboot&#xff0c; spring-boot-starter-web会自动引入 hiberante-validator, validation-api依赖。 在 WebMvcConfigurerAdapter实现类里面添加验证器及国际化…

转-Kafka【第一篇】Kafka集群搭建

转自&#xff1a; https://www.cnblogs.com/luotianshuai/p/5206662.html Kafka【第一篇】Kafka集群搭建 Kafka初识 1、Kafka使用背景 在我们大量使用分布式数据库、分布式计算集群的时候&#xff0c;是否会遇到这样的一些问题&#xff1a; 我们想分析下用户行为&#xf…

Angular 应用解决跨域访问的问题

设置反向代理 原理是设置反向代理服务器&#xff0c;让 Angular 应用都访问自己的服务器中的API&#xff0c;而这类API都会被反向代理服务器转发到 Java 服务API中&#xff0c;而这个过程对于 Angular 应用是无感知的。 业界经常是采用 NGINX 服务来承担反向代理的职责。而在 …

57张PPT彻底搞清楚区块链技术。。

转载自 57张PPT彻底搞清楚区块链技术。。

如何基于tomcat构建web站点

修改 conf/server.xml 配置&#xff0c; 如下&#xff1a; <Server port"8005" shutdown"SHUTDOWN"><Service name"Catalina111"><Connector port"8080" protocol"HTTP/1.1"connectionTimeout"20000&q…

小程序实现圆饼图

效果图 预备知识 CanvasContext.createCircularGradient(number x, number y, number r) 创建一个圆形的渐变颜色。起点在圆心&#xff0c;终点在圆环。返回的CanvasGradient对象需要使用 CanvasGradient.addColorStop() 来指定渐变点&#xff0c;至少要两个。&#xff08;详细…

一分钟开启Tomcat https支持

转载自 一分钟开启Tomcat https支持1、修改配置文件 打开tomcat/conf/server.xml配置文件&#xff0c;把下面这段配置注释取消掉&#xff0c; keystorePass为证书密钥需要手动添加&#xff0c;创建证书时指定的。 <Connector port"8443" protocol"org.apache…