做外贸方面的网站/广州网络推广seo
在项目和产品开发过程中,软件工程团队需要做出架构决策以实现其目标。这些决策可以是技术性的,也可以与流程相关。
技术决策:例如决定使用JBOSS Data Grid作为缓存解决方案还是选择Amazon Elasticache,或者决定使用AWS Network Load Balancer (NLB) 而不是 AWS Application Load Balancer (ALB)。
流程决策:决定使用内容管理门户来分享文档或与项目相关的工件。做出这些决策是一个既耗时又困难的过程,团队有必要为这些决策提供理由、进行记录,并与相关的利益相关者进行沟通。
在做出架构决策时,常常出现三大反模式:
-
出于对做出错误选择的恐惧,根本没有做出决策。
-
做出决策时没有任何理由,大多数时候,人们不明白为什么做出这样的决策,以及已经考虑了哪种用例或场景。这导致同一主题被多次讨论。
-
决策没有被记录在架构决策仓库中,因此团队成员忘记或不知道已经做出了这个决策。
什么是ADR?
架构决策记录(ADR)是一份文档,用于记录决策,包括决策是如何做出的背景以及采纳该决策的后果。
何时撰写ADR?
当需要做出重要的架构决策时,通常会编写ADR,例如选择新的技术、框架或设计模式,或者在不同的架构目标(如性能、可扩展性和可维护性)之间做出权衡。
ADR也对记录已经做出的决策非常有用,以确保开发团队的所有成员都明白其背后的原因。ADR还确保你与组织的IT策略保持一致。
ADR通常包括诸如正在解决的问题、已考虑的选项、已做出的决策、决策背后的原因以及任何相关的技术细节等信息。它们还可能包括与决策相关的任何含义或风险,以及由于决策可能需要的任何未来工作。
撰写ADR可以帮助促进开发团队内的透明度和协作,同时为将来可能需要了解过去决策背后原因的开发者提供有价值的资源。
撰写ADR时的最佳实践
编写架构决策记录(ADR)时,遵循一些最佳实践是很重要的,以确保ADR清晰、有用且易于理解。以下是撰写ADR的一些建议:
-
从清晰的标题开始:ADR的标题应该简洁明了,总结所做的决策。
-
定义问题:首先明确定义决策要解决的问题或挑战。这有助于为决策提供上下文,并确保每个人都理解要解决的问题。
-
描述决策:清晰地描述已做出的决策,包括已考虑的替代方案以及选择所选选项的原因。这应该包括做出的任何权衡或妥协,以及任何相关的技术细节。
-
解释理由:提供决策背后的原因的清晰、详细的解释。这应包括任何相关的业务或技术考虑,以及任何风险或潜在缺陷。
-
记录任何影响:记录决策的任何影响,包括对系统的其他部分的任何依赖性、对性能或可扩展性的任何影响,以及由于决策可能出现的任何风险或问题。
-
保持简洁:ADR应该简洁且易于阅读。避免包括不必要的信息或技术术语,专注于提供决策过程及其背后原因的清晰和简洁的解释。
-
保持最新:随着项目的进展,应保持ADR的更新。如果出现影响决策的新信息或考虑因素,应更新ADR以反映这些变化。
遵循这些最佳实践,ADR可以提供重要架构决策的清晰和有用的记录,并帮助确保团队中的每个人都了解这些决策背后的原因。
示例ADR
既然我们已经定义了什么是ADR以及编写ADR时应遵循的最佳实践,那么现在让我们尝试按照这些最佳实践来编写一个ADR。
为了编写一个示例ADR,我们将尝试记录博客中描述的一个解决方案,即从本地存储迁移非结构化数据(文件)到AWS。在该博客中,有三种情境及每种情境的解决方案。对于这个ADR示例,我们将选择使用AWS DataSync从NAS迁移到AWS的解决方案。
标题:使用AWS DataSync从NAS迁移到AWS
状态:已接受
日期:2023年10月6日
背景:
应用程序A从应用程序X接收文件,处理它们并生成大小在50-300 GB之间的数据文件。然后,这成为另一个应用程序Y要使用的输入。通过NFS存储,所有三个应用程序可以访问这些数据。应用程序A正在迁移到AWS,而应用程序X和Y继续在本地运行。我们使用AWS弹性文件系统(EFS)在AWS上替代NFS。但这使得应用程序难以从共同的存储解决方案中读/写,而且网络延迟减慢了应用程序X和应用程序Y的速度。
决策:
我们将使用AWS DataSync服务进行初步迁移,将近1 TB的数据从本地NFS存储迁移到AWS EFS。
AWS DataSync可以在任何两个网络存储或对象存储之间传输数据。这些可以是网络文件系统(NFS)、服务器消息块(SMB)文件服务器、Hadoop分布式文件系统(HDFS)、自管理对象存储、AWS Snowcone、Amazon简单存储服务(Amazon S3)桶、Amazon弹性文件系统(Amazon EFS)文件系统、Amazon FSx for Windows文件服务器文件系统、Amazon FSx for Lustre文件系统和Amazon FSx for OpenZFS文件系统。
为了满足应用程序从共同的存储解决方案中读/写的需求,并解决在Direct Connect中读/写操作过程中涉及的网络延迟,我们安排在NFS和EFS之间使用AWS DataSync服务定期同步特定的输入和输出文件夹。这意味着所有三个应用程序在同步完成后查看的文件集都是相同的。
后果:
积极的
• 无固定/预付费用,只需为数据传输的每千兆字节(GB)支付0.0125美元。
消极的
• 同步可以安排为最少一小时一次。这个软限制可以修改为最多15分钟一次,但这会导致性能问题和后续的同步计划被排队,形成一个循环。
• 双向同步被配置为排队方式运行。也就是说,一次只能执行一个方向的同步。应用程序在同步间隔完成后必须读取文件。在我们的情况下,文件每天只生成一次,所以我们通过及时安排读/写来缓解了这个问题。
• AWS DataSync Agent(虚拟设备)必须在本地的专用VM上安装。
合规性:
备注:
作者:Rakesh Rao 和 Santhosh Kumar Ramabadran
版本:0.1
变更日志:0.1:最初提议的版本
尽管上面是一种格式,但与利益相关者达成协议后,ADR可以采用任何格式创建。它可以简单到Word文档、电子表格或演示文稿。
何时不编写ADR?
尽管架构决策记录(ADRs)可以帮助记录重要的架构决策,但在某些情况下,编写ADR可能是不必要或不适当的。以下是一些例子:
-
次要决策:如果一个决策对系统的架构影响很小或相对简单,可能不需要编写ADR。例如,如果团队决定将一个库更新到新版本,并且预计此更新对整体架构的影响很小,那么可能不需要ADR。
-
临时决策:如果一个决策预计是暂时的,或只适用于特定的背景或情境,可能不需要编写ADR。例如,如果团队决定为一个错误实现一个临时的解决方法,而这个解决方法预计不会成为长期的解决方案,那么可能不需要ADR。
-
常规决策:如果团队作出的决策是常规性的,不特别重要或需要很少的讨论或辩论,那么可能不需要ADR。例如,如果团队决定遵循一个既定的设计模式或使用一种常用的技术,那么可能不需要ADR。
-
现有文档:如果决策已在其他地方记录,如项目要求或设计文档中,则可能不需要为该决策专门创建ADR。
最终,是否编写ADR的决策取决于决策的重要性和它被做出的背景。如果决策对系统的架构有重大影响、涉及权衡或替代方案、或可能有长期影响,通常建议创建ADR来记录决策过程。
ADR的替代方案
虽然架构决策记录(ADRs)是记录重要架构决策的常见和有效方法,但根据项目的特定背景和需求,还有几种替代方法。以下是几种替代ADR的方法:
-
代码注释:与ADRs的一个简单替代方法是在代码库中直接使用代码注释来记录架构决策。这对于较小的项目或那些更喜欢轻量级文档方法的团队来说可能是一个有用的方法。但是,代码注释可能变得难以管理,并且对于更复杂的决策可能不提供足够的背景或详细信息。
-
设计文档:设计文档可以提供一种更全面和详细的方法来记录架构决策。这些文档可以包括图表、流程图和其他视觉辅助工具来帮助解释系统的架构。然而,设计文档可能需要大量时间来创建,并可能随着项目的发展而过时。
-
Wiki或知识库:与ADR相比,Wiki或知识库提供了一种更灵活和可搜索的方式来记录架构决策。对于大型或复杂的项目,这种方法特别有用,因为它允许团队轻松找到并参考与特定架构决策相关的信息。但是,Wiki和知识库也可能变得难以管理,并可能需要额外的努力来保持最新。
-
会议和讨论:另一种记录架构决策的方法是定期举行会议或讨论来回顾和记录决策。这种方法对于重视面对面沟通和合作的团队可能很有用,但对于远程团队或时区不同的成员可能不那么有效。
最终,记录架构决策的最佳方法取决于项目的特定需求和背景。团队在决定使用哪种方法时,应考虑诸如项目大小、团队大小和沟通偏好等因素。
作者:Rakesh Rao
更多技术干货请关注公号【云原生数据库】
squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。
相关文章:

