架构设计初识

由于各种原因,好久没有写文章了。最近学习了一下架构设计方面的知识,拿来和大家分享一下。

架构是什么,大家能都说出一二,每个人对架构的理解又不尽相同。但对于架构,我们有几个模糊相似的概念需要知道,分别是:系统与子系统,模块与组件,框架与架构。来说说这几种概念的区别。

维基百科的解释是:

系统泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。

抽象成三部分,分别为:关联(有关联的个体),规则(根据某种规则运作),能力(完成个别原件不不能单独完成的工作,新能力)。

根据字面意思,和系统定义相同,只是范围更小。举个例子,如淘宝系统,里面有资金,购物,会员系统等,都是一个个子系统

模块和组件都是系统的组成部分,但是从不同的角度拆分,有了不同的名称

从逻辑单元拆分,得到的就是模块。主要用与 职责分离

从物理单元拆分,得到的是组件。主要用于 单元复用

框架更多用于规范,如MVVC,MVP,如实现MVC的Spring框架

架构更多的关注的是系统的结构

现在,我们在设计架构或系统时,关注的点有很多,安全,可用,性能等,主要总结下来,有6点,分别是:高可用、高性能、可扩展、安全、低成本,规模。接下来对这几点进行总结。

对于用户量大、访问量高、重要的系统来说,高可用总是必不可少的。高可用分为二部分,分别是 计算高可用存储高可用

计算高可用主要是通过增加计算单元,如:多机部署。存储高可用主要通过备份数据,保证数据一致性,但数据间同步,又是新的问题。不管是增加计算单元,还是数据备份,都未系统带来了新的复杂性。但这些手段都是 用来减少和避免不可用问题,而不是用来解决问题

高性能复杂度主要体现在2个方面,分别是:单机高性能复杂度,集群高性能度。

单机提高性能主要体现在:多线程,多进程。多线程在数据同步问题,多进程在通信方面都会带来复杂度

集群复杂度主要体现在:任务分配,任务拆解。任务分配是在集群中,对任务如何分配是一个问题。任务拆解是因为在集群中单节点性能达到最大的时候,只有通过将任务通过过系统处理,来提高性能。

可扩展的复杂度主要体现在:预测变化,抽象在一直改变。

只有预测未来业务的变化,才能设计出可扩展的系统。如:系统是否需要分库分表,现在不需要,随着业务增长需要吗?..等等。

对系统抽象出来的代码也会随着业务的改变不停的改变,只有进行深层次抽象才能兼容多种业务逻辑。推荐多使用设计模式。设计模式主要用来 将变化和稳定分离

低成本复杂度主要体现在与高可用相互违背,如:高性能可能需要引入新技术,自研新框架,或增加机器,这些都会带来成本的增加。但低成本是架构设计考虑点,但不是首要点。

系统安全也是需要考虑。主要分为从架构层面和代码层面。

架构层面需要考虑架构是否安全,如Ddos攻击。 代码层面要考虑功能是否安全。如:Sql注入,RSS

规模的复杂度主要体现在:规模增大,会量变引起质变。如用户从1W变成10W,100W,就要考虑:高性能,高可用等。

架构设计的主要原则体现在三方面,分别是:合适大于业界领先,简单优于复杂,演化优于一步到位。

在做架构设计的时候,要选择业务合适的,而并非业界领先的。如:设计一个学生管理系统,看到大公司都是用微服务,那我们就用是用微服务。这样并不合适,因为学生管理系统在用户量,功能上等都打不到这样的量,单机就可以,可能需要考虑数据问题,但这在数据层面解决即可

在进行架构设计的时候,复杂的设计,带来的逻辑关系,或业务处理关系就会变得更复杂。如:把一个系统拆分成10个系统交互,这样带来的问题远远大于一个系统。并且复杂的系统排查问题,就需要更多的时间,花费更多的精力

任何事物是符合生物进化论的,架构设计也是如此。一开始我们设计架构,并不能就”一步登天”。主要体现在:

  • 人力,资源方便过多的投入会浪费资源
  • 业务在不断变化,并不能完全预测业务

在业务发展的的时候,会有更多的收入,这时候,再花费更多的资源,取其精华,去其糟粕,进行重构,这样也是合适的,收入和投入是成正比的。避免在一开始,进行假大空设计,到头来,业务并达不到量,浪费设计。或系统过与庞大,导致系统无法上线等问题。

设计流程主要也分了三部分,分别是:识别复杂度,设计备选方案,设计系统详细方案。

根据业务的需求,将目前主要的复杂问题罗列出来,根据团队,业务,技术等综合情况排序,选出最先需要解决的复杂问题。

在识别出系统复杂度问题后,我们就需要出设计方案,但是设计方案不能只有一套,需要设计出3-5套。设计方案太少,可能会由于自己的疏忽,见识等问题,未能覆盖复杂问题。设计的太多会影响精力,耗费大量的时间。

设计出的备选方案,需要有较大的区别,而不是一些无关紧要的区别,如:消息中间件是采用Kafka还是RocketMQ,而不是消息延迟15s还是30s。

