淘优惠

淘优惠

架构设计的五大原则 架构师必须知道的架构设计原则

热门文章 0

淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】

架构设计的五个要素,架构设计六大原则,架构设计分几个层次,架构的五大要素

目录

?

一、前言

二、软件设计原则

GRASP通用职责分配软件模式

1. 信息专家(Information Expert)

2. 创建者(Creator)

3. 低耦合(Low Coupling)

4. 高内聚(High Cohesion)

5.控制器(Controller)

6. 多态(Polymorphism)

7. 纯虚构(Pure Fabrication)

8. 间接(Indirection)

9. 受保护的变化(Protected 【【微信】】)

SOLID面向对象设计原则

1. 单一职责原则(The Single Responsibility Principle)

2. 开放封闭原则(The Open Closed Principle)

3. 里氏替代原则(The Lisko【【微信】】le)

4. 依赖倒置原则(The Dependency In【【微信】】)

5. 接口分离原则(The Interface Segregation Principle)

我的解读

三、分布式系统架构设计原则和理论

AKF架构原则

1. N + 1设计

2. 回滚设计

3. 禁用设计

4. 监控设计

5. 设计多活数据中心

6. 使用成熟的技术

7. 异步设计

8. 无状态系统

9. 水平扩展而非垂直升级

10. 设计时至少要有两步前瞻性

11. 非核心则购买

12. 使用商品化硬件

13. 小构建、小发布和快试错

14. 隔离故障

15. 自动化

我的解读

十二要素应用

1. 基准代码

2. 依赖

3. 配置

4. 后端服务

5. 构建、发布和运行

6. 进程

7. 端口绑定

8. 并发

9. 易处理

10. 开发环境和线上环境等价

11. 日志

12. 管理进程

我的解读

CAP定理

1. 一致性(Consistency)

2. 可用性(A【【微信】】)

3. 分区容忍性(Partition tolerance)

BASE理论

1. 基本可用(Basically A【【微信】】)

2. 软状态(Soft State)

3. 最终一致性(Eventual Consistency)

我的解读

四、组织和系统改进原则

康威法则

系统改进三原则

原理一:系统思考(System Thinking)

原理二:强化反馈环(Amplify Feedback Loops)

原理三:持续试验和学习的文化(Culture of Continual Experimentation And Learning)

我的解读

五、写在最后

六、参考

如果一个技术已经存在3年,比如现在很火的前端技术react和vue等,那么我能预估这个技术大致还有3年的生命期,再久就不确定了;如果一个架构或设计原则已经存在15年,例如单一职责和依赖倒置原则,我可以预期它还有15年甚至更久的生命期。原则是比具体技术更抽象,更接近事物本质,也更经得起时间考验的东西。这些原则沉淀在架构师的脑海中,最终内化成他的mindset,以潜意识方式影响和指导他的架构和设计工作。

一晃我在软件研发行业工作十多个年头了,前面大部分时间做架构设计和开发,现在转型做研发管理。随着时间的推移,很多技战术细节性的东西(工具,框架,编程语言)在我脑海中渐渐模糊,但是一些平时学习积累起来,并且在实践中加深体会的软件架构设计和组织原则,这些原则性的东西却丝毫没有被时间冲淡,反而愈加清新。现在即使我不在一线开发,但这些沉淀下来的原则仍然潜移默化地影响我的日常管理和部分架构设计指导工作。我想有必要总结一下那些业界知名,给我留下深刻印象的软件架构设计和组织原则,和大家一起分享。

来自【【淘密令】】的软件设计书《UML和模式应用》[附录1],Larman在书中提出软件设计的关键任务是职责分配,并提炼总结出9种(5种核心+4种扩展)软件职责分配模式,这些模式是比GoF设计模式更抽象的元模式。

1. 信息专家(Information Expert)

为对象分配职责的通用原则 C 把职责分配给拥有足够信息可以履行职责的专家

2. 创建者(Creator)

将创建A的职责赋给B,如果至少下面一种情况为真:

  • B“包含”或者聚合A
  • B记录A的实例
  • B密切地使用A
  • B拥有A的初始化数据

3. 低耦合(Low Coupling)

赋予职责使得对象间的耦合度尽可能低,最小化对象间的依赖和变更影响,最大化重用。

