更多内容关注微信公众号:fullstack888

常见的几种系统架构设计,接下来讲后面三个:

1、单库单应用架构:最简单的,可能大家都见过

2、内容分发架构:目前用的比较多

3、读写分离架构:对于大并发的查询、业务

4、微服务架构:适用于复杂的业务模式的拆解

5、多级缓存架构:可以把缓存玩的很好

6、分库分表架构:解决单体数据库瓶颈

四、微服务架构

上面的模式看似不错,解决了性能问题,我可以不用鲁肃街头了、老婆还是我的,哈哈,但是软件系统天生的复杂性决定了,除了性能,还有其他诸如高可用、健壮性等大量问题等待我们去解决,在加上各个部门的撕逼、扯皮,更让我们码农雪上加霜,所以,继续吧……

微服务模式可以说是最近的热点,花花绿绿、大大小小、国内国外的公司都在鼓吹,实践这个模式,可是大部分都没有弄清为什么要这么做,也并不知道这么做有什么好处、坏处,在这里,我将以我自己的亲身实践说一下我对这个模式的看法,不喜勿喷,随着业务与人员的增加,遇到的问题如下:

1、单体数据库写请求量大量增加,导致数据库压力变大

2、数据库一旦挂了,那么整个业务都挂了

3、业务代码越来越多,都在一个GIT里,越来越难以维护

4、代码腐化严重,臭味越来越浓

5、上线越来越频繁,经常是一个小功能的修改,就要整个大项目重新编译

6、部门越来越多,该哪个部门改动大项目中的哪个东西,撕逼的厉害

7、其他一些外围系统直接连数据库,导致一旦数据库结构发生变化,所有的相关系统都要通知,甚至对修改不敏感的系统也要通知

8、每个应用服务器需要开通所有权限、网络、FTP、各种各样的,因为每个服务器部署的应用都是一样的。

9、作为架构师,我已经失去了对这个系统的把控……

为了解决上述问题,我司使用了微服务模式,这种模式的一般设计如下图:

如上图所示,我把业务分块,做了垂直切分,切成一个个独立的系统,每个系统各自衍化,有自己的库、缓存、ES等辅助系统,系统之间的实时交互通过RPC,异步交互通过MQ,通过这种组合,共同完成整个系统功能。

那么,这么做是否真的能解决上述问题了呢?不玩虚的,一个一个来说。

对于问题一,由于拆分成多个子系统,系统的压力被分散了,而各个子系统都有自己的数据库实例,所以数据库的压力变小。

对于问题二,一个子系统A的数据库挂了,只是影响到系统A和使用系统A的那些功能,不会所有的功能不可用,从而解决一个数据库挂了,导致所有的功能都不可用的情况。

对于问题三、四,也因为拆分得到了解决,各个子系统都有自己独立的GIT代码库,不会相互影响。通用的模块可通过库、服务、平台的形式解决。

对于问题五,子系统A发生改变,需要上线,那么我们只需要编译A,然后上线就可以了,不需要其他系统做通向的事情。

对于问题六,顺应了康威定律,我部门该干什么事,输出什么,也通过服务的形式暴露出来,我部门只管把我部的职责、软件功能做好就可以。

对于问题七,所有需要我部数据的需求,都通过接口的形式发不出去,客户通过接口获取数据,从而屏蔽了底层数据库结构,甚至数据来源,我部只需保证我部的接口契约没有发生变化即可,新的需求增加新的接口,不会影响老的接口。

对于问题八,不同的子系统需要不同的权限,这个问题也优雅的解决了。

对于问题九,暂时控制住复杂性,我只需要控制好大方面,定义好系统边界、接口、大的流程,然后再分而治之、逐个击破、合纵连横。

目前来说,所有问题得到解决!bingo!

但是,还有许多其他的副作用会随之产生,如RPC、MQ的超高稳定性、超高性能,网络延迟,数据一致性等问题,这个就不展开来讲了,太多了,一本书都讲不完。

另外,对于这个模式来说,最难把握的是度,切记不要切分过细,我见过一个功能一个子系统,上百个方法分成上百个子系统的,真的是太过度了。实践中,一个比较可行的方法是:能不分就不分,除非有非常必要的理由!

优点:相对高性能,可扩展性强,高可用,适用于中等以上规模公司架构。

