架构师必须掌握的架构设计原则

这篇具有很好参考价值的文章主要介绍了架构师必须掌握的架构设计原则。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

架构师必须掌握的架构设计原则

软件设计原则

GRASP 通用职责分配软件模式

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

  1. 信息专家 (Information Expert)

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

  1. 创建者 (Creator)

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

  • B“包含”或者聚合 A

  • B 记录 A 的实例

  • B 密切地使用 A

  • B 拥有 A 的初始化数据

  1. 低耦合 (Low Coupling)

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

  1. 高内聚 (High Cohesion)

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

  1. 控制器 (Controller)

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

  1. 多态 (Polymorphism)

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

  1. 纯虚构 (Pure Fabrication)

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

  1. 间接 (Indirection)

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

  1. 受保护的变化 (Protected Variation)

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

SOLID 面向对象设计原则

S.O.L.I.D 是面向对象设计和编程 (OOD&OOP) 中几个重要原则的首字母缩写,受 Robert Martin 推崇。

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

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

架构师必须掌握的架构设计原则
  1. 开放封闭原则 (The Open Closed Principle)

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

架构师必须掌握的架构设计原则
  1. 里氏替代原则 (The Liskov Substitution Principle)

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

架构师必须掌握的架构设计原则
  1. 依赖倒置原则 (The Dependency Inversion Principle)

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

架构师必须掌握的架构设计原则
  1. 接口分离原则 (The Interface Segregation Principle)

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

架构师必须掌握的架构设计原则

 

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

AKF 架构原则

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

  1. N + 1 设计

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

  1. 回滚设计

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

  1. 禁用设计

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

  1. 监控设计

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

  1. 设计多活数据中心

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

  1. 使用成熟的技术

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

  1. 异步设计

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

  1. 无状态系统

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

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

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

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

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

  1. 非核心则购买

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

  1. 使用商品化硬件

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

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

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

  1. 隔离故障

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

  1. 自动化

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

这 15 条架构原则基本上是 eBay 在发展,经历过流量数量级增长冲击过程中,通过不断踩坑踩出来的,是干货中的干货。消化吸收这 15 条原则,基本可保系统架构不会有原则性问题。

这 15 条原则同样适用于现在的微服务架构。eBay 发展较早,它内部其实很早 (差不多 2010 年前) 就已形成完善的微服务生态,只是没有提出微服务这个概念。

这 15 条原则可根据 TTM(Time To Market),可用性 可扩展性 质量,成本 效率分布在三个环内,如下图所示。

架构师必须掌握的架构设计原则

 

CAP 定理

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

CAP 理论强调,在分布式系统中,最多只能同时满足一致性 (Consistency)、可用性 (Availability) 和分区容忍性 (Partition Tolerance) 中的两项。其中:

  • 一致性指所有节点在同一时间点看到的数据完全一致

  • 可用性则指 reads 和 writes 操作始终成功和响应时间正常

  • 分区容忍性则指分布式系统能够在遭遇到某节点或网络分区故障时,仍然能够对外提供满足一致

架构师必须掌握的架构设计原则

BASE 理论

eBay 架构师 Dan Pritchett 凭借其丰富的实践经验,在 ACM 上发表了一篇文章,并提出了 BASE 理论,作为对 CAP 理论的一种延伸。其核心思想是:尽管无法做到强一致性(即 CAP 理论中的一致性概念),但是通过采用适当的方式可以实现最终一致性。BASE 代表基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eventual Consistency)。

1.基本可用 (Basically Available)

基本可用是指分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。比如服务降级。

2.软状态 (Soft State)

软状态是指允许系统存在中间状态,而该中间状态不会影响系统的整体可用性。分布式存储中一般一份数据至少存三个副本,允许不同节点间副本同步的延迟就是软状态的体现。

3.最终一致性 (Eventual Consistency)

最终一致性是指系统中的所有数据副本经过一段时间后,最终能够达成一致状态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

架构师必须掌握的架构设计原则

CAP 和 BASE 理论课题极深,背后甚至涉及到很复杂的数学证明。但我从简单浅显的角度来理解:在分布式系统中,性能、高可用、不丢数据和数据一致性通常是强需求。由于流量不断增长,数据复制和分区成为了不可避免的挑战:
复制(replication):数据在多个节点上存储多份,以确保数据不丢失且系统保持高可用;
分区(partition):数据按照某种规则切分分发到不同节点上,以降低单个节点的负载并提高系统性能,例如数据库的分库分表、系统拆分成微服务等,这种做法也会带来一些一致性问题。为了解决一致性问题,我们可以在时间上做出一定的妥协,即实现最终一致性。如果要求时间上的强一致性,就必须适当地牺牲可用性。因此,在系统架构设计上,与状态一致性的斗争是其中一个重要组成部分。
当选择使用分布式产品时,比如 NoSQL 数据库,必须了解它在 CAP 环章除的位置,以确保它可以满足特定场景的需求。

组织和系统改进原则

康威法则

Melvin Conway 在 1967 年提出所谓康威法则,指出组织架构和系统架构之间有一种隐含的映射关系:

Organization which design system […] are constrained to produce designs which are copies of the communication structures of these organization. 设计系统的组织其产生的设计等价于组织间的沟通结构。

架构师必须掌握的架构设计原则

康威法则也可以倒过来阐述:

Conway’s law reversed:You won’t be able to successfully establish an efficient organization structure that is not supported by your system design(architecture)。如果系统架构不支持,你无法建立一个高效的组织;同样,如果你的组织架构不支持,你也无法建立一个高效的系统架构。

架构师必须掌握的架构设计原则