4. 高内聚(High Cohesion)

赋予职责使得每个对象的职责尽可能保持聚焦和单一,易于管理和理解。

5.控制器(Controller)

把职责赋予系统、设备或者子系统的表示类(门面控制器),或者某个用例的表示类(用例控制器),让控制器接收事件并协调整个系统的运作。

6. 多态(Polymorphism)

将职责分配给多个具有同名方法的多态子类,运行时根据需要动态切换子类,让系统行为变得可插拔。

7. 纯虚构(Pure Fabrication)

针对真实问题域中不存在,但是设计建模中有用的概念,设计虚构类并赋予职责。

8. 间接(Indirection)

在两个或者多个对象间有交互的情况下,为避免直接耦合,提高重用性,创建中间类并赋予职责,对象的交互交由中间类协调。

9. 受保护的变化(Protected 【【微信】】)

简单讲就是封装变化。识别系统中可能的不稳定或者变化,在不稳定组件上创建稳定的抽象接口,将可能的变化封装在接口之后,使得系统内部的不稳定或者变化不会对系统的其它部分产生不良影响。

1. 单一职责原则(The Single Responsibility Principle)

修改某个类的理由应该只有一个,如果超过一个,说明类承担不止一个职责,要视情况拆分。

2. 开放封闭原则(The Open Closed Principle)

软件实体应该对扩展开放,对修改封闭。一般不要直接修改类库源码(即使你有源代码),通过继承等方式扩展。

3. 里氏替代原则(The Lisko【【微信】】le)

当一个子类的实例能够被替换成任何超类的实例时,它们之间才是真正的is-a关系。

4. 依赖倒置原则(The Dependency In【【微信】】)

高层模块不应该依赖于底层模块,二者都应该依赖于抽象。换句话说,依赖于抽象,不要依赖于具体实现。比方说,你不会把电器电源线焊死在室内电源接口处,而是用标准的插头插在标准的插座(抽象)上。

5. 接口分离原则(The Interface Segregation Principle)

不要强迫用户去依赖它们不使用的接口。换句话说,使用多个专门的接口比使用单一的大而全接口要好。

  1. 我职业早年主要关注软件设计和编程,所以花蛮多时间学习和消化GRASP和SOLID设计原则。这些原则对我影响很深,尤其是单一职责,信息专家,关注分离,依赖倒置/封装变化,分而治之等核心原则,现在日常研发中我时常用这些原则指导新手工程师。
  2. 高内聚+低耦合,就像道中的一阴一阳,是所有其它OO设计原则的原则(元原则),其它设计原则都是在这两个基础上泛化衍生出来的。
  3. 上述原则虽然是针对OO设计和编程提出,但是对于大规模系统架构仍然适用。比如,微服务架构就体现了:
  • 单一职责:一个微服务尽可能要职责单一,提供的接口也尽可能单一(接口分离原则),安全/路由/限流等跨横切面的关注点(Cross-Cutting Concerns)由独立网关负责,体现关注分离(Separation of Concerns)。
  • 信息专家:当不确定哪个团队应该负责某个微服务时,一般原则也是谁拥有数据谁负责,基于有界上下文Bounded Context(一般是边界比较清晰的领域数据源)构建微服务。
  • 松散耦合:服务之间通过HTTP/JSON等轻量机制通信,服务之间不强耦合。
  • 受保护的变化和依赖倒置:服务之间只依赖抽象接口,实现可能随时变化。
  • 间接:网关在外面的客户端和内部的服务之间增加了一层间接,使两者不强耦合,可以相互独立演化。
  1. 作为架构师或者设计师,有两个设计能力是需要重点培养的,也是最难和最能体现架构设计水平的:
  • 合理的职责分配能力,也就是每个类/组件/子系统应该承担什么职责,如何保证职责单一,它们之间如何协作;
  • 系统抽象和核心领域建模能力,需要深入一线业务域。

这15个架构原则来自《架构即未来(The Art of Scalability)》[附录2]一书,作者马丁L.阿伯特和迈克尔T.费舍尔分别是eBay和PayPal的前CTO,他们经历过eBay和PayPal大规模分布式电商平台的架构演进,在一线实战经验的基础上总结并提炼出15条架构原则:

