系统设计-后台系统的伸缩性

2023-11-02 08:58
文章标签 设计 系统 后台 伸缩性

本文主要是介绍系统设计-后台系统的伸缩性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、软件分层

分层思想很普及,把数据流拆成几段,比如接入层(load balancer+webserver),应用服务层(platformserver),数据存储层(数据库database、nosql)。

 

2、伸缩性定义

一种设计目标,使得系统通过加硬件(堆机器)能够解决各种业务问题,不存在性能瓶颈问题。比如微信红包,接入层、plaform层、数据存储层的数据通道是否够宽,扛得住上亿人同时在线的请求速度?

2.1 接入层(loadbalancer + webserver)

请参考一个客户端请求到后台的流程:tcp-ip 7层网络通信、负载均衡、API层、数据库中负载均衡部分的内容

(loadbalancerhaproxy) + (webservernginx)

haproxy+nginx 增加带宽容量的对策:加更多域名、更多转发机器

负载均衡在有状态情况下,怎么去堆转发机器?比如用户uid=a的所有请求必须转发到某个服务器b上。请参考一致性hash

 

2.2 Platform层

单例:某个程序,一个时刻所有请求都打到一台机器上,由于一台机器cpu/内存有限,会导致单例性能瓶颈。比如设计了一个请求计数器,让所有请求都得经过这个机器上这个进程,在内存里+1,最后得到结果。

正确做法如下:

(1)各个机器分别计数,然后查询的时候查各个机器结果相加,尽量做分布式(让请求均匀打在各个分布式机器上),避免单例。

(2)尽量只用这一层算,不要用这一层来存具体的数据结果,存数据的话,送到下一层的专门的数据存储层。原因是:业务层的处理逻辑比较多,如果要是再用来维护数据的话,一方面很累,另一方面是数据存储层会有通用的数据接口来存各种各样的数据,没必要用这层来存。存储计算分离,存储统一,计算多样。

 

2.3 数据存储层

做后台一般不会专门让设计存储层,有很多现成的模型。请参考一个客户端请求到后台的流程:tcp-ip 7层网络通信、负载均衡、API层、数据库中数据库部分的内容。

(1)读写分离,增加读实例。 

读写分离来确保写和读效率都很高。写数据因为要确保数据不丢失,所以要写入硬盘,机械硬盘有一个摆臂,只适合采用log(尾部能添加的文件)的方式顺序写,摆臂不需要来回移动,速度最快。读数据需要随机读,硬盘访问数据比较慢,摆臂来回移动效率低。实际上这里面有三个进程:log方式顺序写,key-value方式随机读,把顺序写转化为随机读(log格式转为key-value格式)。

增加读实例:实际应用中,往往有很多场景,写数据次数很少,读数据次数很多。比如说写博客只需要写一次,但有可能同时有很多人在读博客。

(2)拆分:拆库和拆表

redis这种非关系型数据库相对来说好做伸缩,可以对key做哈希,分片到某一台机器上。

关系型就比较难做伸缩,俗称分库(竖直拆分)分表(水平拆分):

  • 把库拆成多个库(每个库有自己的master/slaves机器集群),一个库里面有很多细小的业务,按照每个小业务来拆。

  • 把表拆成多个表,原本只需要查一张表,现在需要查10张表,而且有的表是不能拆的。

每个库里的小业务可以拆到不同机器上。但是一个表拆开的不同表必须放在同一台机器上,因此拆库比拆表性能好点。

这篇关于系统设计-后台系统的伸缩性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/329515

相关文章

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

C++简单日志系统实现代码示例

《C++简单日志系统实现代码示例》日志系统是成熟软件中的一个重要组成部分,其记录软件的使用和运行行为,方便事后进行故障分析、数据统计等,:本文主要介绍C++简单日志系统实现的相关资料,文中通过代码... 目录前言Util.hppLevel.hppLogMsg.hppFormat.hppSink.hppBuf

linux系统中java的cacerts的优先级详解

《linux系统中java的cacerts的优先级详解》文章讲解了Java信任库(cacerts)的优先级与管理方式,指出JDK自带的cacerts默认优先级更高,系统级cacerts需手动同步或显式... 目录Java 默认使用哪个?如何检查当前使用的信任库?简要了解Java的信任库总结了解 Java 信

90%的人第一步就错了! 顺利登录wifi路由器后台的技巧

《90%的人第一步就错了!顺利登录wifi路由器后台的技巧》登录Wi-Fi路由器,其实就是进入它的后台管理页面,很多朋友不知道该怎么进入路由器后台设置,感兴趣的朋友可以花3分钟了解一下... 你是不是也遇到过这种情况:家里网速突然变慢、想改WiFi密码却不知道从哪进路由器、新装宽带后完全不知道怎么设置?别慌

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默