架构师备考的一些思考(二)
前言
以我的视野来看,部长或技术总监这种岗位还是比较难竞争的,换言之,程序员的上升空间比较窄,如果想要拿到高级岗位,最好的是工作三五年后就转项目经理,然后再往上爬。
架构师倒是也能晋升高级岗位,但就效率而言,是非常低的。就我的经验而言,架构师系的高级职位通常是技术管理一手抓,但这也代表着,责任更大,也就是锅更大。
所以架构师系的高级职是非常不稳定的,非常累,非常容易坚持不下来,尤其在你结婚生子后,就更难坚持下来。
所以,选择大于努力,如果想拼命向上走,还是尽快入坑项目管理才是上策,不想拼命或者做不到拼命的,那就无所谓选择了。
就算是同样的架构师,java系架构师也相对更好,生态好意味着java系架构师就相对学的不用那么多,也就不用那么累。
举个简单例子,java架构师可以不会安卓和鸿蒙,但net架构师必须会winform和wpf。
所以,还是那句话,选择大于努力,能入坑java还是尽早入坑java,这样你会少走几年弯路,而且如果你躺平了,能让你35岁以后能继续用技术吃饭,还吃的不错的,就只有java的生态。
当然,java系还有细分的,能选大数据就走大数据,大数据是一个工作内容异常简单,工作量异常少的一个岗位,而且大家还觉得你工作内容很神秘,会比较有尊严。
就我的个人学习flink的经验而言,学习flink的难度只有学习java的难度的30%,但你的工资可能高于java,加班也会少于java。
下面回到正题,架构师备考。
架构师备考——记忆难点
其实所谓的记忆难点,就是我们的理解和扯淡描述之间的转换比较难。
字节
在二进制中,数字 0 或者 1 就是一位(1 bit),8 位组成一个字节(Byte)。
位=bit=比特=最小单位
1字节(Byte)=8位( 比特(bit))
1字母=1字节
1汉字=2字节
【字】=word=(根据cpu的位数决定,32位cpu,1字=32比特=4字节)=4byte=32bit
1KB(千字节)=1024 字节。
1字节=1B(大写B)
字长:一个 32 位字长的 CPU 可以在一次运算中处理 32 位二进制数据,而一个 64 位字长的 CPU 则能处理 64 位二进制数据。
32位/64位CPU就是一次能处理4字节/8字节。
32个0或1能组合出2^32=4GB,所以32位CPU内存最大是4G,多了没用。
物理块:物理块是存储设备(如硬盘、固态硬盘等)进行数据存储和读取的基本单位。
300G硬盘,物理块是4MB,则物理块总数是300*1024/4=75 * 1024,即有75 * 1024=76800个物理块。
位示图(Bitmap):就是物理块的特殊目录,记录每个物理块是否被占用,用0,1表示,虽然只站位1位,但如果CPU是32位,那也会使用一个字节的空间,而其余31位是空的。
位示图定位物理块是通过物理块的编号,物理块编号是从0开始计数,位示图是通过自己是行号跟物理块匹配来定位的(位示图是矩阵,但那不方便记忆,就记行号和物理块编号一一对应,就够考试用了)。
流水线
流水线的周期是指流水线中各个子部件完成各自任务所需时间中最长的那个时间。 1-1-3-1,大家排队经过,第一个人6秒出来,后面的人9秒,12秒,15秒出来。
最大吞吐率=任务数量/完成时间,就是任务数量和任务处理时间的比值。即,一个周期完成一个任务的话,吞吐量=1/周期
加速比=任务数量执行时间/任务数量执行时间(流水线后的执行时间)
操作系统
window是分时操作系统。
分时操作系统会将 CPU 时间划分成固定长度的时间片,每个正在运行的程序轮流获得一个时间片的 CPU 使用权。
实时操作系统,任务未执行完,资源不释放,而分时会释放。
早年,我们买电脑时,销售员推销我们买AMD CPU,会说AMD打游戏好,这个依据就是,基于AMD CPU的任务占用资源后,不会主动释放。
混成系统
混成系统是嵌入式实时系统的子类。【中文翻译中文:把安卓系统嵌入到黑工厂生产的设备里,其实还是安卓系统,但改个名,叫混成系统】
混成系统是一种结合了连续动态系统和离散事件系统特征的复杂系统。【中文翻译中文:混成系统包含独立运行的任务(离散事件)和一系列串行运行的任务(连续动态系统事件)。实际上任何安卓系统都会有独立和串行的任务】
原型模式(property)
通过copy对象属性,或者clone获得新对象,就是DTO转实体的那个对象属性映射。
要能通过下面定义分析出他在描述的是原型模式。
用原型实例指定创建对象的类型,并且通过【拷贝】这个原型来创建新的对象。运行对象在不了解创建对象的确切类以及如何创建细节的情况下创建自定义对
象。
Builder(生成器模式)
就是java里常见的builder创建对象,或者理解为注解@Builder。
注:其他语言没有这个模式,其他语言开发,就理解为构造函数创建对象即可。
要能通过下面定义分析出他在描述的是生成器模式。
将一个复杂类的【表示】与其构造相分离,使得相同的构建过程能够得出不同的表示。【表示:这个表示是类的属性和函数,超脑残的定义,背吧】
Abstract Factory(抽象工厂模式):
通过不同的接口来获取不同对象。
注:抽象工厂模式与工厂模式的区别是,工厂模式是通过入参来获取不同的对象。这两种模式在其他语言中是随手写的代码,所以没有形成概念结构,这里要学会区分。
要能通过下面定义分析出他在描述的是抽象工厂模式。
提供一个创建一系列相关或相互依赖对象的【接口】而无需指定它们具体的类。
线程与堆和栈
线程的栈就是 int i这样的变量存储的地方。堆就是Teacher t =new Teacher()的t变量存放的地方。
栈不能在线程间共享,堆可以。
要注意考试时的文字游戏,【进程中某线程的栈指针是可以被 T1,T2 和 T3 共享的】这种说法是错误的,因为栈指针,就是int i。
可变成本
可变成本就是人工成功,例如制作1个手机要100块人工成功,那制作1000台就是可变成本=1001000
假设销售价为每台 2500元,总销售量为25000台,可变成本总额为 4000 万元,则销售额=250002500,每台手机的人工成本=4000/25000=1600,单个手机盈利=毛利=2500-1600=900
如果固定成本为250万,则最少要卖2500000/900=2778台,才能收支平衡。
如果税是16%,那每台手机税钱是,2500*84%=2100,(增值税是基于销售收入扣除的),则毛利=2100-1600=500,固定收入250万,则收支平衡为2500000/500=5000台。
段页式内存
在分段内存管理中,程序被划分为若干个逻辑段,如代码段、数据段、堆段、栈段等。每个段有自己的名称、长度和属性(如可读、可写、可执行等)。
每个段又被进一步划分为若干个固定大小的页面。
内存分配时,以页为单位进行分配,每个页有自己的页号和页内地址。
堆,栈,段页内存,线程
栈会分配到栈段的内存中,栈是线程私有的。
堆会分配到共享段中,所以堆是线程共享的。堆在段页式内存管理中可能跨越多个段和页,不同线程对堆的访问需要通过复杂的页表查找和转换。
【名词解释】基址:它是一个内存地址,代表内存区域的起始位置。
风格
仓库风格架构
- 集中存储:就是说数据都在一个数据库里。
- 数据驱动:就是说数据一更新,查询该数据就马上得到最新数据,因为都在一个库。
- 数据处理方式:就是存储到数据库
- 扩展性:可以增加插件扩展功能。
- 性能:可并行处理,性能高。
管道过滤器风格
- 这个主要是考察servlet的机制,所有的题型往servlet里靠即可。其他语言开发就把他像成一堆filter即可。这个一般情况是架构中的一个小环节,纯用管道过滤器做出来的组件还是很少见的。
例如:定义俩个构件,前一个构件的输出作为后一个构件的输入,过滤器就是构件,连接件就是管道。 - 特点:数据流动,功能单一,组合灵活。
- 扩展性:可以灵活增加filter。
- 性能:可并行处理,性能高。
规则风格
例如,银行理财,利用规则调整每日进行不同的金额生成。
- 特点:通过修改规则修改系统。
- 扩展性:通过修改规则应对新情况
- 性能:支持并发,性能高。
解释器风格
比如网络编程网站,数据库客户端都是解释器风格。
解释器可以在运行时动态地解释执行代码,这使得程序具有很高的灵活性。可以在运行时修改代码、添加新的功能或调整程序的行为,而不需要重新编译和部署程序。
解释器包括解释引擎、被解释的代码的存储区、一个记录解释引擎当前工作状态的数据结构,以及一个记录源代码被解释执行的进度的数据结构。可以通过新建规则实现可扩展性。
解释器通常需要逐行解释执行代码或表达式,而不是像编译型语言那样将代码一次性编译为机器码后再执行。这导致在运行时需要花费更多的时间进行解释和执行的过程,从而性能相对较低
解释器风格的系统通常可以比较容易地扩展语言的功能。因为解释器本身可以被修改或扩展,以支持新的语法、操作符或功能。
隐式调用风格
隐式调用风格是构件通过触发,广播,委托,或者事件进行数据传递的模式。构件要统一注册,当某个事件被触发时,就可以调用指定构件。在构件中还可以注册构件,当事件触发,就可以继续触发构件调用,形成链式调用。
隐式调用风格通常依赖于事件触发和消息传递机制,这可能会带来一定的性能开销。
隐式调用风格的系统通常具有良好的扩展性。新的组件可以很容易地添加到系统中,只要它们能够响应特定的事件或提供特定的服务。
隐式调用风格的系统中,组件之间的耦合度很低。组件之间通过事件进行通信,而不需要直接调用对方的方法或访问对方的内部状态。
隐式调用风格的系统是事件驱动的,即系统的执行是由事件触发的。
隐式调用风格的系统中,组件之间的通信通常是异步的。当一个组件触发一个事件时,它不需要等待其他组件的响应就可以继续执行。
Com的组装行为
COM 支持两种形式的对象组装:包含和聚集。
- 包含就是一种简单的对象组装技术,其含义是一个对象拥有指向另一个对象的唯一引中。
我理解是引用COM组件后,如引用arcgis,会生成一个arcgis.interop文件,文件包含了对 COM 组件的封装和适配信息,然后我们在使用该文件时,就好像在调用普通的NET类库一样。 - 聚集是直接把内部对象的接口引用传给外部对象的客户,而不再转发请求。
这种是常规的COM组件创建,想掉com组件,就直接请求COM组件接口,按照指定的COM组件格式定义接口和传递参数。
软件著作权
本题考查知识产权法中的《中华人民共和著作权法》保护期限知识点。《中华人民共和著作权法》中约定署名权、修改权、保护作品完整权永久保护,而发表权、使用权和获得报酬权,保护期限为:作者终生及其死亡后的50年(第50年的12月31
注:若作品为单位作品,则发表权、使用权和获得报酬权,保护期限为:50年(首次发表后的第50年的 12月31日)【其间未发表,不保护】。
根据《软件产品管理办法》第四条 软件产品的开发、生产、销售、进出口等活动应遵守我国有关法律、法规和标准规范。任何单位和个人不得开发、生产、销售、进出口含有以下内容的软件产品:
侵犯他人知识产权的;(-)
(二)含有计算机病毒的;
(三)可能危害计算机系统安全的;
(四含有国家规定禁止传播的内容的;
(五)不符合我国软件标准规范的。
面向对象
- 特点:封装,继承,多肽
- 扩展性:利用继承和多胎进行扩展
- 性能:操作封装在一起,支持并发,性能高。
软件设计
软件设计包括体系【结构设计、接口设计、数据设计和过程设计】。
这个软件设计只的是java系做对日开发的模式,这个模式只在java里成立。在其他语言里,这种设计是不成立的,即便是跟java一毛一样的c#里,也是不成立的。因为这世界上没有另一种语言,在开发时,要像java这样写一堆接口,然后还以接口为开发标准。
【正常的开发,接口设计根本不存在,因为他是过程设计的一小部分。】为了考试,这里要特殊背一下。
结构设计:这个结构设计指的是框架设计,但不包含接口设计,也就是说,他把框架设计分为了两部分,底层设计和上层设计,在java里,就可以理解为mapper+service设计(结构)和controller设计+iservice(接口),在其他语言,应该是ORM,领域,模型等等设计(结构),和controller设计(接口)
数据设计:这个指的是数据库表设计。
接口设计(人机界面设计):人机界面设计(controller接口设计),正常理解应该是前台,但这个考试里,它认为人机界面设计和接口设计是相等,大概是接口设计属于表示层,所以误导了出题人。
过程设计:这个指的是详细设计,就是写伪代码那步。
测试模式
测试模式分动态测试和静态测试。
动态分黑盒白盒。静态测试是个坑,因为他是指,不运行项目,就肉眼看,或者拿工具检测代码,这种测试是实际不存在的,所以考试时很容易中招。
UML图
包括类图、对象图、用例图、序列图、状态图、活动图、协作图、组件图和部署图等九种图形。
这个图要记住,很多题是通过这个图的类别来排除选项的。
【名词】派生属性:就是通过其他属性计算得到值的属性,例如邮寄费用,根据物品重量生成,那邮寄费用就是派生属性。
ER图不是UML图,ER图主要用于数据库设计,用于描述现实世界中的实体、实体的属性以及实体之间的关系。(ER图和类图,本质上没啥区别,但考试上概念有区别,非常难记,如果要考,那考题一定是出题人自己瞎理解的,那题一定是必死题)
MCcabe计算复杂度
McCabe 度量法又称为圈复杂度(Cyclomatic complexity)
这是一个扯淡的判定法,判定的方法是V(G)=P+1,其中 P 表示控制流图中的判定节点数量。
简单来说就是代码里if的个数+1。流程图里就是菱形的个数+1。
风格代表
数据流风格:批处理序列、管道-过滤器
调用/返回风格:主程序/子程序、面向对象、层次结构。
独立构件风格:进程通信、事件驱动系统(隐式调用)
虚拟机风格:解释器、基于规则的系统(医疗诊断系统),
仓库风格:数据库系统、超文本系统(博客系统)、黑板系统(语音识别,chatGPT都是使用声学模型、语言模型等多个模型来处理问题)。
数据驱动机制
数据驱动机制就是数据驱动的方法,有几种:数据库驱动应用,配置文件驱动应用,脚本语言驱动应用。这个有点IOC的感觉,控制翻转,反向以数据为中心驱动应用的表现。
文件系统结
这个结构就是分三级,直接地址索引,一级间接地址索引,二级间接地址索引
直接地址索引:存数据文件地址
一级间接地址索引:存直接索引的指针
二级间接地址索引:存一级间接地址索引
所以,如果一个磁盘块大小为 1KB,每个地址项大小为 4 字节,索引文件8个页,直接地址索引5个页,一级间接地址索引2个页,二级间接地址索引1个页,找文件地址是1,518的方法是:
这是要找文件地址为1和518的文件,1这个文件,是在0-4,直接地址索引5个页中,因为直接索引5个页,存的就是数据文件地址1,2,3,4,5。二级存的是直接地址的指针,存的数量是,1kb/4*2=512,一个页的大小,就是一个磁盘块的大小,而一个地址项,就是一个指针的大小是4,所以1kb(1024字节)/4字节=256,二级有2块,所以就是512。512+5<518。所以要找518,要去二级间接地址索引里找。
页面变换表
这个是必背的,一定会有1 ~ 2空,即这1 ~ 2分是必拿的。(注意,这里不要去跟段页式内存与进程的关系的概念靠,段页式内存我们理解为不存在的,是考试概念,这个页面变换表是比较接近真实内存情况的,是两种模式的内存管理)
虚拟内存:虚拟内存就是物理内存和部分硬盘(辅助存储)组合起来,供cpu调用的。
虚拟页面:在虚拟内存系统中,程序所使用内存,被细分成多个内存块,这些内存块就叫虚拟页面。
页帧/物理块:就是虚拟内存对应的物理内存和硬盘的地址。
页面变换表:就是用于记录虚拟内存中的页帧/物理块之间的对应关系。
存在位(Present Bit):表示该页面是否当前在物理内存中。如果存在位为 1,表示该页面在物理内存中;如果为 0,表示该页面不在物理内存中,需要从辅助存储中调入。
访问位(Access Bit):记录该页面是否被访问过。操作系统可以根据访问位来决定哪些页面是最近使用过的,以便在需要换出页面时进行选择。
修改位(Modified Bit):表示该页面是否被修改过。如果修改位为 1,表示该页面在被调入物理内存后被修改过,在换出时需要写回辅助存储;如果为 0,表示该页面未被修改过,可以直接丢弃。
保护位(Protection Bit):用于指定该页面的访问权限,如只读、读写、可执行等。
页号 | 物理块号/页帧号 | 状态位 | 访问位 |
---|---|---|---|
0 | 1 | 1 | 0 |
1 | - | 0 | 0 |
2 | 3 | 1 | 1 |
3 | 8 | 1 | 1 |
逻辑地址16位(逻辑=页号=虚拟):3148H,第一位3表示虚拟页面地址,页内地址是148H,查表,3对应的页帧是8,所以转换物理地址为8148H。
如果访问1页,因为1页状态位0,所以是没有在内存的,所以要淘汰一个在内存的页,为这次访问提供位置,那么淘汰0页,因为0页在内存,且近期未被访问。
自然连接运算
自然连接运算就是inner join。
假设有关系 R (A, B, C) 和关系 S (B, D, E):
关系 R 的数据为:{(1,2,3),(4,5,6)}。
关系 S 的数据为:{(2,7,8),(5,9,10)}。
求自然连接后结果为:{(1,2,3,7,8),(4,5,6,9,10)}
质量属性
质量属性的含义如下:
性能(响应时间),可用性(宕机恢复),可修改性(修改时间短),易用性,可靠性(容错、健壮性),安全性(验证逻辑,阻止非授权用户)
四大质量属性是:性能、安全性、可修改性和可用性。
- 提高性能——资源调度(就是负载均衡)
- 提高可用性——心跳(考试里的可用性是专指——服务查询(nacos)的心跳体系,通过心跳上线下线服务)
- 提高可修改性——信息隐藏(这个比较难记难理解,我猜测是他们认为一个表单修改的内容减少了,就提高了可修改性,这个要特殊背一下,有点反逻辑)
- 易用性——这个就是用户使用难易度。
- 可靠性——容错、健壮性。在意外或错误使用的情况下维持软件系统的功能特性的能力。【这是个坑,可靠性字面含义是等于可用性的,但这里就故意用这个词定义,而不是用容错性定义,这样就会增加做题的出错率】
- 提高安全性——追踪审计,就是记录日志和溯源。
安全性在考试里应该是特指java的Security和Auth2,他这套逻辑还是挺难理解的,尤其是结合了java的控制反转的结构。(java现在搞的组件设计都是控制反转,而其他语言都是正向开发)
非java系开发可以参考下面文章理解。
其实,如果是我们正常的、手工搭框架,我认为即便是java架构师也会把Security和Auth2踢出局,因为他这个模式有问题,不过,考试里很多题都会参考这个出,非java系开发,这块就只能蒙了,确实不好理解。
SpringBoot的Security和OAuth2的使用
构件类别
这个构件体系,就是spring的体系,因为整体是IOC,所以,就一个一个的构件往里注入。
由于我们大部分开发都是做应用开发的,而这种构件模式,虽然有,但相对还是比较少见的,非java开发可能工作20年也没这么开发过软件的可能性是很高的。
非java开发可以把这个构件模式想象为docker。java开发就比较幸福了,下面的定义一看,马上就可以联想到spring的各种组件了。
- (1)独立而成熟的构件。独立而成熟的构件得到了实际运行环境的多次检验,该类构件隐藏了所有接口,用户只需用规定好的命令进行使用。例如,数据库管理系统和操作系统等。
- (2)有限制的构件。有限制的构件提供了接口,指出了使用的条件和前提,这种构件在装配时,会产生资源冲突、覆盖等影响,在使用时需要加以测试。例如,各种面向对象程序设计语言中的基础类库等。
- (3)适应性构件。适应性构件进行了包装或使用了接口技术,把不兼容性、资源冲突等进行了处理,可以直接使用。这种构件可以不加修改地使用在各种环境中。例如 ActiveX等。
- (4)装配的构件。装配(assemble)的构件在安装时,已经装配在操作系统、数据库管理系统或信息系统不同层次上,使用胶水代码(gluecode)就可以进行连接使用。目前一些软件商提供的大多数软件产品都属这一类。
- (5)可修改的构件。可修改的构件可以进行版本替换。如果对原构件修改错误、增加新功能,可以利用重新“包装”或写接口来实现构件的替换。这种构件在应用系统开发中使用得比较多。
构件分类都是他们编的,所以含义也不用刻意记,就看字分析即可,分类模式如下:
(1)独立而成熟的构件。
(2)有限制的构件。
(3)适应性构件。
(4)装配的构件。这个是最坑的,他是调用的构件,就是调用系统存在的dll,光看字面意思,根本分不清他和可修改构件的区别。
(5)可修改的构件。
构件的分类方法
构件相关概念都是出题人自己编的。
第一种构件分类如下:
构件分类方法可以分为三大类,分别是关键字分类法、刻面分类法和超文本组织方法。
关键字分类法:就是写几个词描述构件,然后词分类。
刻面分类法:就是写几个段落描述构件,然后段落分类。
超文本组织方法:就是写个文章描述构件,然后文章分类。
然后看这道题:
基于构件的软件开发中,构件分类方法可以归纳为三大类:()根据领域分析的结果将应用领域的概念按照从抽象到具体的顺序逐次分解为【树形】或有向无回路【图结构】😭 )利用 【Facet】描述构件执行的功能、被操作的数据、构件应用的语境或意其他特征;()使得检索者在阅读文档过程中可以按照人类的联想思维方式任意【跳转】到包含相关概念或构件的文档。
- 答案是:超文本,刻面,关键字。
- 可以根据【】内的字来定位。
中间件
这里考的中间件是特指kafka和redis和nacos,其他语言就用rabbitMQ和redis和consul思考即可。
连接与通信:考试中认为,中间件是客户端与服务器的连接与通信(连接与通信是中间件的一个属性,在考试里认为它是主要属性,我个人感觉这么定义是有点怪,但还是能给与一定理解)
交易管理机制保证交易一致性:这个应该指的是用redis构件的分布式锁。
负载均衡和高可用:这个指的是nacos,一个内部组件Load Balance(低版本的是Robbin)实现负载均衡,一个是心跳实现高可用。
关系模式 R(U,F)
这个主要是要记一些名词。
在 “R(U,F)” 中:
“R” 表示一个关系模式(Relation Schema)。
“U” 是属性集(Attributes Set),即关系模式中所有属性的集合。例如,一个学生关系模式可能有属性集 U = {学号,姓名,年龄,班级号} 等。
“F” 是函数依赖集(Set of Functional Dependencies),用于描述属性之间的约束关系。例如,F 中可能包含函数依赖 {学号}→{姓名}、{班级号}→{辅导员} 等。
- 如给出关系R(U,F),U={A,B,C,D,E,F={A→BC,B→D,D→E}。
则有【依赖传递】,A→B,B→D,D→E。
根据依赖传递,可得新依赖关系,A→D,A→E - 如,U1={A,B,C)、U2={B,D,E},则分解p()。
这个问题是问拆表,把U表拆成俩表,然后字段是U1={A,B,C)、U2={B,D,E},这个拆表,比较好理解,我们经常拆,题中的拆法,是正确的拆法,所以什么也不影响,所以【无损连接并保持函数依赖】。
无损连接就是没丢字段。
R(U,F)候选码
候选码是指能够唯一标识关系中每一个元组的属性或属性组。
翻译过来就是,某一个属性可以直接或间接关联其他属性,这样他就可以标识这个关系了。
R(U,F)范式 NF
总共六个范式如下:感觉遇到这个题就只能弃了,背了也会忘,而且毫无道理可言。
第一范式(1NF):确保每一个属性都是原子性的,不可再分。
第二范式(2NF):在满足第一范式的基础上,消除非主属性对候选码的部分函数依赖。
第三范式(3NF):在满足第二范式的基础上,消除非主属性对候选码的传递函数依赖。
巴斯 - 科德范式(BCNF):在满足第三范式的基础上,消除主属性对候选码的部分函数依赖和传递函数依赖。
第四范式(4NF):消除多值依赖。
第五范式(5NF):消除连接依赖。
微服务
优点:
独立部署:各服务可独立部署,减少对其他模块的影响,提升发布频率和灵活性。
技术多样性:不同服务可以使用不同的技术栈,最适合解决各自的问题。
可扩展性:根据需要单独扩展某个服务,提高资源利用效率。
缺点:
复杂性增加:系统拆分成多个服务后,增加了运维和管理复杂度。
网络通信开销:服务之间的通信依赖网络,可能带来延迟和性能问题。
数据一致性:分布式系统的数据一致性管理更加复杂,需要额外的机制保障数据同步。
数据库分布式模式
这个数据库模式是针对java系的mysql数据库设计的,在java项目中,有时候会使用现有的开源项目,这些项目大多数是微服务模式的。
然后这些开源项目,通常会把表拆到8到20个数据库中,因为一开始起步时表和库就过多,所以之后,随着开发,表和库的混乱就是指数倍的增加,库表越多操作就越复杂,所以一些平平无奇的项目,也会有一些和淘宝京东这种大系统一样的困难要去面对。
也因此,有一些概念,本来是要到特定的环境下才需要学习的,但在java系统,就变成了常用概念。
- 全局外模式:
兽语:是对分布式数据库的最高层的抽象。
人言:全局外模式是一个图。就是是把分布式数据库看成集中数据库,集中数据库就是一个数据库。然后用一个图描述数据库结构。 - 全局概念模式:
兽语:是分布式数据库的整体抽象,包含了系统中全部数据的特性和逻辑结构描述分布数据库全局数据的逻辑结构,是分布式数据库的全局概念视图。
人言:全局概念模式是一个图,分布式数据库的整体、详细的逻辑关系图。
PS:全局外模式+全局概念模式明明是一个全局模式,他非得定义成俩,故意恶心人,可见出题人用心之险恶,让你学他那个考试课程,学完不会开发,而会开发的,看不懂课程内容。 - 分片模式:
兽语:描述全局数据逻辑划分的视图,是全局数据的逻辑结构根据条件的划分;每一个逻辑划分就是一个片段或称为分片。
人言:不是图,他是拆分数据库,就是横向,纵向拆分,比如按字段拆,按日期拆。 - 分配模式(分布模式):
兽语:描述局部逻辑的局部物理结构是划分后的片段(或分片)的物理分配视图;是全局概念层的内容。
人言:是一个图,就是记录上面的数据分片的逻辑关系图。 - 局部概念层:
兽语:由局部概念模式描述,是全局概念模式的子集;全局概念模式经逻辑划分后被分配在各局部场地上。
人言:局部概念层是个图,分布式数据库会有多个库,这个局部概念图就是节点库的逻辑描述图。
下面是文章三,这里结合进来,方便考前阅读
常见的系统
SAP:Systems, Applications and Products in Data Processing
MIS:Management Information System
ERP:Enterprise Resource Planning
SAS:Statistical Analysis System
PLM:Product Lifecycle Management
————————————————
SAP:就是管理企业资源管理的,一般是大公司用(SAP 的 ERP 系统设计复杂、功能强大,能够支持全球化的大型企业管理其跨国、跨部门的复杂业务流程)
MIS:企业信息管理,就是OA
ERP:企业资源管理,一般就是进销存,再加设备管理
SAS:统计分析系统,一般是平台,就是某公司搞了个平台,让其他公司来这注册,然后平台提供一些数据分析功能,高级点的提供一些AI的分析。
PLM:产品生命周期管理,就是制造业的软件,比如一个公司做车床,电梯,手机,一般是这种集成的产品,而不是像门,窗这种独立的产品,这种产品的生产在软件上的体现和操作,就是PLM。
其实都是软件开发系统,没啥区别,但从另一个角度,软件应用方向上,总结出了这些系统。
因为大企业会有很多系统,所以出现了EAI。
EAI 即企业应用集成(Enterprise Application Integration)。
EAI的层次如下:但这个不准,这个概念在考试时,出题人会随便改,比如,问最上层的服务是什么服务。答:流程控制,流程控制的确可以解释为应用层集成,可以说他在控制系统之间的流程,但这个是文字游戏,一般流程控制,我们第一反应是逻辑层的。
界面层集成
数据层集成
业务逻辑层集成
应用层集成
嵌入式系统
就是安卓系统,安装系统是计算模式。
- 混成系统
嵌入式系统子类
就是安卓系统加入了传感器的SDK,就是汽车上的安卓系统
物联网系统
就是车载系统,有传感器,数据传输,应用表现。属于层次结构。
控制模式
- 计算模式控制
就是cpu分配模式,合理利用资源,缺点一瘫痪全瘫痪。 - 同步异步控制
就是同步异步,缺点就是会有延迟,优点是一个延迟不影响别人。市面的大系统没有这模式的,这模式一般是我们开发的系统,比如交易,流水线等等。
tcp端口号作用
这个比较冷门,是对应用层进程寻址用的,我们写tcp代码时是要写端口号的,但那个是属于tcp协议部分,tcp协议用那个端口号建立连接,如果单问端口号的作用,那它就是应用层进程寻址用的。
DHCP
DHCP(Dynamic Host Configuration Protocol)就是自动给电脑分配IP的一个协议,电脑插上网线就会发这个协议,路由器收到后就会回一个消息,给电脑一个ip,然后我们使用ipconfig命令就能看到IP地址了。
概要设计和详细设计
- 概要设计:软件概要设计将软件需求转化为软件设计的【总体结构】和软件的全局【数据结构】。
【概要设计是总体结构好理解,是数据结构要特别注意一下,因为我们正常实践和理解的概要设计是不包含数据结构的。
这里的数据结构不是我们认知中的数据结构,他是指流程图,我们在写概要设计时,即使再省略,也还是要写流程图的。】
- 详细设计:过程设计,通过对结构细化,得到软件详细数据结构和算法。
注意1:详细设计的算法,就是我们写的伪代码,加减乘除,连表查询在这里都是算法。
软件结构化设计
就是网站开发,好听点就是叫网站应用开发,或者高级点ERP,MIS,CRM。
步骤是:系结构设计、接口设计、数据设计和过程设计。
这个其实是特指java+vue的前后台分离开发中的java后台接口项目的设计。具体对应真实操作如下:
系结构设计:框架开发。
接口设计:controller设计。
数据设计:数据库设计。
过程设计:代码开发。
软件逆向工程
软件逆向工程导出信息的四个抽象层次:
A.实现级:代码,符号
B.结构级:函数【特别注意,结构是函数,而不是结构】
C.功能级:类
D.领域级:package包/命名空间
逆向工程的一个坑,重构在考试里,定义为是属于逆向工程的。
测试方法
强度测试:是在系统资源特别低的情况下考查软件系统极限运行情况。
负载测试:用于测试超负荷环境中程序是否能够承担。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。
压力测试:通过确定系统的瓶颈或不能接收的性能点,来获得系统能够提供的最大服务级别的测试。负载测试和压力测试可以结合进行,统称为负载压力测试。
容量测试:并发测试也称为容量测试,主要用于测试系统可同时处理的在线最大用户数量。
- 强度测试:测试性能,测系统卡不卡,什么时候卡,理解为大数据传输测试。
- 负载测试:测可靠性,测系统挂不挂,什么情况挂,理解为用人的数量测。
- 压力测试:测可靠性,测系统挂不挂,什么情况挂,理解为用接口调用次数测。
- 容量测试:测并发数。
设计方法
ABSD/ABSDM——基于体系结构的软件设计,这个应该是必考的,需要背。
其步骤如下:
【需求=>设计=>文档化=>复审=>实现=>演化】
这个设计模式还是挺好的,可以学习一下,我以前也写过关于他的文章。
ABSD/ABSDM
ABSD是自顶向下,递归细化的方法。而不是自顶向下结合自底向上。注意递归是不停的自顶向下。
这类似个文字游戏,比如说咖啡是让你不困的,咖啡确实能让你不睡觉,但他通过加快心跳让你睡不着,而不是让你头脑清醒睡不着。
软件方法学是
软件方法学是以软件开发方法为研究对象的学科。
自定向下开发方法:是先对最高层次中的问题.进行定义、设计、编程和测试,而将其中未解决的问题作为一个子任务放到下一层次中去解决。
自底向上开发方法:是根据系统功能要求,从具体的器件、逻辑部件或者【相似系统】开始,通过对其进行相互连接、修改和扩大,构成所要求的系统。(这个相似系统是个坑,会让你以为是原型开发,这里相似系统也是一个组件)
形式化开发方法:是建立在严格数学基础上的软件开发方法。
非形式化方法(代表-头脑风暴):不把严格性作为其主要着眼点,通常以各种开发模型的形式得以体现。从适应范围来看,可分为整体性方法与局部性方法。适用于软件开发全过程的方法称为整体性方法;适用于开发过程某个具体阶段的软件方法称为局部性方法。
Lambda架构和kappa架构
这个估计,最近几年都要考
lambda架构就是spark+hadoop那一套大数据处理,lambda分俩层,批处理层和实时层和服务层。
这个逻辑是这样的
1,实时层把数据存到数据库,比如hbase这类hdfs系的数据库。
2,然后批处理层读取这些数据进行批处理,就是成批的数据进行逻辑操作。
3,服务层就是提供接口,让用户可以查询实时层和批处理层搞定的数据。
Kappa架构是两层
1,数据处理层,就是合并了实时层和速度层;这是得益于flink能够自己实现数据的存储,和flink能够结合kafka实现数据存储。代码表现就是flink有ListState和valueState,能存储数据。
2,服务层就是提供接口,让用户可以查询数据处理层搞定的数据。
PS:其实这个大数据这个概念本质上就是扯淡,就是通过消息队列把数据搞出来,然后成批处理(批处理)或者一个一个处理(流处理),这东西以前一直有,自己写个后台应用就能处理,多线程啥的自己调优就行,性能不够,就把数据分到不同节点处理,这是一直有的东西,然后突然冒出来了个大数据,就自己单独立了一块。
Flink的State和Spark的mapGroupsWithState以下是一些主要差异:
状态的持久化和容错:在 Spark 中,mapGroupsWithState 是一种 “有限” 的状态管理,它的状态会定期存储和更新,但 Spark Structured Streaming 的流处理模式依赖微批处理,而 Flink 是真正的事件驱动的低延迟流处理。微批处理带来的额外延迟和状态更新的复杂性,使得 Spark 不如 Flink 高效。Flink 的状态(例如 ListState)可以针对每个事件进行细粒度的更新,适合高吞吐和低延迟的实时流处理。
计算模型:Spark 的微批处理模式在处理数据延迟和事件时间处理上不如 Flink 灵活,因此在大规模、低延迟场景下,Spark Structured Streaming 的状态管理性能通常不如 Flink。在速度层实时处理数据的同时,历史数据的批处理效率和一致性也难以保证,这也是 Lambda 架构中批处理层存在的原因。
状态复杂度:mapGroupsWithState 适合处理较小的、可管理的状态数据。对于大型复杂状态和需要长期存储的数据来说,Flink 的状态模型更健壮,支持分区和增量快照。此外,Flink 的状态操作类型更多样(如 ValueState、ListState 等),可以灵活应对不同场景,而 Spark 的状态处理能力相对有限。
因此,虽然 Spark 通过 mapGroupsWithState 实现了状态存储功能,但它的微批处理模式和状态管理机制使其更适合于一些特定场景,而在需要批处理历史数据的情况下,批处理层仍然是必要的,以确保数据一致性和完整性。在 Lambda 架构中,批处理层可以确保数据的准确性和一致性,速度层则提供实时响应的能力。
云服务与云计算
云服务就是远程服务器。
云计算就是调配远程服务资源。
远程服务器多了以后,就可以搞一些虚拟远程服务器,这样就能诞生更多服务器给客户用,而调配这些资源的操作就叫云计算。
4+1视图模型 2024年下半年考试考了
逻辑视图(Logical View),进程视图(Process View),开发视图(Development View),物理视图(Physical View)。
场景视图(Scenarios View),也称为用例视图(Use Case View)。
“4” 指的是逻辑视图、进程视图、开发视图、物理视图这四个不同角度、不同侧重点的对软件系统架构进行描述的视图。
“1” 指的是场景视图(也称为用例视图),它起到将前面四个视图联系起来的作用,通过描述具体的使用场景和用例,展示在实际应用场景下系统各部分依据其他四个视图所设定的架构是如何协同工作的。
RUP(Rational Unified Process)2024年下半年考试考了
RUP(Rational Unified Process)即统一软件开发过程,是一个面向对象且基于网络的程序开发方法论。
用例驱动(Use Case Driven)
以架构为中心(Architecture-Centric)
迭代增量式开发(Iterative and Incremental Development)
阶段划分
初始阶段(Inception Phase)
细化阶段(Elaboration Phase)
构建阶段(Construction Phase)
交付阶段(Delivery Phase)
注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!