1. N + 1设计

永远不要少于两个,通常为三个。比方说无状态的Web/API一般部署至少>=2个。

2. 回滚设计

确保系统可以回滚到以前发布过的任何版本。可以通过发布系统保留历史版本,或者代码中引入动态开关切换机制(Feature Switch)。

3. 禁用设计

能够关闭任何发布的功能。新功能隐藏在动态开关机制(Feature Switch)后面,可以按需一键打开,如发现问题随时关闭禁用。

4. 监控设计

在设计阶段就必须考虑监控,而不是在实施完毕之后补充。例如在需求阶段就要考虑关键指标监控项,这就是度量驱动开发(Metrics Dri【【微信】】)的理念。

5. 设计多活数据中心

不要被一个数据中心的解决方案把自己限制住。当然也要考虑成本和公司规模发展阶段。

6. 使用成熟的技术

只用确实好用的技术。商业组织毕竟不是研究机构,技术要落地实用,成熟的技术一般坑都被踩平了,新技术在完全成熟前一般需要踩坑躺坑。

7. 异步设计

能异步尽量用异步,只有当绝对必要或者无法异步时,才使用同步调用。

8. 无状态系统

尽可能无状态,只有当业务确实需要,才使用状态。无状态系统易于扩展,有状态系统不易扩展且状态复杂时更易出错。

9. 水平扩展而非垂直升级

永远不要依赖更大、更快的系统。一般公司成长到一定阶段普遍经历过买更大、更快系统的阶段,即使淘宝当年也买小型机扛流量,后来扛不住才体会这样做不scalable,所以才有后来的去IOE行动。

10. 设计时至少要有两步前瞻性

在扩展性问题发生*虑好下一步的行动计划。架构师的价值就体现在这里,架构设计对于流量的增长要有提前量。

11. 非核心则购买

如果不是你最擅长,也提供不了差异化的竞争优势则直接购买。避免Not In【【微信】】症状,避免凡事都要重造轮子,毕竟达成业务目标才是重点。

12. 使用商品化硬件

在大多数情况下,便宜的就是最好的。这点和第9点是一致的,通过商品化硬件水平扩展,而不是买更大、更快的系统。

13. 小构建、小发布和快试错

全部研发要小构建,不断迭代,让系统不断成长。这个和微服务理念一致。

14. 隔离故障

实现故障隔离设计,通过断路保护避免故障传播和交叉影响。通过舱壁泳道等机制隔离失败单元(Failure Unit),一个单元的失败不至影响其它单元的正常工作。

15. 自动化

设计和构建自动化的过程。如果机器可以做,就不要依赖于人。自动化是DevOps的基础。

  1. 这15条架构原则基本上是eBay在发展,经历过流量数量级增长冲击过程中,通过不断踩坑踩出来的,是干货中的干货。消化吸收这15条原则,基本可保系统架构不会有原则性问题。
  2. 这15条原则同样适用于现在的微服务架构。eBay发展较早,它内部其实很早(差不多2010年前)就已形成完善的微服务生态,只是没有提出微服务这个概念。
  3. 这15条原则可根据TTM(Time To Market),可用性/可扩展性/质量,成本/效率分布在三个环内,如下图所示:

Heroku[附录3]是国外知名的云应用平台。基于上百万应用的托管和运营经验,创始人Adam Wiggins提出了12要素应用宣言[附录4]。简单讲,满足这12个要素的应用是比较容易云化并居住在Heroku平台上的。

1. 基准代码

一份基准代码,多份部署。如果用镜像部署方式,则一个镜像可以部署到多个环境(测试,预发,生产),而不是给每个环境制作一个不同镜像。

2. 依赖

显式声明依赖。如果用镜像部署,则一般依赖被直接打在镜像中,或者声明在docker file中。

3. 配置

在环境中存储配置。在Heroku或者类似的PaaS平台上,配置一般是推荐注入到环境变量中的。现在采用集中式配置中心也是一种流行方式。

4. 后端服务

把后端服务(例如缓存,数据库,MQ等)当作附加资源,相关配置和连接字符串通过环境变量注入,或者采用配置中心。

5. 构建、发布和运行

