一、基础架构

2023-11-07

  1. 架构是什么?
  2. 软件架构指软件系统的顶层结构,主要是由系统是一群关联个体组成,个体可以是模块或者子系统,他们按照某种特定的规则来运作和协作。

系统架构的目的
架构设计的主要目的是为了解决软件系统复杂度带来的问题,要有的放矢,不是胡编乱造。

(这个结论虽然很简洁,但却是架构设计过程中需要时刻铭记在心的一条准则)

  1. 复杂度来源

复杂度来源主要包括:高性能、高可用、可扩展、低成本、安全、规模。

3.1 高性能复杂度

解决集群复杂度:增加机器任务分配 和 将任务分解。

任务分解:

将系统分拆为多个子系统,单独的一个子系统功能内聚,单个运行起来更简单,更容易做到高性能,针对单个任务更进行扩展。

3.2 高可用复杂度

高可用的本质无非就是“冗余”来实现,高性能增加机器目的在于“扩展”处理性能;高可用增加机器目的在于“冗余”处理单元。

存储高可用的难点不在于如何备份数据,而在于如何减少或者规避数据不一致对业务造成的影响。

3.2 可扩展性复杂度

设计具备良好可扩展性的系统,有两个基本条件:正确预测变化、完美封装变化。

综合分析,预测变化的复杂性在于:不能每个设计点都考虑可扩展性。不能完全不考虑可扩展性。所有的预测都存在出错的可能性。

第一种应对变化的常见方案是将“变化”封装在一个“变化层”,将不变的部分封装在一个独立的“稳定层”。

第二种常见的应对变化的方案是提炼出一个“抽象层”和一个“实现层”。抽象层是稳定的,实现层可以根据具体业务需要定制开发。

4.架构设计三大原则

架构设计的三大原则:合适原则、简单原则、演化原则

合适原则宣言:“合适优于业界领先”。

简单原则宣言:“简单优于复杂”。

演化原则宣言:“演化优于一步到位”。

5.架构设计流程

大概分为五步:识别复杂度、设计备选方案、评估和选择备选方案、设计详细的方案。

5.1 识别复杂度

将主要的复杂度问题列出来,然后根据业务、技术、团队等综合情况进行排序,优先解决当前面临的最主要的复杂度问题。

5.2 设计备选方案

备选做法:

1)备选方案的数量以 3 ~ 5 个为最佳。

2)备选方案的差异要比较明显。

3)备选方案的技术不要只局限于已经熟悉的技术。

设计常见错误:

1)设计最优秀的方案。

2)只做一个方案。

3)备选方案过于详细。

5.3 评估和选择备选方案

选取方案时候 可能会分为三种派别:最牛派、最熟派、领导派

其实这些派没有绝对的对错,不同的情景有不同的对和错。

选择方案的方式:

