当前位置: 首页 > article >正文

架构演进之路

架构演进

  • 前言
  • 1. 单机架构
  • 2. 应用数据分离架构
  • 3. 应用服务集群架构
  • 4. 读写分离 / 主从分离
  • 5. 冷热分离架构
  • 6. 业务拆分 —— 微服务
  • 7. 总结

前言

架构之所以会进行演变,是因为硬件的限制导致没办法容纳更多的请求
解决方法一般有:开源、节流
开源:即增加某台服务器的配置
节流:将流量分摊

1. 单机架构

顾名思义,将所有的服务放到一台服务器上
在这里插入图片描述

缺陷:一台服务器的可扩展能力有限,如果对硬件需求高于服务器最大能力则导致无法正常提供服务
优点:简单、方便、便宜

2. 应用数据分离架构

在单机架构的基础上,将应用服务和数据库部署到不同的服务器上,应用服务通过网络访问数据,可以最小代价的提升系统的承载能力
在这里插入图片描述

3. 应用服务集群架构

随着访问量越来越多,一台应用服务器已经无法满足大量的请求时,应用服务器集群孕育而生,将应用服务部署到多台服务器上,由负载均衡器来调度分配请求到应用服务器上
在这里插入图片描述
负载均衡策略:

  1. Round-Robin轮询:即非常公平地将请求依次分给不同的应用服务器。
  2. Weight-Round-Robin 轮询:为不同的服务器(比如性能不同)赋予不同的权重(weight),能者多劳。
  3. 一致哈希散列:通过计算用户的特征值(比如 IP 地址)得到哈希值,根据哈希结果做分发,优点是确保来自相同用户的请求总是被分给指定的服务器。也就是我们平时遇到的专项客户经理服务.

有朋友就要问了,虽然请求被分摊到了每个应用服务器上去处理,但是负载均衡器可是接收了所有的请求,那负载均衡器不就也会有请求达到上限的时候吗?
对的,负载均衡器的处理能力也会达到上限

  1. 负载均衡器只需要做分发的工作,这意味着他需要处理的事难度很低,能够比应用服务器容纳更多的请求
  2. 可以横向扩充负载均衡器的个数,形成多个集群,就类似于有的大学,因为招收学生不断的增多,一个校区已经容纳不下那么多的学生,就可以新建新的校区

4. 读写分离 / 主从分离

应用服务器集群架构虽然解决了单个应用服务器访问量过大的问题,但是应用服务器都连着同一个数据服务器,这就导致数据服务器的访问量过大,所以就有了读写分离架构
在这里插入图片描述
在实际应用中,大多数情况都是读的次数比写的次数多很多的,所以可以让读写分离,分别取访问不同的服务器,当用户写数据时,修改主数据库,并且同步到从数据库

5. 冷热分离架构

虽然主从服务器解决服务器访问量的问题,但是并没有解决效率问题,由于数据库是要和磁盘交互的,这就意味着效率很低。
解决方法:引入缓存服务器,计算机也有“二八”定律,即百分之二十的数据能够支撑百分之八十的访问量,正是因为这个原因,便可以把少量数据存在缓存中(即内存),访问内存的速度可比访问磁盘速度快多了
Redis就可以用做缓存服务器“在这里插入图片描述

6. 业务拆分 —— 微服务

由于有多台应用服务器但是代码只有一份,会导致代码的复杂程度分成的高,而且维护困难,最重要的是管理难度非常高微服务就是为了解决"人"的问题而生的

将业务分给不同的开发团队去维护,每个团队独立实现自己的微服务,然后互相之间对数据的直接访问进行隔离,可以利用 Gateway、消息总线等技术,实现相互之间的调用关联。甚至可以把一些类似用户管理等业务提成公共服务。
在这里插入图片描述
优点:代码复用,模块之间解耦,维护较容易

缺点: 效率会有所降低,因为服务之间需要通过网络交互,比访问内存慢很多

7. 总结

并不是演进越后的架构就越好,架构越靠后,就意味着投入的成本会很高,且每个架构有自己的优点,也会有自己的缺点,只有适合业务的才是最好的。


http://www.kler.cn/a/446582.html

相关文章:

  • 滚珠花键的保养与维护方法
  • 信号处理相关的东东(学习解惑)
  • EasyGBS国标GB28181平台P2P远程访问故障排查指南:客户端角度的排查思路
  • 【Python】基于Python的CI/CD工具链:实现自动化构建与发布
  • ElasticSearch 数据聚合与运算
  • 【人工智能】从TF-IDF到BERT:Python实现文本分类的全面指南
  • 学习“Kotlin编程指南”笔记
  • Hadoop HA高可用搭建
  • MySQL中常用的函数
  • “从零到一:揭秘操作系统的奇妙世界”【操作系统中断和异常】
  • wtforms+flask_sqlalchemy在flask-admin视图下实现日期的修改与更新
  • G口带宽服务器与1G独享带宽服务器:深度剖析其差异
  • wxWidgets使用wxStyledTextCtrl(Scintilla编辑器)的正确姿势
  • Node Version Manager (nvm) -管理不同版本的 Node.js
  • 【k8s集群应用】kubeadm1.20高可用部署(3master)
  • Eclipse设置自动补全后 输入字符串类型变量后会自动追加String的解决方案
  • 网络安全技术深度解析与实践案例
  • P1305 新二叉树
  • RPA 助力电商:自动化商品信息上传,节省人力资源 —— 以影刀 RPA 为例【rpa.top】
  • 【信息系统项目管理师】高分论文:论信息系统项目的成本管理(社区网格化管理平台系统)
  • 如何使用Python进行音频片断合成
  • vscode配置markdown代码片段snippet不生效问题
  • MFC/C++学习系列之简单记录13
  • Pytorch常用内置优化器合集
  • lvs介绍与应用
  • 提示词工程-Prompt Engineering