缺点:复杂度不好把握。指不仅需要一个能在高层把控大方向、大流程、总体技术的人,还需要能够针对各个子系统有针对性的开发。把握不好度或者滥用的话,这个模式适得其反!

五、多级缓存架构

这个模式可以说是应对超高查询压力的一种普遍采用的策略,基本的思想就是在所有链路的地方,能加缓存的就加缓存,如下图所示:

如上图所示,一般在三个地方加入缓存,一个是客户端处,一个是API网关处,一个是具体的后端业务处,下面分别介绍:

客户端处缓存:这个地方加缓存可以说是效果最好的一个——无延迟。因为不用经过长长的网络链条去后端业务处获取数据,从而导致加载时间过长,客户流失等损失,虽然有CDN的支持,但是从客户端到CDN还是有网络延迟的,虽然不大,具体的技术依据不同的客户端而定,对于WEB来讲,有浏览器本地缓存、Cookie、Storage、缓存策略等技术;对于APP来讲,有本地数据库,本地文件,本地内存,进程内缓存支持,以上提到的各种技术有兴趣的同学可以继续展开学习,如果客户端缓存没有命中,那么会去后端业务拿数据,一般来讲,就会有个API网关,在这里加缓存也是非常重要的。

后端业务处理:这个我就不用多说了,大家应该差不多都知道,什么Redis、Memcache、Jvm等等,不赘述了。

实践中,要结合具体的实际情况,综合利用各级缓存技术,使得各种请求最大程度的在到达后端业务之前就被解决掉,从而减少后端服务器压力、减少占用带宽、增强用户体验。至于是否只有这三个地方加缓存,我觉得要活学活用,心法比剑法重要!总结一下这个模式的优缺点:

优点:抗住大量读请求,减少后端压力。

缺点:数据一致性问题较为突出,容易发生雪崩,即:如果客户端缓存失效、API网关缓存失效,那么所有的大量请求瞬间压向后端业务系统,后果可想而知。

六、分库分表架构

这种模式主要解决单表写入、读取 、存储压力过大,从而导致业务缓慢甚至超时,交易失败,容量不够的问题。一般有水平切分和垂直切分两种,这里主要介绍水平切分。这个模式也是技术架构迭代演进的必经之路。

这种模式的一般设计见下图:

如上图所示红色部分,把一张表分到了几个不同的库中,从而分担压力。是不是很笼统?哈哈,那我们接下来就详细的讲解一下,首先澄清几个概念,如下:

主机:硬件,指一台物理机,或虚拟机,有自己的CPU,内存,硬盘等。

实例:数据库实例,如一个MySql服务进程,一个主机可以有多个实例,不同的实例有不同的进程,监听不同的端口。

库:指表的集合,如学校库,可能包含教师表、学生表、食堂表等等,这些表在一个库中。一个实例中可以有多个库,库与库之间用库名来区分。

表:库中的表,不必多说,不懂的就不用往下看了,不解释。

那么怎么把单表分散呢?到底怎么个分发呢?分发到哪里呢?以下是几个工作中的实践,分享一下:

主机:这是最主要的也是最重要的点,本质上分库分表是因为计算与存储资源不够导致的,而这种资源主要由物理机,主机提供的,毕竟没有可用的计算资源,怎么分效果都不是太好。

- END -

推荐阅读:

六种常见系统架构 - 基础篇

梳理消息队列 MQ/JMS/Kafka

如何打造一个TB级微服务海量日志监控平台

关于架构:应用架构之道分离业务逻辑和技术细节

2021 美国硅谷程序员调查:平均年薪 80 万,后端人才“吃香”

Nginx 可视化管理和监控神器

Apache Kafka 3.0 发布,离彻底去掉 ZooKeeper 更进一步

Flink 在伴鱼的实践:如何保障数据的准确性

快手公司厕所装坑位计时器,网友:再也不能带薪拉屎了!

Redis为什么变慢了?常见延迟问题定位与分析

关注:fullstack888

学习架构知识

互联网后端架构

