掌握系统设计的精髓:12个核心设计模式的通俗解读

在构建复杂且高可用的软件系统时,仅仅了解编程语言和算法是不够的。真正的挑战在于如何设计出能够应对并发、故障、扩展等各种问题的健壮架构。系统设计模式正是前辈们在无数实践中提炼出的智慧结晶,它们是解决常见系统问题的“最佳实践”。在这里插入图片描述

本文将深入浅出地介绍12种关键的系统设计模式,通过简洁的解释和生动的现实世界类比,帮助你理解它们的核心思想和应用场景。

1. 熔断器模式 (Circuit Breaker)

  • 简单解释: 暂时停止对失败服务的调用,以避免级联故障。
  • 现实类比/用途: 就像家里的保险丝或断路器,一旦电流过载就自动断开电源,防止电器损坏。在Netflix的API处理中广泛使用。
  • 价值: 保护下游服务,防止单点故障扩散,提高系统的弹性。

2. 限流器 (Rate Limiter)

  • 简单解释: 控制用户或服务在特定时间内可以发出的请求数量,防止系统过载。
  • 现实类比/用途: 就像桥上的收费站,限制通过车辆的数量以避免交通堵塞。在API网关中非常常见,用于保护后端服务。
  • 价值: 保护系统资源,防止DDoS攻击,确保服务的稳定性。

3. 舱壁模式 (Bulkhead)

  • 简单解释: 将系统的不同部分(或微服务)隔离开来,使得一个部分的故障不会影响到其他部分。
  • 现实类比/用途: 就像轮船内部的防水隔舱,即使一个隔舱进水,其他隔舱也能保持不沉。在微服务隔离中常用。
  • 价值: 提高系统的隔离性和容错性,限制故障的范围。

4. 重试模式 (Retry Pattern)

  • 简单解释: 当操作失败时,以一定的延迟和/或限制次数重新尝试。
  • 现实类比/用途: 就像电话没打通时,过一会儿再拨一次。在HTTP客户端重试中广泛应用。
  • 价值: 应对瞬时故障和网络抖动,提高操作的成功率。

5. 超时模式 (Timeout Pattern)

  • 简单解释: 为等待响应的操作设置一个固定的时间限制。如果超出这个时间,操作就被认为是失败的。
  • 现实类比/用途: 就像打电话30秒没人接就挂断。在网络通信和资源访问中非常普遍。
  • 价值: 防止服务长时间挂起或被阻塞,释放资源,避免雪崩效应。

6. 旁路缓存 (Cache Aside)

  • 简单解释: 只有在请求数据时才将数据加载到缓存中,并在数据更新时同步更新缓存。
  • 现实类比/用途: 就像你饿了才去冰箱里找吃的,吃完再把最新的食物放进去。常用于Redis与数据库结合的场景。
  • 价值: 提高数据读取速度,减少数据库负载,但可能存在缓存穿透、击穿、雪崩问题。

7. 写直达缓存 (Write-Through Cache)

  • 简单解释: 写入数据时,同时将数据写入缓存和后端数据库,以确保两者保持同步。
  • 现实类比/用途: 就像你写日记的同时,把重要的笔记也同步抄写下来。
  • 价值: 保证缓存和数据库数据的一致性,写入操作原子性强,但写入延迟相对较高。

8. 发布-订阅模式 (Publish-Subscribe)

  • 简单解释: 消息发送者(发布者)向一个主题发送消息,消息接收者(订阅者)订阅感兴趣的主题,异步接收消息。
  • 现实类比/用途: 就像广播电台,广播内容,收听者调谐到对应频道就能接收到。在Kafka等消息队列中广泛使用。
  • 价值: 解耦发布者和订阅者,实现异步通信,提高系统的可扩展性和灵活性。

9. 事件溯源 (Event Sourcing)

  • 简单解释: 将系统所有的状态变化都存储为一系列不可变的事件序列,而不是只存储最终的状态。
  • 现实类比/用途: 就像保留每一次的财务交易记录,而不是只记录最终的账户余额。在金融系统中常用。
  • 价值: 提供完整的历史记录,方便审计和回溯,支持复杂业务逻辑的重构。

