聊聊架构方案选择

news2025/1/12 12:16:51

大家好,我是易安!

在完成备选方案设计后,如何挑选最终的方案是一个很大的挑战,因为每个备选方案都是可行的。但是,没有哪个备选方案是完美的,因为每个方案都存在一些缺点或风险。此外,评价备选方案的标准也具有一定的主观性,可能会导致设计师之间产生争论。

因此,在实践中,许多设计师或架构师采取了下面几种指导思想来选择备选方案:

  • 易用型

设计师挑选一个看起来最简单、最容易实现的方案。例如,如果要做全文搜索功能,MySQL的查询功能比较简单,而Elasticsearch的倒排索引设计要复杂得多,所以可能会选择MySQL。

  • 高端型

高端型的做法与易用型正好相反,设计师会倾向于选择技术上看起来最牛的方案。例如,如果要选择一个搭配MySQL使用的缓存,可能会选择Redis,因为它支持持久化、数据字典、主备、集群等功能。

  • 经验型

设计师基于自己的过往经验,选择自己最熟悉的方案。例如,如果设计师曾经是一个C++经验丰富的开发人员,现在要设计一个运维管理系统,因为对Python或Ruby on Rails不熟悉,可能会继续选择C++来做运维管理系统。

  • 统筹规划型

统筹规划型,就是让老板来决定最终方案。这种做法可能会让设计师自己拿捏不定,但最终的责任会由领导来承担。

不同的做法本身并不存在绝对的正确或者绝对的错误,关键是要根据不同的场景选择不同的方式。有时候要选择最简单的方案,有时候要选择最优秀的方案,有时候要选择最熟悉的方案,甚至有时候需要领导来拍板。因此,关键问题是如何判断何时采用这些不同的选择方式。在架构设计流程的第3步:评估和选择备选方案中,选择备选方案的方法应该根据具体场景和实际情况进行评估和决策。

方案评估

在评估和选择备选方案时,我们应该采用全方位评估的方法。具体来说,我们需要列出我们需要关注的质量属性点,并从这些质量属性的维度去评估每个备选方案,再综合挑选适合当时情况的最优方案。

常见的方案质量属性点包括性能、可用性、硬件成本、项目投入、复杂度、安全性、可扩展性等。在评估这些质量属性时,需要遵循架构设计原则1“合适原则”和原则2“简单原则”,避免贪大求全,基本上某个质量属性能够满足一定时期内业务发展就可以了。

例如,在设计一个购物网站时,如果我们预期1年内能够发展到TPS 2000(业务一年翻倍已经是很好的情况了),在评估方案的性能时,只要能超过2000的都是合适的方案,而不是按照淘宝的标准要实现TPS 10万。

在评估未来业务发展的规模时,需要考虑架构设计原则3“演化原则”,避免过度设计、一步到位的想法。即使出现业务迅猛发展,也要遵循这个原则,尽可能让系统能够简单地扩容来跟上业务的发展。

通常情况下,如果某个质量属性评估和业务发展有关系(例如,性能、硬件成本等),可以通过将当前的业务规模乘以2 ~4来评估未来的业务发展规模。例如,现在的TPS是1000,则按照TPS 4000来设计方案;如果现在TPS是10000,则按照TPS 20000来设计方案。

完成方案的360度环评后,我们可以基于评估结果整理出360度环评表,一目了然地看到各个备选方案的优劣点。但是360度环评表也只能帮助我们分析各个备选方案,还是没有告诉我们具体选哪个方案。因为没有哪个方案是完美的,不同备选方案之间的差异要比较明显,差异明显的备选方案不可能所有的优缺点都是一样的。

如何选择备选方案

面临多个备选方案的选择时,我们应该按照优先级选择备选方案。即综合当前的业务发展情况、团队人员规模和技能、业务发展预测等因素,按照优先级选择,即架构师综合当前的业务发展情况、团队人员规模和技能、业务发展预测等因素,将质量属性按照优先级排序,首先挑选满足第一优先级的,如果方案都满足,那就再看第二优先级,以此类推。

有时候会出现两个或者多个方案,每个质量属性的优缺点都一样的情况。理论上是可能的,但实际上不太可能。因为在备选方案设计时,不同的备选方案之间的差异要比较明显,差异明显的备选方案不可能所有的优缺点都是一样的。

实战

备选方案评审会议

以之前讲过的微博系统设计为例,针对提出的3个备选方案,架构师组织了备选方案评审会议,参加的人有研发、测试、运维和几个核心业务的主管。