架构决策记录 ADR
在项目和产品开发过程中,软件工程团队需要做出架构决策以实现其目标。这些决策可以是技术性的,也可以与流程相关。 技术决策:例如决定使用JBOSS Data Grid作为缓存解决方案还是选择Amazon Elasticache,或者决定使用AWS Network L…...

SSM之spring注解式缓存redis->redis整合,redis的注解式开发及应用场景,redis的击穿穿透雪崩
redis整合redis的注解式开发及应用场景redis的击穿穿透雪崩 1.redis整合 mysql整合 pom配置; String-fmybatis.xml --> mybatis.cfg.xml: 包扫描; 注册了一个jdbc.properties(url/password/username/...); 配置数据源(数据库连…...

数据库性能优化(查询优化、索引优化、负载均衡、硬件升级等方面)
数据库性能优化是提升数据库系统整体性能和响应速度的一系列技术和策略。它可以通过多种方式来实现,包括优化查询语句、索引设计、硬件升级、负载均衡等手段。 合适的数据模型设计 正确的数据模型设计是性能优化的基石。合理的表结构和关系设计可以减少冗余数据&…...

谁说 Linux 不能玩游戏?
在上个世纪最早推出视频游戏的例子是托马斯戈德史密斯(Thomas T. Goldsmith Jr.)于1947年开发的“「Cathode Ray Tube Amusement Device」”,它已经显着发展,并且已成为人类生活中必不可少的一部分。 通过美国游戏行业的统计数据&…...

发电机负载测试方案
发电机负载测试是为了评估发电机在不同负载条件下的性能和稳定性。下面是一个可能的发电机负载测试方案: 测试前准备: - 确定测试的负载范围和条件,包括负载大小、负载类型(如电阻性、感性或容性负载)、负载持续时间等…...

Flask三种文件下载方法
Flask 是一个流行的 Python Web 框架,它提供了多种方法来实现文件下载。在本文中,我们将介绍三种不同的方法,以便你能够选择最适合你应用程序的方法。 方法一:使用 send_file 函数 send_file 函数是 Flask 中最常用的文件下载方法…...

OpenCV C++ 图像处理实战 ——《基于NCC多角度多目标匹配》
OpenCV C++ 图像处理实战 ——《基于NCC多角度多目标匹配》 一、结果演示二、NCC模板匹配2.1、OpenCV matchTemplate2.2、多角度2.3、多目标2.4、NMS非极大值抑制三、代码实现3.1 制作模板3.1 单目标匹配3.1.1 模板图像旋转3.1.2 旋转目标坐标3.2 多目标匹配3.2.1 制作模板3.2.…...

【书籍篇】Spring实战第4版 第2部分 Web中的Spring
Spring实战第4版 第2部分 Web中的Spring 五. 构建Spring Web应用程序5.1 SpirngMVC请求流程5.2 搭建Spring MVC5.2.1 配置DispatcherServlet5.2.2 配置WebConfig5.2.3 配置RootConfig 5.3 编写基本的控制器5.4 Spittr首页5.6 复杂的控制器5.6.1 定义类级别的请求处理5.6.2 传递…...

IC - 基础知识 - SOC与MCU
说明 工作中有涉及到SOC和MCU,非嵌入式专业,对两个概念理解不是很清晰。 共同点 MCU和SOC是两种常见的集成电路 (IC) 设计形式,它们的区别在于它们的设计目的和应用场景。工作中将MCU和SOC都称为IC也是没问题的,但是专业人员会…...

【elasticsearch+kibana基于windows docker安装】
创建网络:es和kibana容器互联 docker network create es-net加载镜像 docker pull elasticsearch:7.12.1运行 docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -v $…...

VMware网络设置 桥接模式 NAT VMNET0 1 8
1.桥接模式 虚拟机与主机并列 可拥有独立IP 主机与虚拟机之间,以及各虚拟机之间都可以互访。对应虚拟机就被当成主机所在以太网上的一个独立物理机来看待,各虚拟机通过默认的 VMnet0 网卡与主机以太网连接,虚拟机间的虚拟网络为 VMnet0。这…...

【MongoDB】MongoExport如何过滤数据导出
问题 使用MongoDB处理导出数据时,想增加数据过滤操作。 例如:导出所有isGirl为true的所有数据。 分析 在mongoexport说明文档中找到了query字段和queryFile字段,用来进行数据查询匹配导出。 query字段 后面直接跟 json格式数据。 queryF…...

吴恩达《机器学习》6-1->6-3:分类问题、假设陈述、决策界限
一、什么是分类问题? 在分类问题中,我们试图预测的变量𝑦是离散的值,通常表示某种类别或标签。这些类别可以是二元的,也可以是多元的。分类问题的示例包括: 判断一封电子邮件是否是垃圾邮件(二…...

C语言 用字符串比较函数cmp来做一个门禁:账号密码是否匹配 (干货满满)
#include<stdio.h> #include<string.h> void fun04() {for (int i 0; i < 3; i){char *str01 "hello";char uname[100] ;printf("请输入账号");scanf("%s",uname);char *str02 "123456";char pword[100];printf(&qu…...

Uniapp实现多语言切换
前言 之前做项目过程中,也做过一次多语言切换,大致思想都是一样的,想了解的可以看下之前的文章C#WinForm实现多语言切换 使用i18n插件 安装插件 npm install vue-i18n --saveMain.js配置 // 引入 多语言包 import VueI18n from vue-i18n…...

企业数字化转型与供应链效率-基准回归复刻(2007-2022年)
参照张树山(2023)的做法,本团队对来自统计与决策《企业数字化转型与供应链效率》一文中的基准回归部分进行复刻。文章实证检验企业数字化转型对供应链效率的影响。用年报词频衡量上市公司数字化转型程度,以库存周转天数来衡量供应…...

支持向量机 (SVM):初学者指南
照片由 Unsplash上的 vackground.com提供 一、说明 SVM(支持向量机)简单而优雅用于分类和回归的监督机器学习方法。该算法试图找到一个超平面,将数据分为不同的类,并具有尽可能最大的边距。本篇我们将介绍如果最大边距不存在的时候…...

UnityShader(五)
这次要用表面着色器实现一个水的特效。先翻到最下边看代码,看不懂再看下面的解释。 首先第一步要实现水的深浅判断,实现深水区和浅水区的区分。 这里需要用到深度图的概念。不去说太多概念,只去说怎么实现的,首先我们的水面是在…...

Java中的类和对象
文章目录 一、类和对象的基本概念二、类和对象的定义和使用1.创建类的语法2.创建类的对象3.范例(创建一个类的对象) 三、this引用1.什么是this引用2.this引用的特性 四、构造方法五、封装1.封装的概念2.访问限定符3.封装扩展包3.1包的概念3.2常见的包 六、static成员1.static修…...

多测师肖sir_高级金牌讲师_jenkins搭建
jenkins操作手册 一、jenkins介绍 1、持续集成(CI) Continuous integration 持续集成 团队开发成员每天都有集成他们的工作,通过每个成员每天至少集成一次,也就意味着一天有可 能多次集成。在工作中我们引入持续集成,通…...

Ps:色彩范围
Ps菜单:选择/色彩范围 Select/Color Range 色彩范围 Color Range是一个功能强大选择命令,不仅可以基于颜色进行选择,而且可以基于影调进行选择。不仅可以用来检测人脸选择肤色,也可用来选择超出印刷色域范围的区域。 在图层蒙版的…...

基于SSM的宠物医院管理系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...

华为政企园区网络交换机产品集
产品类型产品型号产品说明 核心/汇聚交换机CloudEngine S5731-H24P4XCCloudEngine S5731-H24P4XC 提供 24个10/100/1000BASE-T以太网端口,4个万兆SFP,CloudEngine S5731-H 系列交换机是华为公司推出的新一代智能千兆交换机,基于华为公司统…...

NVMe FDP会被广泛使用吗?
文章开头,我们需要先了解固态硬盘的读写机制。我们知道,固态硬盘的存储单元是由闪存颗粒组成的,无法实现物理性的数据覆盖,只能擦除然后写入,重复这一过程。因而,我们可以想象得到,在实际读写过…...

[黑马程序员Pandas教程]——Pandas数据结构
目录: 学习目标认识Pandas中的数据结构和数据类型Series对象通过numpy.ndarray数组来创建通过list列表来创建使用字典或元组创建s对象在notebook中不写printSeries对象常用API布尔值列表获取Series对象中部分数据Series对象的运算DataFrame对象创建df对象DataFrame…...

AI 绘画 | Stable Diffusion 提示词
Prompts提示词简介 在Stable Diffusion中,Prompts是控制模型生成图像的关键输入参数。它们是一种文本提示,告诉模型应该生成什么样的图像。 Prompts可以是任何文本输入,包括描述图像的文本,如“一只橘色的短毛猫,坐在…...

tomcat默认最大线程数、等待队列长度、连接超时时间
tomcat默认最大线程数、等待队列长度、连接超时时间 tomcat的默认最大线程数是200,默认核心线程数(最小空闲线程数)是10。 在核心线程数满了之后,会直接启用最大线程数(和JDK线程池不一样,JDK线程池先使用工作队列再使用最大线程…...

本地部署 CogVLM
本地部署 CogVLM CogVLM 是什么CogVLM Github 地址部署 CogVLM启动 CogVLM CogVLM 是什么 CogVLM 是一个强大的开源视觉语言模型(VLM)。CogVLM-17B 拥有 100 亿视觉参数和 70 亿语言参数。 CogVLM-17B 在 10 个经典跨模态基准测试上取得了 SOTA 性能&am…...

bff层解决了什么痛点
bff层 -- 服务于前端的后端 什么是bff? Backend For Frontend(服务于前端的后端),也就是服务器设计API的时候会考虑前端的使用,并在服务端直接进行业务逻辑的处理,又称为用户体验适配器。BFF只是一种逻辑…...

面试经典150题——Day33
文章目录 一、题目二、题解 一、题目 76. Minimum Window Substring Given two strings s and t of lengths m and n respectively, return the minimum window substring of s such that every character in t (including duplicates) is included in the window. If there …...