/design

架构设计相关知识

Primary LanguageJavaApache License 2.0Apache-2.0

logo

license build

DESIGN

DESIGN 是个人对于软件系统架构的心得和总结。

不想做将军的士兵不是好士兵,同理,不想做架构师的程序员不是好程序员。系统架构设计能力更像是程序员的内功,需要厚积薄发。设计一个优良的系统架构,需要设计者具备深厚的技术功底,扎实的技术理论知识,以及对业务或产品深入的理解。

📖 内容

解决方案

解决方案(Solution),就是针对某些已经体现出的,或者可以预期的问题、不足、缺陷、需求等等,所提出的一个解决整体问题的可行性方案。就软件系统而言,解决方案就是一个可以解决具体业务问题,并且可以落地的软件系统。

解决方案,毫无疑问是顶层系统设计,这需要设计者既懂技术,也懂业务。

第一步:业务分析

把所有需要的东西聚集在一起,审视问题。不停的提问,以至于我们可以明确使用场景和约束。讨论假设。

  • What:系统的作用是什么?系统的目标是什么?
  • Who:系统的用户是谁?用户群体如何定位?
  • How:用户希望怎样使用系统?系统如何为用户提供服务?
  • How many:有多少用户?日活/月活有多少?——用户体量会极大的影响系统的性能要求,从而影响系统的规模和复杂度。
  • How much:系统的预算是多少(包括物料、人力成本等)?
  • 输入输出:系统的输入输出分别是什么?
  • 容量:系统需要处理多少数据?
  • 并发量、吞吐量:系统需要每秒钟处理多少请求?
  • 读写比率:系统的读写比率是多少?——读多写少或写多读少决定了不同的架构方案。

第二步:顶层设计

使用所有重要的组件来描绘出一个高层级的设计。

  • 画出主要的组件和连接
  • 证明你的想法

第三步:组件设计

对每一个核心组件进行详细深入的分析。

第四步:扩展设计

确认和处理瓶颈以及一些限制。举例来说就是你需要下面的这些来完成扩展性的议题吗?

  • 负载均衡
  • 水平扩展
  • 缓存
  • 数据库分片

实际业务方案

  • 设计一个秒杀系统

  • 设计一个权限系统

  • 设计一个微博

  • 设计一个聊天系统

  • 设计一个搜索引擎

  • 设计一个电商系统

  • 设计一个供应链系统

  • 设计一个低代码平台

如果把软件开发工作比作是一场战争,那么系统架构无疑是战略层面的工作。众所周知,万丈高楼平地起,系统架构就像是软件的地基,如果一开始就歪了,那么代码写得再漂亮,软件也难以成功。

软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。重点是分而治之,先将大型系统抽象为各个组件或模块;然后逐一解决各组件、各模块的功能、性能问题;最后将这些组件、模块整合成对外服务的一个整体。

  • 系统原理面试题
  • 基础理论
  • 核心技术
    • 负载均衡 - 关键词:轮询随机最少连接源地址哈希一致性哈希虚拟 hash 槽
    • 消息队列 - 关键词:重复消费消息丢失消息顺序性消息积压
    • 分布式存储 - 关键词:读写分离分库分表迁移扩容
    • 分布式缓存 - 关键词:进程内缓存分布式缓存缓存雪崩缓存穿透缓存击穿缓存更新缓存预热缓存降级
    • 分布式锁 - 关键词:数据库RedisZooKeeper互斥可重入死锁容错自旋尝试
    • 分布式 ID - 关键词:UUID自增序列雪花算法Leaf
    • 分布式事务 - 关键词:2PC3PCTCC本地消息表MQ 消息SAGA
    • 分布式会话 - 关键词:粘性 SessionSession 复制共享基于缓存的 session 共享
    • 流量控制 - 关键词:计数器法时间窗口法令牌桶法漏桶法

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

创建型模式

结构型模式

行为型模式

改善既有代码的设计

关键词:过长函数、过大的类、基本类型偏执、过长参数列、数据泥团、switch 声明、临时字段、被拒绝的馈赠、异曲同工的类、发散式变化、霰弹式修改、平行继承体系、过多的注释、重复代码、冗余类、纯稚的数据类、夸夸其谈未来性、依恋情结、狎昵关系、过度耦合的消息链、中间人、不完美的库类

统一建模语言(英语 - Unified Modeling Language,缩写 UML)是非专利的第三代建模和规约语言。UML 是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML 展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。

📚 资料

🚪 传送

◾ 🏠 DESIGN 首页 ◾ 🎯 我的博客

你可能会感兴趣: