当前位置: 首页 > news >正文

互联网系统的微观与宏观架构

互联网系统的架构设计,通常会根据项目的体量、业务场景以及技术需求被划分为微观架构(Micro-Architecture)和宏观架构(Macro-Architecture)。这两者的概念与职责既独立又相互关联。本文将通过一些系统案例,结合架构原则和复杂度的度量手段,探讨微观架构与宏观架构的区别、联系,以及对架构师的专业要求。

d73c7621e33d4f50b5bdf1a2feea09f6.png

一、微观架构与宏观架构的定义

  1. 微观架构:微观架构更关注系统内部模块的设计细节,通常涵盖组件的交互、接口定义、数据流向、数据库模式设计、服务的业务逻辑层次划分等。其设计目的是保证代码的可维护性、模块的可扩展性以及开发团队的高效协作。
  2. 宏观架构:宏观架构则聚焦系统整体的高层次设计,如系统模块划分、分布式系统的通信方式、服务间的依赖关系、容灾设计、负载均衡、分布式存储等。其目标是确保系统具备高可用性、扩展性和性能。

二、典型案例分析

  1. 微服务架构案例(微观架构与宏观架构结合)
    微服务架构是互联网系统中较为典型的设计,它通过将业务功能拆分成独立服务,每个服务都有自己的数据库与业务逻辑,最终通过 API 网关进行调用。这种架构需要在微观层面实现服务的解耦、服务间的接口设计、数据一致性等;而在宏观层面,微服务的划分、网络通信协议、服务注册与发现、容灾机制、监控等均属于关键设计。
    • 微观架构:微服务的具体实现,如数据库表设计、各个服务之间的接口定义、服务内部的业务逻辑。
    • 宏观架构:服务划分策略、API 网关的使用、服务发现、网络协议和负载均衡策略。
  1. 电商系统架构案例(宏观复杂度高)
    电商系统由于要处理大量并发请求,通常需要在宏观架构上重点考虑高可用、水平扩展和性能优化。具体来说,宏观架构的设计包括全站缓存方案(如 Redis)、分布式数据库拆分(如主从数据库设计)、支付系统的分布式事务处理以及订单流转的幂等设计。
    • 微观架构:每个子系统如购物车、订单系统、支付系统的内部逻辑和模块划分。
    • 宏观架构:电商系统如何分层,数据如何在前后端传递,如何确保交易系统的高可用性。
  1. 搜索引擎系统(微观架构复杂度高)
    搜索引擎系统的微观架构更为复杂,因为它需要对索引、分词、倒排索引、排序算法等进行精细的设计。而宏观架构层面则涉及如何构建集群、如何分布式存储海量数据、查询负载的均衡策略等。
    • 微观架构:分词器、索引构建算法、文档排序策略、数据存储格式。
    • 宏观架构:索引数据的分布式存储,查询请求的路由和负载均衡。

三、架构原则

无论是微观架构还是宏观架构,都需要遵循一些通用的设计原则,确保系统的健壮性、可扩展性和高可用性。

  1. 单一职责原则(SRP):每个模块或服务应该只专注于一个功能。这一原则对于微观架构尤为重要,能保证模块的高内聚、低耦合,使系统易于维护。
  2. 开闭原则(OCP):系统应该对扩展开放,对修改关闭。系统设计应允许通过扩展现有功能而不破坏原有代码。尤其在宏观架构中,这一原则可以确保业务扩展时不影响已有服务。
  3. 高内聚低耦合:高内聚意味着模块内部的相关性强,低耦合意味着模块之间的依赖关系弱。这一原则是设计微服务架构的核心,能够极大提升代码的可复用性与测试性。
  4. 高可用性设计:宏观架构的设计通常需要优先考虑系统的可用性。通过冗余设计、多活数据中心、异地容灾等手段确保在部分组件失效的情况下,系统仍然可以持续提供服务。
  5. 水平扩展性:系统应能通过增加节点或服务器进行横向扩展,而不必对原有系统做过多的调整。在微观架构中,模块化设计能使得代码易于扩展;在宏观架构中,支持水平扩展的设计可减少单点瓶颈。
  6. 最终一致性:对于分布式系统而言,数据一致性往往难以实时保证,因此需要采用最终一致性策略。微服务架构中经常通过事件驱动、消息队列等方式实现系统的最终一致性。

四、复杂度的度量手段

系统复杂度可以从多个维度进行度量,帮助架构师更好地理解和应对系统的复杂性。

  1. 模块化复杂度
    • 可以通过模块的数量、模块间的依赖关系来衡量微观架构的复杂度。使用依赖图、类图等工具,可以清晰地展示模块间的关系,从而评估模块的内聚性和耦合度。
  1. 性能复杂度
    • 评估系统在高并发下的表现。通常通过负载测试和性能测试工具(如 JMeter、Gatling)来测量系统的响应时间、吞吐量和并发处理能力。对于宏观架构,架构师需要能够预测和衡量系统在高并发场景下的瓶颈和拓展点。
  1. 可维护性复杂度
    • 微观架构中的代码复杂度通常可以通过代码审查工具(如 SonarQube)进行分析,从而评估代码的可读性、可维护性、单元测试覆盖率等指标。
  1. 拓展性复杂度
    • 在宏观架构中,复杂度可以通过系统的水平扩展能力、服务拆分的灵活性来度量。设计一个易于扩展的架构,可以通过负载均衡、微服务架构、分布式系统等方案实现。

五、对架构师的要求

互联网系统架构的设计对架构师的能力有着极高的要求,尤其是在面对大型分布式系统时,架构师不仅要掌握微观和宏观层面的架构知识,还需具备极强的全局视野与技术实践能力。

  1. 全栈技术能力:架构师需掌握前后端技术栈、数据库优化、网络通信等技术,能够对各层的性能瓶颈、系统故障做出及时准确的判断。
  2. 架构思维与抽象能力:优秀的架构师能够通过抽象和模块化,将复杂的业务逻辑拆解成独立的子系统,降低系统的复杂性,使之具有高扩展性和可维护性。
  3. 分布式系统设计经验:在宏观架构设计中,架构师需要掌握分布式系统设计的各类工具与方法,如分布式一致性、CAP 理论、负载均衡和高可用性设计等。
  4. 快速迭代与敏捷开发:互联网产品通常需要快速迭代,因此架构师需要设计支持快速开发和上线的架构,确保系统能在业务快速变化时灵活响应。
  5. 业务理解能力:架构设计不仅仅是技术层面的工作,架构师还需要深入理解业务,预判业务的发展方向,从而做出前瞻性的设计。

结语

互联网系统的架构设计无论是微观架构还是宏观架构,都是在平衡系统复杂性与业务需求的基础上进行的。架构师需要在设计时把握好系统的规模和复杂度,并通过适当的设计原则、复杂度的度量工具,保障系统的高效性、扩展性和可维护性。

 

相关文章:

互联网系统的微观与宏观架构

互联网系统的架构设计,通常会根据项目的体量、业务场景以及技术需求被划分为微观架构(Micro-Architecture)和宏观架构(Macro-Architecture)。这两者的概念与职责既独立又相互关联。本文将通过一些系统案例,…...

数据库、数据仓库、数据湖和数据中台有什么区别

很多企业在面对数据存储和管理时不知道如何选择合适的方式,数据库、数据仓库、数据湖和数据中台,这些方式都是什么?有什么样的区别?企业根据其业务类型该选择哪一种?本文就针对这些问题,来探讨下这些方式都…...

vscode配色主题与图标库推荐

vscode配色主题推荐:Andromedavsocde图标库: vscode-icons Andromeda Dark theme with a taste of the universe 仙女座:一套宇宙深空体验的哑暗色主题; 高对比度,色彩饱和; Easy Installation Open the extensions sidebar on Visual Studio CodeSear…...

深度学习模型入门教程:从基础到应用

深度学习模型入门教程:从基础到应用 前言 在人工智能的浪潮中,深度学习作为一种强大的技术,正在各行各业中发挥着越来越重要的作用。从图像识别到自然语言处理,深度学习正在改变我们的生活和工作方式。本文将带您深入了解深度学…...

数据结构 软考

算法具有5个特性 可行性,有限性,确定性,输入, 输出 图: 有向图 Kruskal(克鲁斯卡尔)算法 和 prim(普鲁姆)算法 都是贪心算法 是一种用来在加权连通图中寻找最小生成树的算法,其操作对象是边. 找最小的不形成环 1.哈夫曼树(也叫最优树)…...

colcon构建ros2功能包时,出现exited with code 2报错的解决方案(bug)

背景: 在学习ros2时,跟着别人的示例进行构建,手敲的代码难免有一些语法错误。 问题: 在colcon构建时,并不会直接输出语法报错。而是出现exited with code 2错误,并提示未能生成功能包,就算加入…...

【大模型LLM面试合集】大语言模型架构_位置编码

位置编码 1.位置编码 不同于RNN、CNN等模型,对于Transformer模型来说,位置编码的加入是必不可少的,因为纯粹的Attention模块是无法捕捉输入顺序的,即无法区分不同位置的Token。为此我们大体有两个选择: 想办法将位置…...

FLINK 分流