备选方案1:采用开源Kafka方案

  • 业务主管意见: 倾向于采用Kafka方案,因为Kafka已经比较成熟,各个业务团队或多或少都了解过Kafka。
  • 中间件团队意见: 部分研发人员支持使用Kafka,因为使用Kafka能节省大量的开发投入;但部分人员认为Kafka可能并不适合我们的业务场景,因为Kafka的设计目的是为了支撑大容量的日志消息传输,而我们的消息队列是为了业务数据的可靠传输。
  • 运维代表意见: 提出强烈反对意见。首先,Kafka是Scala语言编写的,运维团队没有维护Scala语言开发的系统的经验,出问题后很难快速处理;其次,目前运维团队已经有一套成熟的运维体系,包括部署、监控、应急等,使用Kafka无法融入这套体系,需要单独投入运维人力。
  • 测试代表意见: 倾向于引入Kafka,因为Kafka比较成熟,无须太多测试投入。

备选方案2:集群 + MySQL存储

  • 中间件团队意见: 部分研发人员认为这个方案比较简单,但部分研发人员认为使用MySQL来存储消息数据,性能肯定不如使用文件系统;并且有的研发人员担心做这样的方案是否会影响中间件团队的技术声誉,看起来比较“土”、比较另类。
  • 运维代表意见: 赞同这个方案,因为这个方案可以融入到现有的运维体系中,而且使用MySQL存储数据,可靠性有保证,运维团队也有丰富的MySQL运维经验。但运维团队认为这个方案的成本比较高,一个数据分组就需要4台机器(2台服务器 + 2台数据库)。
  • 测试代表意见: 认为这个方案测试人力投入较大,包括功能测试、性能
  • 测试、可靠性测试等都需要大量地投入人力。
  • 业务主管意见: 既不肯定也不否定,因为反正都不是业务团队来投入人力来开发,系统维护也是中间件团队负责,对业务团队来说,只要保证消息队列系统稳定和可靠即可。

备选方案3:集群 + 自研存储系统

  • 中间件团队意见: 部分研发人员认为这是一个很好的方案,既能够展现中间件团队的技术实力,性能上相比MySQL也要高;但另外的研发人员认为这个方案复杂度太高,按照目前的团队人力和技术实力,要做到稳定可靠的存储系统,需要耗时较长的迭代,这个过程中消息队列系统可能因为存储出现严重问题,例如文件损坏导致丢失大量数据。
  • 运维代表意见: 不太赞成这个方案,因为运维之前遇到过几次类似的存储系统故障导致数据丢失的问题,损失惨重。例如,MongoDB丢数据、Tokyo Tyrant丢数据无法恢复等。运维团队并不相信目前的中间件团队的技术实力足以支撑自己研发一个存储系统。
  • 测试代表意见: 赞同运维代表的意见,并且自研存储系统的测试难度也很高,投入也很大。
  • 业务主管意见: 持保留意见,因为从历史经验来看,新系统上线肯定有bug,而存储系统出bug是最严重的,一旦出bug导致大量消息丢失,对系统的影响会严重。

以上备选方案的评审意见都有利有弊,因此在架构设计流程的第3步:评估和选择备选方案中,需要对这些意见进行综合考虑,权衡各自的利弊,并根据实际情况选择最优方案。在选择备选方案时,应该根据具体的场景和需求,选择最适合自己的方案,而不是盲目追求某一种派别的方案。

针对3个备选方案的讨论初步完成后,架构师列出了3个方案的全方位评估表:

alt

列出这个表格后,无法一眼看出具体哪个方案更合适,于是大家都把目光投向架构师,决策的压力现在集中在架构师身上了。

架构师经过思考后,给出了最终选择备选方案2,原因有:

  • 排除备选方案1的主要原因是可运维性,因为再成熟的系统,上线后都可能出问题,如果出问题无法快速解决,则无法满足业务的需求;并且Kafka的主要设计目标是高性能日志传输,而我们的消息队列设计的主要目标是业务消息的可靠传输。

  • 排除备选方案3的主要原因是复杂度,目前团队技术实力和人员规模(总共6人,还有其他中间件系统需要开发和维护)无法支撑自研存储系统(参考架构设计原则2:简单原则)。

  • 备选方案2的优点就是复杂度不高,也可以很好地融入现有运维体系,可靠性也有保障。