系统改进三原则

IT 运维管理畅销书《凤凰项目》 的作者 Gene Kim 在调研了众多高效能 IT 组织后总结出支撑 DevOps 运作的三个原理 (The Three Ways: The Principles Underpinning DevOps),我认为也是系统改进提升的一般性原理,见下图:

架构师必须掌握的架构设计原则

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

对于以开发为导向的组织而言,他们的能力已不仅仅只是生产软件,更重要的是持续地向客户传递价值。该价值从业务需求开始,依次经过研发、测试、部署、运维等流程,并最终以服务形式交付给客户。整个价值链的流速并不只依赖于单个团队或个人的杰出贡献,而是由整个价值链中最薄弱环节的限制而决定。所以,局部优化通常并不管用,反而还可能会损害整体效率。Gene Kim还特别强调:"瓶颈之外的所有优化只是幻象"。

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

通过加强反馈机制实现流程改进是非常常见的方法。原则二着重于加强企业与客户、组织团队、流程和系统内部的反馈环路。如果没有测量,则无法实现提升,只有通过测量数据反馈来优化和改进系统。

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

新企业管理文化鼓励进行勇于尝试和不断实验、学习、改进的文化氛围。

总结

尽管上述原则对架构师而言具有深远的指导意义,但在实际工作中,根据业务、时间、资源和团队情况灵活应用它们才能收到更好的效果。这些原则并非僵化的规则,有时候甚至会被违反,不过要注意,这样的做法通常都有相应的成本,架构师需要在意并及时变通以弥补成本带来的损失。

 

作者|易安文章来源地址https://www.toymoban.com/news/detail-710404.html

到了这里,关于架构师必须掌握的架构设计原则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LLM 优先的软件架构:源自 ArchGuard Co-mate 的四个基本设计原则

    在优化 ArchGuard 的 AI 辅助架构治理工具 Co-mate 的架构时,发现有一些模式与之前设计 AutoDev、ClickPrompt 等颇为相似。便思考着适合于 ArchGuard Co-mate 的架构设计原则是什么,写下了初步的三条原则。 而正好要在公司内分享 LLM + 架构,便又整理了适合于更通用的四个架构设计原

    2024年02月09日
    浏览(38)
  • 架构篇09:架构设计原则案例

    我们先复习一下架构设计的三条核心原则: 合适原则 、 简单原则 和 演化原则 。 我们在架构设计实践中,应该时刻谨记这三条设计原则,指导我们设计出合适的架构,即使是代表中国互联网技术最顶尖水平的 BAT,其架构的发展历程也同样遵循这三条原则。 今天就以大家耳

    2024年01月23日
    浏览(45)
  • Kubernetes 架构原则和对象设计

    云计算平台的分类¶ 以Openstack为典型的虚拟化平台 虚拟机构建和业务代码部署分离。 可变的基础架构使后续维护风险变大。 以谷歌borg为典型的基于进程的作业调度平台 技术的迭代引发borg的换代需求。 早期的隔离依靠chrootjail实现,一些不合理的设计需要在新产品中改进。

    2024年02月06日
    浏览(46)
  • 软件设计模式原则(二)开闭原则

    继续讲解第二个重要的设计模式原则——开闭原则~ 一.定义         开闭原则,在面向对象编程领域中,规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为

    2024年02月06日
    浏览(50)
  • 云原生架构设计原则及典型技术

    云原生是面向云应用设计的一种思想理念,充分发挥云效能的最佳实践路径,帮助企业构建弹性可靠、松耦合、易管理可观测的应用系统,提升交付效率,降低运维复杂度。代表技术包括不可变基础设施、服务网格、声明式 API 及 Serverless 等。 从产业效用方面来看,云原生极

    2024年02月11日
    浏览(53)
  • 软件设计原则与设计模式

    设计中各各原则同时兼有或冲突,不存在包含所有原则的设计 一:单一职责原则又称单一功能原则 核心:解耦和增强内聚性(高内聚,低耦合) 描述:类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联。 二:开闭

    2024年02月10日
    浏览(39)
  • 大数据智能决策系统架构设计原则概述

    作者:禅与计算机程序设计艺术 随着大数据的日益增长、高速发展及其广泛应用,在构建大数据智能决策系统中也面临着诸多挑战。作为一名具有强烈的学习兴趣、极强的逻辑思维能力、丰富的工程实践经验的创新型专家,本文将从架构设计的角度出发,全面回顾一下大数据

    2024年02月07日
    浏览(37)
  • 【虹科干货】设计微服务架构的原则

    微服务是一种软件架构策略,有利于改善整体性能和可扩展性。你可能会想,我的团队需不需要采用微服务,设计微服务架构有哪些原则?本文会给你一些灵感。 文章速览: 微服务设计 通过领域驱动设计实施微服务 选择技术栈 微服务设计架构的 5 个原则   微服务是一种软

    2024年02月05日
    浏览(43)
  • 软件的设计原则

    任何傻瓜都可以写出计算机能懂的代码,但好的程序员可以写出人类能懂的代码—–Martin Fowler 如果你是新手,你可能会问,为什么代码需要设计原则? 我想说的是肯定不是为了故作高深,存在即是合理。 如果写了一个简单的程序,你可能不需要设计原则。 如果你写了一个

    2024年02月12日
    浏览(42)
  • 软件设计原则

    软件设计原则 1小时系列 (C++版)-CSDN博客 设计模式——六大设计原则_接口设计6大原则-CSDN博客 摘抄:  公共接口下,添加不同的实现。  橙色为接口,将繁杂的接口拆成多个接口   未完待续......

    2024年01月17日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包