列出我们需要关注的质量属性点,然后分别从这些质量属性的维度去评估每个方案,再综合挑选适合当时情况的最优方案。常见的方案质量属性点有:性能、可用性、硬件成本、项目投入、复杂度、安全性、可扩展性等。在评估这些质量属性时,需要遵循架构设计原则 1“合适原则”和原则 2“简单原则”,避免贪大求全,基本上某个质量属性能够满足一定时期内业务发展就可以了。然后将这些质量属性按照优先级排列 进行选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一、基础架构 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 爬虫遇到验证码必须要知道的解决办法(干货)

    对于爬取数据而言 有的网站在登录时或者采集数据过程中 都会出现验证码 对于网络爬虫而言 解决验证码识别识别是非常重要的一件事 今天 我们将讨论有关验证码的5件事 以帮助大家更好的进行网络数据抓取 1 什么是验证码 2 验证码是如何工作的 3
  • 浏览器输入url后经历的过程

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 过程简述 二 发送http请求前先进行DNS域名解析 主要过程如下 注意 三 三次握手 四 四次挥手 五 TCP的连接与断开 六 浏览器渲染过程 渲染细节 一
  • 免费、强大的笔记软件推荐:Obsidian、Zettlr、Joplin、FlowUs

    在优质应用推荐系列中 我已经推送了 盘点那些具有特色的笔记软件 盘点那些具有特色的写作软件 优质笔记软件详细盘点 一 优质笔记软件盘点 二 今天在此基础上继续推送 免费且优秀的笔记软件 推荐标准 1 完全免费的笔记软件 这类应用绝大部分是开
  • Qt封装HTML网页及数据交互(通信)

    看到网上有个关于Qt封装网页的例子 CSDN下载需要50积分 我呸 其实也是人家Qt官网给的demo 然后改了一丢丢而已 既然这样 那我也实现一下 而且提供源码 环境 Qt5 13 MSVC 要点 Qt GUI QWebEngine QWe
  • 第八届蓝桥杯省赛C++A组 正则问题

    考虑一种简单的正则表达式 只由 x 组成的正则表达式 小明想求出这个正则表达式能接受的最长字符串的长度 例如 xx xxx x x xx xx 能接受的最长字符串是 xxxxxx 长度是6 输入格式 一个由x 组成的正则表达式 输出格式 输
  • 云服务器应用镜像和系统镜像一般选哪个好些?

    一般推荐选择安装系统镜像 安装纯净的操作系统 这样的话操作系统是纯净的未安装过任何环境和程序的 方便我们操作 1 服务器的镜像和操作系统是可以直接更换的 我们在阿里云的服务器后台直接就可以更换操作系统镜像 重装系统的 而且是免费不花钱的1分
  • 【技术案例】Firefly-RK3399多路视频编解码

    Firefly RK3399开源板拥有强大的视像处理器 VPU 能够流畅的实现H 264编解码功能 可以同时进行两路视频编码和五路视频解码 在应用方面 多路编解码功能可以更优秀地应用于同时录像和播放多个视频的场景 1分钟视频 一起先来了解下
  • jquery的find和children区别

    jQuery find方法可以找到任意深度的子元素 而children方法只能找到第一级的子元素 运行一下以下的代码就知道 div div
  • 微信小程序wx.getLocation审核不通过的解决方法

    写这篇文字的同时 博主已经被小程序接口审核拒了12次了 几乎每次都是 1 你好 你的小程序 xxxxxx 申请的wx getLocation接口因你提供的申请原因 辅助图片 网页 视频内容无法确认申请接口使用场景审核不通过 建议修改后重新提
  • AV1,实时编码READY

    点击上方 LiveVideoStack 关注我们 一款编码器的成功 不仅需要大量的金钱 还需要耐心 AV1定稿三年后 是时候为它庆祝了 文 包研 不知不觉 距离AV1完成定稿已经过去了三年多 这个新的视频编码标准已经获得了工业界认可 换句话
  • 02智慧城市分层架构

    一张图读懂一个产业之智慧城市分层架构 智慧城市的网络通讯技术 ICT 架构自下而上包含五层 依次为 物联感知层 网络通信层 计算存储层 数据与服务融合层 智慧应用层 除基础架构外 还包含建设管理体系 安全保障体系和运维管理体系
  • 用Python和Pygame写游戏-从入门到精通(实战一:涂鸦画板1)

    用Python和Pygame写游戏 从入门到精通 实战一 涂鸦画板1 从这次开始 我会由简单到困难 其实也不会困难到哪里去 讲几个例程 每一个例程都是我自己写 或者修改 那样的话我会提供原始出处 的 都具有一定的操作性和娱乐性 例程中汇尽量
  • flutter 监听器ValueListenableBuilder

    final ValueNotifier
  • Selenium滚动条处理

    Selenium是一个用于Web应用程序自动化测试工具 可以直接运行在浏览器中 针对页元素来进行定位并模仿认为操作 但是却无法控制滚动条 这时候只能借助JS了 selenium提供了一个操作js的方法 execute script 可以直接
  • mysql show技巧

    mysql show技巧 当我们show的内存列数比较多时 会出现以下情况 很不方便不看 mysql gt show proc backends 此时 我们可以使用一个小技巧 下面看起来就很友好了 mysql gt show proc ba
  • git push报错 Missing or invalid credentials

    zys zys virtual machine work cpp git push origin master Missing or invalid credentials Error connect ECONNREFUSED run us
  • Unity开发:一个PC项目转WebGL遇到的问题解决汇总

    这段时间遇到一个PC版本发布WebGL的工程 遇到很多的问题 在这里做下记录 1 发布报错 程序中出现DLL调用的情况 删除调用DLL相关代码 发布路径不要出现中文 2 WebGL无法通过IO流读取本地json文件 改成TextAsset绑
  • Web前端:html烟花代码

    代码如下
  • 【c语言】新手初学while循环,for循环的一些想法与思考

    循环语句有三种 while循环 for循环 do while循环 由于只学了前两种 因此只能将两种进行比较 但在比较两者前 我认为新手有必要认真的学习良好的代码习惯 这里我使用的是 高质量 C C 编程指南 尽管年代比较久远但依旧受益良多
  • 一、基础架构

    架构是什么 软件架构指软件系统的顶层结构 主要是由系统是一群关联个体组成 个体可以是模块或者子系统 他们按照某种特定的规则来运作和协作 系统架构的目的 架构设计的主要目的是为了解决软件系统复杂度带来的问题 要有的放矢 不是胡编乱造 这个结论