针对备选方案2的缺点,架构师解释是:

  • 备选方案2的第一个缺点是性能,业务目前需要的性能并不是非常高,方案2能够满足,即使后面性能需求增加,方案2的数据分组方案也能够平行扩展进行支撑(参考架构设计原则3:演化原则)。

  • 备选方案2的第二个缺点是成本,一个分组就需要4台机器,支撑目前的业务需求可能需要12台服务器,但实际上备机(包括服务器和数据库)主要用作备份,可以和其他系统并行部署在同一台机器上。

  • 备选方案2的第三个缺点是技术上看起来并不很优越,但我们的设计目的不是为了证明自己(参考架构设计原则1:合适原则),而是更快更好地满足业务需求。

最后,大家针对一些细节再次讨论后,确定了选择备选方案2。

通过微博这个案例我们可以看出,备选方案的选择和很多因素相关,并不单单考虑性能高低、技术是否优越这些纯技术因素。业务的需求特点、运维团队的经验、已有的技术体系、团队人员的技术水平都会影响备选方案的选择。因此,同样是上述3个备选方案,有的团队会选择引入Kafka(例如,很多创业公司的初创团队,人手不够,需要快速上线支撑业务),有的会选择自研存储系统(例如,阿里开发了RocketMQ,人多力量大,业务复杂是主要原因)。

总结

备选方案评估和选择是架构师工作的一个重要方面。架构师需要根据当前业务的实际情况,对备选方案进行全方位的评估,从各个质量属性的维度去评估每个方案,再综合挑选适合当时情况的最优方案。在评估备选方案时,需要遵循架构设计原则1“合适原则”和原则2“简单原则”,避免贪大求全,基本上某个质量属性能够满足一定时期内业务发展就可以了。同时也要遵循原则3“演化原则”,避免过度设计,一步到位的想法。最后,在选择备选方案时,需要按照质量属性的优先级排序,逐个选择最适合的方案。

总之,备选方案评估和选择是一个全方位的过程,需要综合考虑多方面的因素。只有在评估和选择过程中遵循合适原则、简单原则和演化原则,并按照优先级逐个选择最适合的方案,才能设计出高质量、可扩展、易维护、高性能的系统架构。

如果本文对你有帮助的话,欢迎点赞分享,这对我继续分享&创作优质文章非常重要。感谢 !

本文由 mdnice 多平台发布

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

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

相关文章