在经过沟通后,选择出来一套 整体看起来可行的方案,这个时候我们就需要给出更多的细节,分步骤,分方式,分系统降低系统的复杂度。在设计详细方案时,可以找出系统整体能否实施部署等问题。在根据出现问题,做出一些细节问题的修改。

以上就是学习架构设计方面的知识啦,经过上面这些观察,了解,总出来一个架构设计的目的。架构设计的目的主要有两点:

  • 解决系统软件带来的复杂度问题
  • 应对业务或其他变化带来的麻烦

在做架构设计的时候,要紧紧贴合架构设计的目的,我们才能设计出够好的架构。

Original: https://www.cnblogs.com/lifacheng/p/14882179.html
Author: 编号94530
Title: 架构设计初识

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616904/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数据库-mysql索引篇

    点赞再看,养成习惯,微信搜索「 小大白日志」关注这个搬砖人。 文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。 mysql的索引类型? mysql中有5种索引:普…

    Java 2023年6月8日
    071
  • Oracle在操作系统层面kill所有session的语句

    原理,通过kill连接对应的进程来kill所有session。执行命令如下: ps -ef | grep LOCAL=NO | grep -v grep | awk ‘…

    Java 2023年5月30日
    058
  • BTrace 初探

    BTrace 是一款java诊断工具,在解决现场问题的时候非常有用。 今天使用的时候碰到几个坑,先记录一下. 下载下来以后直接运行报错 root@iZ2ze89756yjbvq7l…

    Java 2023年6月16日
    068
  • PostgreSQL远程访问设置

    数据库版本:9.3.23(Windows xp系统) 步骤: 1、需要修改数据库安装目录下的pg_hba.conf文件 修改成: 2、并使用psql执行pg_ctl reload重…

    Java 2023年6月5日
    071
  • java —— 异步任务失败后处理

    场景: 实际项目中,程序操作出了问题,后续要怎么处理是个很重要的问题,如果这个问题是同步操作引起的解决起来比较简单,比如用户注册,如果系统注册失败,后台可以马上返回错误信息,用户也…

    Java 2023年5月29日
    075
  • SpringMVC执行流程

    Spring MVC框架像许多其他MVC框架一样, 以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能, DispatcherServlet是一个实际的Servle…

    Java 2023年6月9日
    065
  • 第2课第5节_Java面向对象编程_异常_P【学习笔记】

    摘要:韦东山android视频学习笔记 java的异常处理的原则如下: 1、我们先写一个没有对异常处理的程序,在进行除法运算的时候,除数是非零的话,运行时没有问题的,但是除数为零的…

    Java 2023年5月29日
    091
  • 一个校验接口引发的思考–我真的了解Response吗

    一个校验接口 最近,我需要对接一个外部接口,基本功能是:校验指定的门店是否完善了货运信息。接口大致是这样的: POST https://******/Dealer/CheckCar…

    Java 2023年6月14日
    071
  • SpringBoot 过滤器,拦截器初步学习整理(有示例代码)

    引言 关于两者的理论知识,网上有太多就补贴在本章了。该文章主要以代码的形式说明,方便新手理解。这里也是新手学习时整理的文档,主要针对于新手的,如果有不正确的地方希望加一指正。 两者…

    Java 2023年6月9日
    080
  • Spring类ResolvableType、BeanWrapper使用

    在阅读Spring、SpringMVC 源码的时候经常看到这几个类,简单总结下这几个工具类的核心使用方法。 1. ResolvableType 直译过来就是可解析类型。 实际是对j…

    Java 2023年5月30日
    077
  • Spring-Cloud-Context模块

    SpringCloud这个框架本身是建立在SpringBoot基础之上的,所以使用SpringCloud的方式与SpringBoot相仿。也是通过类似如下代码进行启动。 Sprin…

    Java 2023年5月30日
    075
  • Mac启动SpringBoot InetAddress.getLocalHost() 执行很慢

    scutil –set HostName “localhost” 参考: https://blog.csdn.net/fngang/articl…

    Java 2023年5月30日
    066
  • iOS运行时编程(Runtime Programming)和Java的反射机制对比

    运行时进行编程,类似Java的反射。运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息、属性设置获取、类的动态加载(NSClassFromString(…

    Java 2023年5月29日
    0104
  • Linux安装mysql8.0.29详细教程

    我在上午卸载了陪伴我多年的mysql5.7,现在准备安装mysql8.0。 1)根据自己电脑的位数和你cpu架构相符的安装 2))选完之后找到RPM Bundle点击下载 1、登录…

    Java 2023年6月13日
    061
  • 【Java线程池】 java.util.concurrent.ThreadPoolExecutor 源码分析

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    089
  • 开发中为什么要使用Redis缓存

    用缓存,主要有两个用途: 高性能、 高并发: 高并发:mysql单机支撑到2000QPS 就开始容易报警了 如果大量的请求直接打到mysql上 将会引起mysql的宕机 而redi…

    Java 2023年6月6日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球