在Apache Flink中,分流(Stream Splitting)是指将一条数据流拆分成完全独立的两条或多条流的过程。这通常基于一定的筛选条件,将符合条件的数据拣选出来并放入对应的流中。以下是关于Flink分流的详细解释: 一、分流方式…...

从零开始:构建一个高效的开源管理系统——使用 React 和 Ruoyi-Vue-Plus 的实战指南

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

windows下pycharm社区版2024下载与安装(包含新建第一个工程)

windows下pycharm社区版2024下载与安装 下载pycharm pycharm官网 安装pycharm 1.进入官网 pycharm官网 下载 点击Download–>右侧Other versions 下载对应的社区版(如下图):下载网址 2.点击运行下载好的安装包 点击下一步 3.更改pychar…...

重构案例:将纯HTML/JS项目迁移到Webpack

我们已经了解了许多关于 Webpack 的知识,但要完全熟练掌握它并非易事。一个很好的学习方法是通过实际项目练习。当我们对 Webpack 的配置有了足够的理解后,就可以尝试重构一些项目。本次我选择了一个纯HTML/JS的PC项目进行重构,项目位于 GitH…...

表格编辑demo

<el-form :model"form" :rules"status ? rules : {}" ref"form" class"form-container" :inline"true"><el-table :data"tableData"><el-table-column label"计算公式"><templat…...

企业自建邮件系统选U-Mail ,功能强大、安全稳定

在现代企业运营中&#xff0c;电子邮件扮演着至关重要的角色&#xff0c;随着企业规模的增长和业务的多样化&#xff0c;传统的租用第三方企业邮箱服务逐渐显现出其局限性。例如&#xff0c;存储空间受限、数据安全风险、缺乏灵活的管理和备份功能&#xff0c;以及无法与其他企…...

蓝桥杯题目理解

1. 一维差分 1.1. 小蓝的操作 1.1.1. 题目解析&#xff1a; 这道题提到了对于“区间”进行操作&#xff0c;而差分数列就是对于区间进行操作的好方法。 观察差分数列&#xff1a; 给定数列&#xff1a;1 3 5 2 7 1 差分数列&#xff1a;1 2 2 -3 5 6 题目要求把原数组全部…...

浪潮云启操作系统(InLinux)bcache缓存实践:理解OpenStack环境下虚拟机卷、Ceph OSD、bcache设备之间的映射关系

前言 在OpenStack平台上&#xff0c;采用bcache加速ceph分布式存储的方案被广泛用于企业和云环境。一方面&#xff0c;Ceph作为分布式存储系统&#xff0c;与虚拟机存储卷紧密结合&#xff0c;可以提供高可用和高性能的存储服务。另一方面&#xff0c;bcache作为混合存储方案&…...

通过ssh端口反向通道建立并实现linux系统的xrdp以及web访问

Content 1 问题描述2 原因分析3 解决办法3.1 安装x11以及gnome桌面环境查看是否安装x11否则使用下面指令安装x11组件查看是否安装gnome否则使用下面指令安装gnome桌面环境 3.2 安装xrdp使用下面指令安装xrdp&#xff08;如果安装了则跳过&#xff09;启动xrdp服务 3.3 远程服务…...

# 渗透测试#安全见闻8 量子物理面临的安全挑战

# 渗透测试#安全见闻8 量子物理面临的安全挑战 ##B站陇羽Sec## 量子计算原理与技术 量子计算是一种基于量子力学原理的计算方式&#xff0c;它利用量子位&#xff08;qubits&#xff09;来进行信息处理和计算…...

【rabbitmq】实现问答消息消费示例

目录 1. 说明2. 截图2.1 接口调用截图2.2 项目结构截图 3. 代码示例 1. 说明 1.实现的是一个简单的sse接口&#xff0c;单向的长连接&#xff0c;后端可以向前端不断输出数据。2.通过调用sse接口&#xff0c;触发rabbitmq向队列塞消息&#xff0c;向前端返回一个sseEmitter对象…...

单片机_RTOS__架构概念

经典单片机程序 void main() {while(1){函数1&#xff08;&#xff09;&#xff1b;函数2&#xff08;&#xff09;&#xff1b;}} 有无RTOS区别 裸机 RTOS RTOS程序 喂饭&#xff08;&#xff09; {while&#xff08;1&#xff09;{喂一口饭&#xff08;&#xff09;;} } …...

ClickHouse在百度MEG数据中台的落地和优化

导读 百度MEG上一代大数据产品存在平台分散、质量不均和易用性差等问题&#xff0c;导致开发效率低下、学习成本高&#xff0c;业务需求响应迟缓。为了解决这些问题&#xff0c;百度MEG内部开发了图灵3.0生态系统&#xff0c;包括Turing Data Engine(TDE)计算引擎、Turing Dat…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...