【分布式系统架构】架构演进方案

news/2024/11/23 1:38:07/

背景

在面试的时候我们可能会遇到面试官反问当流量激增的时候,你如何进行设计方案呢?
其实在架构设计的时候,简单、合适、演进进行设计,而具体的成熟方案高性能、高可用、可拓展。
比如假设我们刚开始用户量不多,日QPS几千。一般来说集群模式+读写分离+异步都可以完成支持。
但是我们需要有预案,所以为了完整展示系统架构演进过程,我从开始描述。

方案1 单体系统

刚开始,我们业务数据和QPS不高,采用的是SpringBoot单体模式,单数据库,本地文件存储。

方案2 集群模式+负载均衡

为了提高系统的可用性以及性能,采用集群部署方式,Nginx+集群+单数据库(索引优化+慢查询优化)+分布式文件系统

方案3 缓存

一般来说系统的性能都在读上,为了提高读性能,我们增加缓存,Nginx+集群+缓存+单数据库(索引优化+慢查询)+分布式文件系统。
当然上述缓存并不是说redis,而是可以在每个层都添加,比如DNS、Nginx、集群 数据库层操作系统层添加相应的缓存机制

方案4 主从复制+读写分离

一般来说虽然添加了缓存可以提高系统的读性能,但是写性能我们也需要提高,这个时候我们抽取出数据库,一个主库,一个从库,从库通过bin log实时同步主库的数据,主库负责事务性的读和写,而从库负责非事务性的读。
这个时候架构就成了Nginx+集群+缓存+主从复制(读写分离+索引优化+慢查询)+分布式文件系统

方案5 OSS

虽然我们使用自建的分布式文件系统,但是无法支撑高并发,所以需要需要替换成OSS,而这可以为在CDN上进行加速做准备。所以目前的架构就成了 Nginx+集群+缓存+主从复制(读写分离+索引优化+慢查询)+ OSS + CDN加速

方案6 分库分表

当系统的TPS越来越高的时候,主从复制+读写分离没有办法来支撑高并发流量,我们就需要进行分库分表,即一般来说能不分表就不分表,先进行分库,将每个业务系统的表拆分成单独的库进行读写。如果在此基础上还不能满足,在考虑数据分片和镜像。分片的机制在分布式系统中不仅仅可以提高性能,同时还可以提高数据的可靠性,即使一台机器宕机了,因为数据有冗余,所以可以提高可靠性。
但是分片的调整是非常高的,数据如何进行分,以及数据查询的时候如何聚合数据,数据路由等都是不小的挑战,基本上到这一步就是一个中大型互联网公司的演进之路了。
Nginx+集群+缓存+主从复制+分库分表(读写分离+索引优化+慢查询)+ OSS + CDN加速

方案7 数据平台中间件+ ES+其他NoSQL数据源

因为当数据到一定的量级,MySQL+Redis其实没有办法去满足,比如说针对日志搜索或者是大数据查询等方式,我们需要引入ES以及其他NoSQL,针对不同的数据格式采用不同的NoSQL进行存储。但是随着数据源越来越多我们需要集中管理数据,这个时候我们可以统一将各个数据源进行统一起来,对外提供API,而其他系统通过数据平台API进行访问。这就是数据平台中间件的原型。
Nginx+集群+缓存+主从复制+分库分表(读写分离+索引优化+慢查询)+ES+NoSQL+ OSS + CDN加速

方案8 业务拆分

业务进行拆分成不同的子系统,比如如果是借贷业务,可能贷前+订单+支付+三方+财务+基础架构等不同的系统,所以拆分后不同的系统可以通过集群的模式进行提供功能,而这样可以通过负载均衡提高整体的TPS。

Nginx+业务拆分+缓存+主从复制+分库分表(读写分离+索引优化+慢查询)+ES+NoSQL+ OSS + CDN加速

方案9 分布式微服务集群

在上述的基础上构建微服务系统,有自己的数据库,上下游系统可以通过rpc调用,将整体的链路进行打通。构建自己核心的基础系统,比如存储、报警、监控、基础框架等系统

方案10 云原生

在上述的基础上,使用docker+k8s+云上部署+使用云基础设置+第三方开放服务+serverless架构 。
如果流量突然暴涨怎么办?K8s可以进行弹性伸缩。以及我们可以有相应的降级策略,限流等机制。基本上这就是大型互联网的之路,从集群部署到分布式缓存、读写分离、分库分表、NoSQL、ES、消息队列异步 微服务、中台 、云原生。当然随着可能有相关的数据分析工作等,大数据离线分析,实时统计,日志处理等机制。

小结

以上就是针对互联网架构演进方案的表述,作为一个技术人员我们掌握这些基本可以解决大多数问题。


http://www.ppmy.cn/news/49318.html

相关文章

Git - 如何checkout一个tag

在版本管理中,Tag就是用来标记和保存一个配置状态,用来对配置进行跟踪和备份。 在发布版本时,一般都会创建一个Tag。然后用这个Tag就能引用到这个版本。 在Git中,如果知道一个Tag状态,如何在本地将配置切换到该状态呢&…

Java - Lambda 表达式

一、背景 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式(Lambda expression&am…

托福高频真词List03 // 附阅读真题

目录 4月23日单词 4月23日真题 4月23日单词 adjacentneighboringnearbyadj 毗邻的dependablereliableadj 可靠的 chronology a list that pairs past events with dates n 年表remarkably closeextremely close极为接近competenceabilityn 才能supplementadd tov 补充supplem…

Mybatis框架超详解及运用总结

Mybatis 一、什么是Mybatils?二、第一个Mybatils程序2.1、创建springboot工程2.2、准备数据2.3、配置MyBatis2.4、编写SQL语句2.5、单元测试 三、JDBC四、数据库连接池五、lombok六、Mybatis基础操作6.1、删除6.2、新增6.2.1、主键返回 6.3、修改6.4、查询6.4.1、数…

基于 多态 的职工管理系统(Staff Management System)

目录 一、管理系统需求 作用:管理公司内所有员工的信息 分类:要显示每位员工的编号、姓名、岗位与职责 具体实现的功能: 二、创建管理 类 三、各个接口函数 1、菜单展示功能 2、 选择功能 3、创建员工功能 ①普通员工employee ②经理…

【SpringBoot基础】SpringBoot的常用注解

文章目录 1. SpringBootApplication2. Value3. RestController4. RequestMapping("/api2/copper")5. RequestParam6. ResponseBody7. Bean8. ComponentScan 1. SpringBootApplication 定义在main方法入口类处,用于启动sping boot应用项目。 2. Value a…

20230419----重返学习-webpack基础-vue脚手架

day-053-fifty-three-20230419-webpack基础-vue脚手架 webpack基础 配置CSS的解析和压缩规则 需要在打包页面中使用样式【编译less为css,最后把css导入到页面中】初始打包,不支持less,需要配置打包规则,支持less 创建less文件 示例为: 在src…

【备考2023年软考】选系统规划与管理师,还是信息系统项目管理师?

目录 一、系统规划与管理师介绍 二、信息系统项目管理师介绍 三、二者区别 四、适合什么人考 五、怎么备考 1.了解考试大纲 2.系统学习(附带资料分享) 3.多做题 4.总结复习 软考系统规划与管理师和信息系统项目管理师是软考中的两个比较热门的证…