10. CQRS (Command Query Responsibility Segregation)

  • 简单解释: 将读取操作(查询)和写入操作(命令)分离到不同的模型或数据存储中,以优化性能。
  • 现实类比/用途: 就像超市里有专门的销售人员负责收银(写入),有专门的客服人员负责解答疑问(读取)。
  • 价值: 允许读写模型独立扩展和优化,提升读写密集型应用的性能和灵活性。

11. 绞杀者模式 (Strangler Fig)

  • 简单解释: 逐步替换一个老旧的遗留系统,而不是一次性进行全面的重写。通过在新旧系统之间部署一个“绞杀”代理,逐渐将流量切换到新功能。
  • 现实类比/用途: 就像一棵新的绞杀榕树藤蔓逐渐缠绕并取代老树。
  • 价值: 降低大型系统重构的风险,实现平滑过渡,避免“大爆炸”式重写。

12. Saga 模式 (Saga Pattern)

  • 简单解释: 管理分布式事务,通过将一个大事务分解为一系列本地事务,并使用补偿操作来处理任何失败。
  • 现实类比/用途: 就像预订机票、酒店和租车,如果其中任何一步失败,需要执行一系列补偿操作来取消之前的预订。在分布式预订系统中常用。
  • 价值: 解决微服务架构下的分布式事务一致性问题,避免两阶段提交的复杂性。

总结

这些系统设计模式是软件工程师解决复杂问题、构建高可用和可扩展系统的宝贵工具。它们不仅仅是理论知识,更是经过无数实践验证的有效方案。深入理解并灵活运用这些模式,将极大地提升你的系统设计能力,让你在软件开发的道路上走得更远。建议收藏此文,并在日常学习和工作中反复体会这些模式的精髓。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/bicheng/89321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

概率论与数理统计(二)

事件的概率 概率:可能性的大小 古典概率模型: 1)有限个样本点 2)等可能性 P(A)A中包含的基本事件数基本事件总和 P(A) \frac{A中包含的基本事件数}{基本事件总和} P(A)基本事件总和A中包含的基本事件数​ 频率与概率 nnn 次实验…

新型eSIM攻击技术可克隆用户资料并劫持手机身份

eSIM技术存在重大安全漏洞研究人员发现eSIM技术中存在一个关键漏洞,攻击者可利用该漏洞克隆移动用户资料并劫持手机身份。AG安全研究团队宣布,他们成功攻破了采用GSMA消费者证书的Kigen eUICC(嵌入式通用集成电路卡)安全防护&…

langchain教程2:更加高级和灵活的Prompt模板