严格分离构建和运行。如果使用镜像部署,则构建、发布/运行是通过镜像这种中间格式严格分离的。

6. 进程

一个或者多个无状态的进程运行应用。容器运行时相当于进程,适用于无状态Web/API。

7. 端口绑定

通过端口绑定提供服务。容器也是通过端口绑定对外提供服务。

8. 并发

通过进程模型进行扩展。容器运行时相当于进程,通过起多个容器可以任意扩展并发数量。

9. 易处理

快速启动和优雅终止可最大化健壮性。docker容器支持秒级启动和关闭。

10. 开发环境和线上环境等价

尽可能保持开发、测试、预发和线上环境相同。容器可以保证容器内运行时环境的一致性,还需要保证不同环境的一致性,例如不同环境内的操作系统,负载均衡,服务发现,后台服务,监控告警等要尽可能一致。

11. 日志

把日志当作数据流。Heroku不支持本地文件,所以必须以流方式把日志输送到后台日志服务。除了日志以外还要补充考虑metrics流的采集和输送。

12. 管理进程

后台管理任务当作一次性的进程。其实相当于在Heroku上以独立进程方式运行任务Job。

  1. 12要素应用也是当前云原生应用(Cloud Native App)的参考标准,我把这12要素也称为云应用迁移原则。满足这12个要素的应用,可以比较顺利迁移到各种云平台(Kubernetes, Marathon, Cloud Foundry等)上。
  2. 对于面临企业遗留应用改造和云化迁移的架构师,可以重点参考这12条迁移原则。
  3. Docker容器技术可以认为是为云迁移量身定制的技术。容器化是后续云迁移的捷径,所以遗留应用改造可以先想办法做到容器化。

2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。

CAP认为:一个分布式系统最多同时满足一致性(Consistency),可用性(A【【微信】】)和分区容忍性(Partition Tolerance)这三项中的两项。

1. 一致性(Consistency)

一致性指“all nodes see the same data at the same time”࿰

大数据技术林子雨第七章练习题 大数据技术林子雨第七章课后答案

林子雨大数据技术第七章答案,林子雨大数据技术原理与应用ppt,大数据技术与应用林子雨pdf百度网盘下载,大数据技术林子雨pdf下载

发布时间 : 星期六 文章林子雨大数据技术原理与应用第八章课后题答案更新完毕开始阅读

时地作出决策。

15. 除了实时分析和实时交通,试再列举一个适 合采用流计算的应用场景,并

描述流计算可带来怎样的改变。

以淘宝网“双十一”“双十二”的促销活动为例,商家会在淘宝网上或者在店铺内投放相应的广告来吸引用户,同时,商家也可能会准备多个广告样式、文案,根据广告效果来做出调整,对对广告的点击情况、用户的访问情况进行分析,基于实时分析,推荐的结果得到有效提升。 16. 试述Storm框架如何改变开发人员开发实时应用的方式。

以往开发人员在开发一个实时应用的时候,除了要关注处理逻辑,还要为实时数据的获取、传输、存储大伤脑筋,但是,现在情况却大为不同。开发人员可以基于开源流处理框架Storm,快速地搭建一套健壮、 易用的实时流处理系统,并配合Hadoop等平台,就可以低成本地做出很多以前很难想象的实时产品。

17. 为什么说使用Storm流处理框架开发实时应用,其开发成本较低?

Storm 是开源免费的,用户可以轻易进行搭建、使用,大大降低了学习和使用成本。

18. 试述Twitter采用的分层数据处理框架。

实时系统和批处理系统组成的分层数据处理架构。 19. 试列举几个Storm框架的主要特点。

① 整合性。Storm 可方便地与队列系统和数据库系统进行整合。 ② 简易的API。Storm的API在使用上即简单又方便。

③ 可扩展性。Storm 的并行特性使其可以运行在分布式集群中。

④ 容错性。Storm 可以自动进行故障节点的重启,以及节点故障时任务的

重新分配。

⑤ 可靠的消息处理。Storm保证每个消息都能完整处理。

⑥ 支持各种编程语言。Storm 支持使用各种编程语言来定义任务。 ⑦ 快速部署。Storm 仅需要少量的安装和配置就可以快速进行部署和使用。 ⑧ 免费、开源。Storm 是- -款开源框架,可以免费使用。 20. 试列举几个Storm框架的应用领域。

