计算机系统设计中的一些常用方法
面试中经常被问到:
-
有一个亿qq号,找出重复的
-
给你512m内存,找出5g文件中最大的数字
-
订单超时实现精准关单
…
当然,还有经常遇到的问题:
-
接口业务逻辑复杂或查数据库慢,相应耗时高
-
网络因为丢包导致服务请求异常
-
分布式事务的空回滚、挂起
…
这些问题看似诡异且难解,但都可以通过一些基本且常用的方法解决,你会发现这些方法无论是几十年前的第一代计算机,还是现在火热的AI都在使用,贯穿在业务应用系统到计算机CPU、内存硬件设计的每个阶段和细节(无论是软件还是硬件都包含这些)。
这些基本的思想不会因为时代而淘汰,更不会被元宇宙、大模型而取代。
下面我列出这些常用的设计思路(解题思路),你可以用于面试或者放在平时工作中。这些思想基本都是围绕着:性能、可靠性、可扩展性、用户体验、可观测性产生的。
-
分而治之:大数据量拆分成多个小数据处理(大问题拆小问题逐一解决),常见的实现:分布式数据库把上亿的数据分散到不同机器节点上进行计算。分而治之之后就是结果的聚合,这进一步引入了复杂度,如果有一台无限多大算力和存储的计算机,恐怕不拆分实现起来更简单。
-
缓存与时空权衡:利用空间换时间,常见的实现:CPU L1 L2缓存、guava缓存、cdn缓存、redis缓存等。而当空间占用达到一定阈值时,耗时就可以适当舍弃,因为投入产出比并不高,为了提高1ms的耗时,占用几百GB的内存空间是不可能的,所以缓存满了会通过LRU算法淘汰或写入磁盘。
-
算法与数据结构:程序=算法+数据结构,加快数据查询或计算速度的方法就是选用合适的算法和数据结构,常见的实现:InnoDB的b+树索引、TiDB的LSM树索引、ES的倒排索引、epoll的红黑树。算法和数据结构不只包括教科书上说的排序、查找,同样我们日常编写代码产生的设计模式、良好的编码过程都是算法与数据结构的组合。我们需要了解常用的算法与数据结构的原理,从而优化系统性能。需要注意的是,传统教科书会把算法与数据结构分开讲解,但没有数据结构,谈算法毫无意义。
-
冗余:冗余带来可靠性,航天系统中使用备份的冗余单元确保火箭和太空站的正常运作,动物中成对出现的器官,DNA中大量的冗余信息都保证了生物体的可靠生存。计算机中常见的实现:数据库主从复制,主挂了从被选为主继续对外提供服务、业务对等集群部署。冗余也可提高性能,分布式环境下(包括集群环境下)经常使用从节点处理读请求,数据库设计中表冗余字段,可以避免跨表查询产生的IO提高性能。冗余的代价就是付出更多的资源,这是实打实的RMB。
-
职责分离:最常见的就是数据库的主从,主复制写入数据,从同步主的数据后提供读的服务。在领域驱动设计中,职责分离也是一种常用的设计手段,对用户行为产生的事件拆分出不同指责的命令,如:读命令和写命令,再配合数据库的主从复制结构实现整体的职责分离。在部署结构中,一个工程中不同的接口重要程度以及应对的流量不同,可以分核心与非核心进行部署,为核心业务提供更强大的算力。职责分离并不适合于单体或者简单的业务逻辑中,职责分离适用于复杂的系统,降低系统复杂性,应用于简单的业务系统中,会让系统变得复杂。
-
重试:重试在网络请求中最常出现,应用代码中调用别人的接口,对方超时会进行重试,TCP协议上也存在超时重传机制,内存通过ECC纠错和重传避免地球磁场产生的bit位反转。通常对于网络请求重试是有讲究的,这包括了几个策略:异常后立刻重试、重试N次后停止、等待N秒后重试X次,这些策略存在的价值在于,被调用方若因为故障导致的超时或失败,进行重试无疑会加大被调用方的压力,所以调用方实现重试时必须想清楚采用何种策略。同时,出现重试也意味着系统存在问题,如果不解决可能激发更大的问题,重试也会导致用户体验下降。
-
failback failover failfast:这三个单词含义分别是:
a.failback:失效自动恢复,在主节点恢复后,将服务从备用节点切换回原主节点的过程,强调“恢复原主”。常见的实现:一部分数据库在主节点恢复后再且回去。
b.failover:失效转移,当主组件发生故障时,自动将服务切换到备用系统,确保业务连续性。其核心是“主备切换”,常见于高可用架构中。常见的实现:ES的主副本故障切换到从副本。
c.failfast:快速失败,在检测到潜在错误时立即终止操作并抛出异常错误扩散,核心是“快速暴露问题”。常见的实现:ArrayList的并发修改、接口参数检查。
-
并行:现代计算机系统(包括应用层的业务系统)是通过不同阶段构建并行计算组合而成的。在微观的CPU指令执行上通过流水线并行执行微指令,在宏观的代码上通过多线程利用多逻辑核进行加速计算,再大一点会通过分布式集群实现并行计算。虽说并行提高的算力,但在这么高度的并行流程中,就会存在各种各样的问题,主要包括:执行的依赖关系与顺序、共享数据的并行写安全、为解决共享数据并行写安全问题引入的互斥竞争、并行部分成功和部分失败的问题。这几个本质上都是数据安全问题。解决这些问题会适当牺牲并行的能力降级为串行,也可能让并行计算的结果失效。所以在算力性能和数据安全问题之间要进行取舍。
-
共享与不可变模式:上面说到并行存在数据安全问题,产生问题的原因根本是数据存在共享。共享的好处在于节省存储空间,如果不想通过加锁把并行改成串行,那么可以使用不可变模式。实现不可变模式包括:
a.final:让数据不可变更,最常见的是java.lang.String,如果需要变更创建新的对象。
b.COW(copy on write):写时复制,只有在数据写入时候拷贝出一个副本,基于副本修改数据。常见的实现:Linux操作系统的fork创建子进程。
不可变模式的两种方法都需要更多的空间,但避免了锁的竞争。
-
分层:分层是计算机系统设计时最常见的手段,通过合理的分层隔离各个层级之间的差异,屏蔽内部实现细节,提升系统的可扩展性,常见的分层如:TCP网络四层、MVC分层等。Any problem in computer science can be solved by anther layer of indirection,即:算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。这句经典的理论已不知出自何处,但无数的先例都是基于此,调节CPU和硬盘之间的性能差是通过加了一个内存实现的,调节CPU和内存之间的性能差是通过加了L1 L2 L3缓存实现的,用户到服务器之间可以通过反向代理、cdn做很多事情。分层与职责分离一样,在复杂系统设计上是必要的。
-
分解与复用:分层的概念本质是在系统架构中体现的,这是宏观上的设计思想。而在细节之处,我们通过各种设计模式、抽象与封装,分割出原子的模块、服务、方法,可以说通过分解把复杂的系统大卸八块,分解出来的结果就是可以实现复用。最简单的例子:抽出鉴权模块,购买商品下单、访问个人中心等页面都不需要关心鉴权的业务逻辑,直接依赖鉴权模块即可。
-
反馈:系统应该有一个完善的自反馈机制,确保自身的可靠,比如系统感知到失败后自动降级,人工降级等。同时提供了友好的监控能够让我们发现潜在的问题,这一点Linux做的非常好,内核提供了大量的可观测机制,如:ebpf、tracepoint、ftrace、kprobes、syslog、kdb等。作为应用系统,我们可以通过上报功能模块的用户点击和曝光事件、接口的请求量、响应耗时等指标到ELK中进行分析。一些互联网大厂应对突发流量也是通过结合监控系统与k8s实现自动扩缩容。
希望你能基于上面谈到的12个设计方法,在面试或工作中多加思考,设计就是在不断的取舍,即使是有上面的方法做铺垫,也无法做到完美的设计方案。“取舍”俩字不应只有架构师懂得,产品经理、码农都需要有这样的思想,才能合作完成一个不完美但可不断完善的产品,为用户提供更好的体验,为企业带来更多的价值。
相关文章:
计算机系统设计中的一些常用方法
面试中经常被问到: 有一个亿qq号,找出重复的 给你512m内存,找出5g文件中最大的数字 订单超时实现精准关单 … 当然,还有经常遇到的问题: 接口业务逻辑复杂或查数据库慢,相应耗时高 网络因为丢包导致服…...
【征程 6】工具链 VP 示例中 Cmakelists 解读
1. 引言 在文章【征程 6】VP 简介与单算子实操中,介绍了 VP 是什么,并以单算子 rotate 为例,介绍了 VP API 使用方法。在【征程 6】工具链 VP 示例中日志打印解读 中介绍了 VP 单算子示例中用到的日志打印的头文件应该怎么写。接下来和大家一…...
深入解析 Jenkins Agent 的 .jnlp 启动文件
🧩 深入解析 Jenkins Agent 的 .jnlp 启动文件 在 Jenkins 中,通过 JNLP(Java Network Launch Protocol)方式连接 Agent 是一种常见且灵活的方式。你可能曾见过类似这样的命令: java -jar agent.jar -jnlpUrl file:/…...
谷歌开源代理开发工具包(Agent Development Kit,ADK):让多智能体应用的构建变得更简
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
0x01、Redis 主从复制的实现原理是什么?
Redis 主从复制概述 Redis 的主从复制是一种机制,允许一个主节点(主实例)将数据复制到一个或多个从节点(从实例)。通过这一机制,从节点可以获取主节点的数据并与之保持同步。 复制流程 开始同步…...
noscript 标签是干什么的
vue public目录下的 index.html 会有 <noscript> 标签不知道是干吗的。 其实 noscript 标签在不支持或是禁用JavaScript 的浏览器中显示替代的内容。这个元素可以包含任何 HTML 元素。这个标签的用法也非常简单: <noscript><strong>Were sorry …...
[创业之路-366]:投资尽职调查 - 尽调核心逻辑与核心影响因素:价值、估值、退出、风险、策略
目录 一、VC投资的本质是冒着不确定性风险进行买卖、生意,为了赚取高额回报 1、VC投资的核心本质 2、VC投资的运作机制 3、VC投资的风险与挑战 4、VC投资的底层逻辑 5、总结:VC投资的本质再定义 二、尽调核心逻辑 1、尽调的含义 2、尽调的逻辑方…...
MOP数据库中的EXPLAIN用法
EXPLAIN 是 SQL 中的一个非常有用的工具,主要用于分析查询语句的执行计划。执行计划能展示数据库在执行查询时的具体操作步骤,像表的读取顺序、使用的索引情况、数据的访问方式等,这有助于我们对查询性能进行优化。 语法 不同的数据库系统&…...
Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 本地优先且可扩展 。
一、软件介绍 文末提供源码下载学习 Hyprnote开源程序是一款记录和转录您会议的 AI 记事本。 从您的原始会议记录中生成强大的摘要,本地优先且可扩展 。使用开源模型 (Whisper & Llama) 离线工作,高度可扩展 ,由插…...
MSCKF及可观性总结
可观性 参考链接 真实VIO系统不能观的维度是4(位置和yaw角),由于EKF的转移和观测Jacobian矩阵的线性化点不同、不可观方向噪声的存在,实际MSCKF不能观的维度变成了3,绕重力轴的旋转(yaw角)被错…...
上篇:新能源轻卡城配物流经济/动力模式量化定义(理论篇)——数学暴力破解工程困局
副标题:用微分方程撕开模式切换本质,用传感器数据重构载重真相 引言:为什么轻卡模式定义比乘用车难10倍? 行业现状痛点: 中国新能源轻卡日均载重波动高达300%(空载0kg→满载4.5吨)某头部车企实…...
Ubuntu22环境下,Docker部署阿里FunASR的gpu版本
番外: 随着deepseek的爆火,人工智能相关的开发变得异常火爆,相关的大模型开发很常见的agent智能体需要ASR语音识别的功能,阿里开源的FunASR几乎是把一个商业的项目放给我们使用了。那么我们项目中的生产环境怎么部署gpu版本的语音识别服务呢?经过跟deepseek的一上午的极限…...
Python 实现最小插件框架
文章目录 Python 实现最小插件框架1. 基础实现项目结构plugin_base.py - 插件基类plugins/hello.py - 示例插件1plugins/goodbye.py - 示例插件2main.py - 主程序 2. 更高级的特性扩展2.1 插件配置支持2.2 插件依赖管理2.3 插件热加载 3. 使用 setuptools 的入口点发现插件3.1 …...
内网邮箱服务器搭建-详解
目录 一、背景 二、搭建邮箱需要具备的基础知识 1、smtp(Simple Mail Transfer Protocol) SMTP工作原理 SMTP 命令 SMTP 协议端口 2、pop3(Post Office Protocol) POP3特点 POP3工作原理 3、imap4(Internet M…...
21 天 Python 计划:使用SQLAlchemy 中的ORM查询
文章目录 准备工作图书表 books分类表 categoriesORM 对象定义 一、根据主键获取记录二、AND 查询三、 常用方法四、OR 查询五、 5. AND 和 OR 并存的查询六、巧用列表或者字典的解包给查询方法传参七、其它常用运算符八、查询指定列九、内连接、外连接9.1 内连接9.2 外连接9.3…...
使用 LLaMA-Factory 微调 llama3 模型(二)
使用 LLaMA-Factory 微调 llama3 模型 1. LLaMA-Factory模型介绍 https://github.com/hiyouga/LLaMA-FactoryLLaMA-Factory 是一个用于大型语言模型(LLM)微调的工具,它旨在简化大型语言模型的微调过程, 使得用户可以快速地对模型…...
并发编程--条件量与死锁及其解决方案
并发编程–条件量与死锁及其解决方案 文章目录 并发编程--条件量与死锁及其解决方案1.条件量1.1条件量基本概念1.2条件量的使用 2. 死锁 1.条件量 1.1条件量基本概念 在许多场合中,程序的执行通常需要满足一定的条件,条件不成熟的时候,任务…...
JAVA SE 自我总结
目录 1. 字面常量 2. 数据类型 3. 变量 4. 类型转换 5. 实参和形参的关系 6. 数组 6.1 数组的概念 6.2 动态初始化 6.3 静态初始化 7. 数据区 编辑 8. 数组的拷贝 8.1 赋值拷贝 8.2 方法拷贝 9. 代码块 10. 内部类 10.1 实例内部类 10.2 静态内部类 10.3 …...
RAG创建向量数据库:docsearch = FAISS.from_texts(documents, embeddings)
RAG创建向量数据库:docsearch = FAISS.from_texts(documents, embeddings) 代码解释 docsearch = FAISS.from_texts(documents, embeddings) 这行代码主要作用是基于给定的文本集合创建一个向量数据库(这里使用 FAISS 作为向量数据库工具 )。具体说明如下: FAISS :FAISS …...
虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?
虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解? code review! 文章目录 虚幻引擎5-Unreal Engine笔记之“将MyStudent变量设置为一个BP_Student的实例”这句话如何理解?理解这句话的关键点1.类(…...
鸢尾花分类的6种机器学习方法综合分析与实现
鸢尾花分类的6种机器学习方法综合分析与实现 首先我们来看一下对应的实验结果。 数据准备与环境配置 在开始机器学习项目前,首先需要准备编程环境和加载数据。以下代码导入必要的库并加载鸢尾花数据集: import numpy as np import pandas as pd impo…...
vite,Vue3,ts项目关于axios配置
一、安装依赖包 npm install axios -S npm install qs -S npm install js-cookie 文件目录 二、配置线上、本地环境 与src文件同级,分别创建本地环境文件 .env.development 和线上环境文件 .env.production # 本地环境 ENV = development # 本地环境接口地址 VITE_API_URL =…...
mysql:重置表自增字段序号
情况一:清空表数据后重置自增 ID 如果你希望清空表中的所有数据,并将自增 ID 重置为初始值(通常为 1) 1、truncate truncate table tb_dict; 2、delete 配合 alter 语句 delete from tb_dict; alter table tb_dict AUTO_INCR…...
STM32 模块化开发指南 · 第 4 篇 用状态机管理 BLE 应用逻辑:分层解耦的实践方式
本文是《STM32 模块化开发实战指南》第 4 篇,聚焦于 BLE 模块中的状态管理问题。我们将介绍如何通过有限状态机(Finite State Machine, FSM)架构,实现 BLE 广播、扫描、连接等行为的解耦与可控,并配合事件队列驱动完成主从共存、低功耗友好、状态清晰的 BLE 应用。 一、为…...
HTML — 浮动
浮动 HTML浮动(Float)是一种CSS布局技术,通过float: left或float: right使元素脱离常规文档流并向左/右对齐,常用于图文混排或横向排列内容。浮动元素会紧贴父容器或相邻浮动元素的边缘,但脱离文档流后可能导致父容器高…...
IP节点详解及国内IP节点获取指南
获取国内IP节点通常涉及网络技术或数据资源的使用,IP地址作为网络设备的唯一标识,对于网络连接和通信至关重要。详细介绍几种修改网络IP地址的常用方法,无论是对于家庭用户还是企业用户,希望能找到适合自己的解决方案。以下是方法…...
AD9253 LVDS 高速ADC驱动开发
1、查阅AD9253器件手册 2、查阅Xilinx xapp524手册 3、该款ADC工作在125Msps下,14bit - 2Lane - 1frame 模式。 对应:data clock时钟为500M DDR mode。data line rate:1Gbps。frame clock:1/4 data clock 具体内容:…...
pycharm2024.3.5版本配置conda踩坑
配置解释器是conda时,死活选不到自己的环境 看了很多,都是说要选scripts下的conda.exe 都没用 主要坑在于这是新版的pycharm 是配置condabin 下的 conda.bat 参考:PyCharm配置PyTorch环境(完美解决找不到Conda可执行文件python.exe问题) …...
【异常处理】Clion IDE中cmake时头文件找不到 头文件飘红
如图所示是我的clion项目目录 我自定义的data_structure.h和func_declaration.h在unit_test.c中无法检索到 cmakelists.txt配置文件如下所示: cmake_minimum_required(VERSION 3.30) project(noc C) #设置头文件的目录 include_directories(${CMAKE_SOURCE_DIR}/…...
14 - VDMA彩条显示实验
文章目录 1 实验任务2 系统框图3 硬件设计4 软件设计 1 实验任务 本实验任务是PS端写彩条数据至DDR3内存中,然后通过PL端的VDMA IP核将彩条数据通过HDMI接口输出显示。 2 系统框图 本实验是用HDMI接口固定输出1080P的彩条图,所以: rgb2lc…...