文章目录 prompt模板 对话Prompt模板 函数大师 使用jinja2与f-string实现提示词模板格式化 组合式提示词模板 prompt模板 from langchain.prompts import PromptTemplateprompt = PromptTemplate.from_template("你是一个{name},帮我起一个具有{country}特色的{gender}名…

UE5使用Motion Warping有什么用?

在 UE5 中,Motion Warping 是一套用于「动态调整根运动动画」的系统插件,它能让带有根运动(Root Motion)的动画根据游戏运行时的环境自动变形(Warp),以更精准地贴合目标位置或目标方向&#xff…

类模版的相关案例

案例实现:实现一个通用的数组类,要求如下:可以对内置数据类型以及自定义数据类型的数据进行存储将数组中的数据存储到堆区构造函数中可以传入数组的容量提供对应的拷贝构造函数以及operator防止浅拷贝问题提供尾插法和尾删法对数组中的数据进…

服务器端安全检测与防御技术概述

一、服务器安全风险1.不必要的访问(如只提供HTTP服务)--应用识别控制2.公网发起IP或端口扫描、DDOS攻击等--防火墙3.漏洞攻击(针对服务器操作系统等)--IPS4.根据软件版本的已知漏洞进行攻击,口令暴力破解、获取用户权限…

前端性能与可靠性工程系列: 渲染、缓存与关键路径优化

前端性能与可靠性工程系列: 渲染、缓存与关键路径优化 第一部分:揭秘浏览器 - 关键渲染路径 (CRP) 关键渲染路径 (Critical Rendering Path - CRP) 是指浏览器从接收到最初的 HTML、CSS 和 JavaScript 字节,到最终将它们渲染成可见像素所必须经过的一系列步骤。我们的目标,…

基于CentOS的分布式GitLab+Jenkins+Docker架构:企业级CI/CD流水线实战全记录

引言:从单机到分布式容器架构的演进在传统Web应用部署中,我们常常面临环境不一致、部署效率低下等问题。我曾经维护过一个需要手动在5台服务器上重复部署的游戏项目,每次发布都如同走钢丝。本文将详细分享如何基于CentOS系统,构建…

JVM——为什么Java8移除了永久代(PermGen)并引入了元空间(Metaspace)?

Java8移除永久代并引入元空间,主要是为了解决 PermGen 固定大小、容易导致内存溢出、GC 效率低的问题。元空间使用本地内存,具备更灵活的内存分配能力,提升了垃圾收集和内存管理的效率。 PermGen 的局限性 ①固定大小:永久代的内存空间大小在…

3.正则化——新闻分类

影响结果出了最终的目标,还会有许多细节因素 在机器学习中,往往会面临很多过拟合和欠拟合的问题。 欠拟合是训练不到位,过拟合是训练过头,会导致泛化性差正则化是在损失函数中添加一个惩罚项,以简化模型对于惩罚项Pena…

HTML的重要知识

什么是HTMLHTML是Hyper Text Markup Language的缩写,意思是超文本标记语言。标签标题标签:————-h1,h2,h3.....段落标签 :————p换行标签: ————br列表标签:有序列表:——ol无序列表:—…

【C语言网络编程】HTTP 客户端请求(发送请求报文过程)

在 C 语言中,我们可以使用 socket 编程来手动实现一个简单的 HTTP 客户端,像浏览器一样请求网页数据。本文将结合实际代码,重点讲解如何通过 C 语言构造并发送一个 HTTP 请求报文,实现与服务器的基本通信。 文章目标 通过一个简单…

oracle2kingbase的字段长度问题

实验一: oracle中: create table testlen(c1 varchar2(2)); insert into testlen values(山); --成功 insert into testlen values(山西); --失败 ORA-12899: 列 "TESTK"."TESTLEN"."C1" 的值太大 (实际值: 4, 最大值: 2…

单链表的题目,咕咕咕

1.咕 203. 移除链表元素 - 力扣(LeetCode) 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 struct ListNode* removeElements(struct ListNode* head, int val) …

关于程序=数据结构+算法这句话最近的一些思考

最近看了很多单片机STM32的的相关程序,尤其是设计到ringbuff、buffer_manage、os_memory预计mem_manage等程序中间层的用法,我对这句话有了一些更深的思考,现在记录下来,希望对处于相同阶段的程序一些思想启迪。首先“数据结构”也…

Rust 错误处理

Rust 错误处理 引言 Rust 是一种系统编程语言,以其安全、并发和性能著称。在 Rust 中,错误处理是一个核心概念,它确保了程序在遇到异常情况时能够优雅地处理。本文将深入探讨 Rust 中的错误处理机制,包括错误类型、错误传播、错误…

17. 什么是 webSocket ?

总结 WebSocket 是 HTML5 引入的一种新协议,允许客户端和服务器之间进行双向实时通信。建立在 TCP 协议之上,默认端口是 80(ws) 和 443(wss),没有同源限制,客户端可以与任意服务器通…

从零开始跑通3DGS教程:(五)3DGS训练

写在前面 本文内容 所属《从零开始跑通3DGS教程》系列文章; 本文介绍在docker中训练3dgs的方法 平台/环境 linux, nvidia GPU, docker 转载请注明出处: https://blog.csdn.net/qq_41102371/article/details/146535874 目录 写在前面系列文章准备docker创建环境参考完系列文章…

日记_7.14_实际开发的进步

1、快速定位后端2、会定位前端啦啦啦!3、前端没有意义的块叫div和span。而不是script4、所有 JavaScript 标识符均 区分大小写5、JS中$和_下划线和doller符均被视为字母。6、var、let区别:1 var全局。let局部。2 var可以重新声明格式,let之恩…

AI Agent 开发

Agent开发常用框架: LangChainLlamaIndexVercel AI SDK LangChain:一站式 LLM 应用开发框架一句话总结 LangChain 把「模型调用 外部数据 工具 记忆 流程编排」全部标准化,让你像搭积木一样快速组合出聊天机器人、RAG、Agent 等大模型应用…