薅!无魔法无限量GPT-4安卓App安装包;Notion AI从入门到精通;最全大模型进展汇总;雇AI给我打零工 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 『大模型进展汇总 (持续更新至4月17日)』应该是最全总结了吧 ShowMeAI资料编号 No.T001 (进入社群获取高清PDF文件&#x…

AI已经解锁自动化能力 | 颠覆商业模式和劳动力市场

AI已经解锁自动化能力,将颠覆商业模式和劳动力市场。目前AutoGPT的开源项目: BabyAGI、Auto-GPT、AgentGPT、TeenagerAGI、Jarvis。 AutoGPT原理: 3个GPT4协同合作,一个GPT4负责分解目标创建任务,另一个GPT4负责分配…

面试必问的CAS原理你会了吗?

目录 一、什么是CAS? 二、CAS 基本原理 三、CAS 在 Java 语言中的应用 四、CAS 的问题 1、典型 ABA 问题 2、自旋开销问题 3、只能保证单个变量的原子性 五、有态度的总结 在并发编程中我们都知道i操作是非线程安全的,这是因为 i操作不是原子操作…

Jmeter常用断言之XPath断言

一般情况下,使用响应断言和json断言即可满足绝大部分断言需求,Xpath断言主要适用于:返回的数据格式为html或xml。 XPath是W3C的一个标准。XPath是一种表达式语言,它使用路径表达式来选取 XML 文档中的节点或节点集。XPath断言和XP…

Linux中jar包的启动脚本解析及问题

搭建运行环境时,把jar包打好外,我们还需要一个启动脚本,新建一个文件start.sh,内容如下: ps -ef | grep dvmrms | grep -v grep | awk {print $2} | xargs kill -9nohup java -jar dvmrms.jar >/dev/null 2>&1 &sl…

leetcode876.链表的中间节点

个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【LeetCode】 目录题目链接解法1:快慢指针解题代码题目链接 题目链接 解法1:快慢指针 解法一:快慢指…

opencv实践项目-修改表格缺失轮廓

目录 1. 背景2. 修复步骤2.1 图像灰度化,并进行高斯模糊2.2 对图像进行阀值处理2.3 查找轮廓2.4 利用存储的值了解表格的位置2.5 提取所有的水平线和垂直线2.6 合并垂直和水平的两个模版 3. 完整代码 1. 背景 如果大家在输入图像时,看到的第二行中的单元…

Laravel使用JWT

开始安装jwt (本次安装不建议直接在项目中安装及使用) 1.composer 安装jwt composer require tymon/jwt-auth 1.0.0-rc.1 2.在config 文件夹的app.php 中注册服务提供者 providers > [Tymon\JWTAuth\Providers\LaravelServiceProvider::class, ]…

计算机网络考试复习——第一章 1.5 1.6

1.5 计算机网络的类别 1.5.1计算机网络的定义: 系统集合,连接起来,协议工作,资源共享 计算机网络主要是由一些通用的、可编程的硬件互连而成的,而这些硬件并非专门用来实现某一特定目的(例如&#xff0…

【Linux问题处理】Aborted (core dumped)报错python

文章目录一、命令检查1.python执行py文件2.gdb执行py文件二、进程检查1.检查所有python程序2.使用gdb检查进程三、core文件检查1.开启core文件存储能力2.core文件存储位置3.gbd查看core文件首先需要在ubuntu系统安装gdb工具。 sudo apt-get install gdbgdb是c的工具&#xff0…

SSM框架整合流程与原理解读(附源码链接)

本文参考黑马教程,对 MyBatis、Spring、SpringMVC 三个框架进行逐步整合,并对整合后事务失效原因进行总结。 源码链接:https://download.csdn.net/download/weixin_43819566/87690821 文章目录 一、搭建整合环境1.1 整合项目说明1.2 整合的思…

通过KNN分类模型预测股票涨跌,然后与基准收益画图对比

目录 1 获取数据 2 特征工程:定义一个用于分类的函数 3 特征工程:生成训练数据 4 根据训练数据对分类模型进行拟合,并给出得分 5 使用训练完成的分类模型进行数据预测 6 定义几个有用的函数 7 生成基准收益和策略收益对比结果 记录一下…

排序算法——快速排序(C语言多种实现及其优化策略)

快速排序总述快速排序递归框架单趟快速排序**hoare法****挖坑法**前后指针法快排改进key的选取**随机选key****三数取中**小区间优化**面对多个重复数据时的乏力**总述 快速排序可以说是排序界的大哥的存在,在c库中的qsort和c库中的sort两个排序底层都是用快速排序…

常用运放电路总结记录

前言 上一篇文章我们复习了一下运放的基本知识,尽量的用简单的描述带大家去理解运算放大器: 带你理解运算放大器 对于运放的使用,存在着一些经典常用的应用电路,这个其实网络上已经有大量的文章做记录总结了,作为电…

【Elastic (ELK) Stack 实战教程】11、使用 ElastAlert 实现 ES 钉钉群日志告警

目录 一、ElastAlert 概述 二、安装 ElastAlert 2.1 安装依赖 2.2 安装 Python 环境 2.3 安装 ElastAlert 2.4 ElastAlert 配置文件 2.5 创建 ElastAlert 索引 2.6 测试告警配置是否正常 三、ElastAlert 集成钉钉 3.1 下载 ElastAlert 钉钉报警插件 3.2 创建钉钉机器…

【硬件外设使用】——can

【硬件外设使用】——can can基本概念can 通讯can使用方法pyb.can can可用的传感器 can基本概念 CAN是Controller Area Network的缩写,即控制器局域网。它是一种多主机串行通信协议,用于连接计算机、传感器、执行器和其他设备。 常用于汽车、工业自动化…

如何在不丢失数据的情况下重装Windows 10?

为什么需要重新安装Windows 10? 随着时间的推移,Windows可能会变慢。这可能是由多种原因引起的,例如您安装了许多额外的启动程序,这些程序会延长启动过程等。如果您的Windows系统速度变慢并且无论您卸载多少程序都没有加速&…

CodeGeeX论文发表:揭秘AI辅助编程工具背后的大模型

近日,CodeGeeX模型迭代v1.5版本上线,用户反馈模型效果和使用效率较之前有大幅提升。 恰逢CodeGeeX团队在arxiv上发布了论文,详细介绍了CodeGeeX AI编程辅助工具背后的代码生成大模型的架构、训练过程及推理加速等工作。 今天我们对这篇论文的…

【从零开始学Skynet】实战篇《球球大作战》(三):封装常用的API

为什么要封装?封装可以减少一些重复代码,提高我们的工作效率。 1、定义属性 新建文件lualib/service.lua,定义模块的属性, service模块是对Skynet服务的一种封装,代码如下所示: local skynet require &qu…

Linux 下编译 thrift

thrift编译需要依赖 openssl,首先按照文章《Openssl在Linux下编译/交叉编译》编译openssl。 网上有文章说thrift编译还需要依赖Boost,libevent,但是我发现不依赖这两个库也能把thrift编译出来。在 https://github.com/apache/thrift/releases…