实时分析、在线机器学习、持续计算、远程RPC等。

21. Storm 的主要术语包括Streams、Spouts、 Bolts 、Topology 和Stream

Groupings, 请分别简要描述这几个术语。

Streams:是一个无限的Tuple序列。 Spouts: Stream 的源头抽象。 Bolts: Streams 的状态转换过程。 Topology: Spouts 和Bolts组成的网络。

Stream Groupings: 用于告知Topology如何在两个组件间进行Tuple的传送。

22. 试述Tuple的概念。

Tuple即元组,是元素的有序列表。

23. 一个Topology由哪些组件组成?

Storm将Spouts和Bolts组成的网络抽象成Topology。 24. 不同的Bolt之间如何传输Tuple?

由StreamGroupings决定。

25. 试列举几种Stream Groupings的方式。

Shuffle Grouping: 随机分组,随机分发Tuple。

Fields Grouping: 按字段分组,有相同值的Tuple会被分发到对应的Bolt。

All Grouping: 广播分发,每个Tuple都会被分发到所有Bolt中。 Global Grouping: 全局分组,Tuple 只会分发给一个 Bolt。 Non Grouping: 不分组,与随机分组效果类似。

Direct Grouping: 直接分组,由Tuple的生产者来定义接收者。

26. 试述MapReduce Job和Storm Topology的区别和联系。

Storm运行在分布式集群中,其运行任务的方式与Hadoop 类似:在Hadoop 上运行的是MapReduce作业,而在Storm上运行的是“Topology\。 但两者的任务大不相同,其中主要的不同是一个MapReduce作业最终会完成计算并结束运行,而一个Topology将持续处理消息。

27. Storm集群中的Master节点和Worker节点各自运行什么后台进程?这些

进程又分别负责什么工作?

Storm集群采用“【【微信】】” 的节点方式,其中,Master 节点运行名“Nimbus”的后台程序(类似Hadoop中的“JobTracker\负责在集群范围内分发代码、为Worker分配任务和监测故障。

每个Worker节点运行名为“Supervisor”的后台程序,负责监听分配给它所在机器的工作,即根据Nimbus分配的任务来决定启动或停止Worker进程。

28. 试述Zookeeper在Storm框架中的作用。

Storm采用了Zookeeper 来作为分布式协调组件,负责Nimbus和多个Supervisor 之间的所有协调工作。

29. Nimbus 进程和Supervisor 进程都是快速失败( fail-fast)和无状态

( stateless)的,这样的设计有什么优点?

一旦重启,两个进程借助Zookeeper将状态信息存放在Zookeeper 中或本地磁盘中进行恢复并继续工作。使Storm很稳定。

30. Nimbus 进程或Supervisor进程意外终止后,重启时能否恢复到终止之前

的状态?为什么?

Nimbus 进程或Supervisor进程意外终止后,重启时可以恢复到终止之前的状态。

Master节点并没有直接和Worker节点通信,而是借助Zookeeper ,将状态信息存放在Zookeeper中或本地磁盘中,以便节点故障时进行快速恢复。这意味着若Nimbus进程或Supervisor进程终止后,一旦进程重启,它们将恢复到之前的状态并继续工作。这种设计使Storm极其稳定。 31. 试述Storm框架的工作流程。

客户端提交Topology到Storm集群中; .

Nimbus将分配给Supervisor的任务写入Zookeeper;

Supervisor从Zookeeper中获取所分配的任务,并启动Worker进程; Worker进程执行具体的任务。

32. 试述Storm框架实现单词统计的一般流程。

① 从Spout中发送Stream;

  • 1
  • 2
  • 3
  • 4
  • 5

..淘宝淘宝购物群微信,淘宝淘宝购物群微信,淘宝互助群最新2023消息,我就问你这个加入2023年 618淘宝理想生活狂欢季微信互帮互助群最新消息他不香吗。不要一直在找人助力的路上了,有助力需求群里直接一发,马上完成任务还不是美滋滋。关注加好友,快来入群吧,2023 淘宝618 狂欢节淘宝淘宝购物群微信。最后祝大家都游戏快乐。