六种常见系统架构 —— 进阶篇相关推荐

  1. 六种常见系统架构 —— 基础篇

    六种常见系统架构 -- 基础篇 常见的几种系统架构设计,本文先讲前三个: 1. 单库单应用架构:最简单的,可能大家都见过 2. 内容分发架构:目前用的比较多 3. 读写分离架构:对于大并发的查询.业务 ...

  2. nas安装emby_威联通QNAP系统入门进阶 篇二:宅家新姿势—威联通NAS安装套件版Emby搭建家庭影音服务器...

    威联通QNAP系统入门&进阶 篇二:宅家新姿势-威联通NAS安装套件版Emby搭建家庭影音服务器 2020-02-04 19:38:54 123点赞 1466收藏 123评论 你是AMD Ye ...

  3. 【转载】四种常见系统架构介绍

    转自于 四种常见系统架构介绍 - 宇大..大 - 博客园软件架构(software architecture)就是软件的基本结构. 合适的架构是软件成功的最重要因素之一.大型软件公司通常有专门的架构师 ...

  4. 系统架构-基础篇-(高性能基础建设说明与选型条件)

    本文牵扯的面积可能会比较泛,或者说比较大,在这个层面很多人也有自己的见解,所以我这也仅仅是抛砖引玉,结合前面讲述的一些基础技术,从思想中阐述更为深入的架构思想基础,因为最好的架构思想是架构师结合实际情 ...

  5. 基于WinSvr2016(TP)构建的“超融合技术架构”进阶篇

    之前我有给大家介绍过<基于WinSrv2016(TP)构建的"超融合基础架构">,架构如下: 那大家还记得微软从Windows Server 2012推出的SOFS(横 ...

  6. (七)nodejs循序渐进-模块系统(进阶篇)

    模块系统 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是 ...

  7. 游戏平台网站系统架构 账号篇

    游戏平台,这里指的是运营多款游戏的用户平台,类似腾讯,盛大.大多情况下游戏平台有多处地方的账号登录,如网站登录,游戏登录,应用登录等,而且在这些地方使用的账号都是通用的.所以,这就要求游戏平台必须维护 ...

  8. 现代IM系统中的消息系统架构 - 模型篇

    近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙.我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名. Xulu并不是第一个攻击Dock ...

  9. 安卓进阶之android系统架构

    安卓进阶之android架构 安卓进阶躲不开阅读源码和深入了解安卓的底层,这是一篇入门级别的文章,可以对安卓架构有个大体的认识. AOSP与Android系统架构 首先要理解andriod和AOSP的 ...

最新文章

  1. 浓缩精华的架构演进过程,我连看了六遍!
  2. 【hihocoder】三十九周:二分.归并排序之逆序对
  3. 怎样编写测试类测试分支_编写干净的测试–天堂中的麻烦
  4. PHP特级课视频教程_第二十七集 Coreseek安装与测试_李强强
  5. 入门机器学习(四)--Logistic回归
  6. ZEROC究竟是何方神圣? Leader-us 大神来的回答 Leader-us mycat的发起者
  7. 2100 反弹shell无法粘贴_技术成长日记-Vim实用技巧-4.6复制/删除/粘贴
  8. 专访李运华:程序员如何在技术上提升自己
  9. 图形面积用计算机软件计算方法,AutoCAD2018如何算面积 计算图形面积教程
  10. SEO必备工具之Xenu(绿蜗牛)网站死链接检测
  11. ambari集群修改ip地址
  12. php中怎么添加css样式_html怎么添加css样式?
  13. jquery插件整理篇(二)消息提示类jquery插件
  14. apk多开制作方法 试用ApkEditor 1.8 旗舰版轻松制作apk多开双开
  15. What Would Warren Do?
  16. Python数据挖掘课程 五.线性回归知识及预测糖尿病实例
  17. MT4API交易接口是什么?
  18. MATLAB | 全网唯一! 又双叒叕一种弦图绘制
  19. 【Web】一种好用的浏览器页面打印(打印销售小票)方法
  20. 什么是TCP-IP攻击?

热门文章

  1. 如何制作有星号的条形码
  2. Java项目:SSM健身房俱乐部管理系统
  3. 华为笔记本 Win10+Deepin 双系统安装方法
  4. 我是一个做房地产的置业顾问,我和计算机有着不可磨灭的孽缘
  5. 怎么进行免费流程图制作?不妨试试这些软件
  6. 二、软考2017年下半年软件设计师易错题整理
  7. Android接入SRS WebRtc直播流
  8. 实现MySQL数据全量迁移至Hive的简单脚本
  9. 制作一个播放器(一)
  10. LinearLayout下如何实现两端对齐