博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何做好一个系统架构师:抓住敏捷架构中几个关键决策点
阅读量:7101 次
发布时间:2019-06-28

本文共 1861 字,大约阅读时间需要 6 分钟。

开发人员在任何软件项目过程中都会做出数百个微观和宏观决策。有些似乎相对无害,但对下游会有一个很大的影响。几位Cantina工程师聚在一起,回顾了我们在学习了一些艰苦的经理后需要特别考虑的关键点。

一、利益相关者要求


您作为架构师或系统设计师的首要任务几乎总是让所有必要的利益相关者尽快发现需求。

这些需求在项目的初始阶段可能是最难获得的。虽然这种担忧通常与看似最后一刻的审计和安全要求有关,但请记住上下文规则。

二、数据读/写伸缩平衡


在决定如何构建可伸缩Web应用程序时,关键的首要决策是了解数据存储可能需要的读写平衡:

  • 重型写:应用程序在扩展时会遇到一致性问题,因此应尽早注意模型的写入完成,数据分发和各种批处理过程。像Twitter和其他人这样的大量应用程序通常采用流式写入模式,将消息传递作为支持可伸缩写入语义的主干。利用发布/订阅(pub / sub)和Google Spanner等并发概念可以提供帮助。(还记得:日志和数据库只是彼此的对偶)。
  • 繁重读:此类应用程序可能是随着它们的增长而最容易扩展的。有许多开箱即用的技术可以促进这种模式,包括许多缓存机制,高性能键值存储以及MongoDB等流行存储系统的复制只读节点。

三、数据一致性


我们中没有一个人可以逃脱CAP定理!

但只有在出现系统故障,网络故障或其他无法满足三元组的分区(P)元素时才会发挥作用。在这种情况下,应用程序设计人员和架构师必须提出一个棘手而棘手的问题:这个产品可以更好地容忍哪些,一致性失败或可用性失败?

  • 一致性:如果您的应用程序可以同时访问不同节点的不同状态,那么一致性并不是最重要的。当向两个不同的用户显示社交媒体馈送时会出现这种情况,每个用户的结果略有不同。
  • 可用性:如果追求总是能返回结果,NoSQL运动的数据存储解决方案或实施BASE语义将是可行的选择。但是,如果同时为所有同时请求(想想金融交易,银行,证券交易所)提供正确和相同的答案也很重要,那么一致性是最重要的,最好不要返回错误的结果。这有时会产生昏昏欲睡的结果响应或锁定状态,但通常值得花费正确的响应。在这种模式中,具有ACID语义的传统关系数据库系统通常是应用程序设计的必要初始选择。

四、领域/数据模型


在考虑指定系统应该是什么业务领域时(参见域驱动设计),应该考虑系统的上下文 - 允许通过系统传递的非上下文固有的信息作为文档而不是作为领域模型的一部分。

例如,采用一个系统将天气数据返回给用户,但该系统也从另一个第三方服务获取该数据。

解决方案可能会寻求保持从第三方返回的数据,并将其领域复制为自己的领域。这将迫使架构管理一个更复杂的领域,该领域具有许多可能永远不会使用的关系,但必须随着时间的推移而维护。

通过将较小的关系数据库与文档存储相结合,它还将模糊改善数据访问性能和简单性的潜力。

像这样的问题可以通过端口和适配器等范例来解决。通过完全理解系统的领域而不包括领域环境不固有的信息,架构师能够做出能够极大地提高设计性能和可维护性的存储技术决策。

五、负载的可变性


在灾难或公共事件期间接收大量负载峰值的API(例如Facebook)将具有与从空气质量传感器接收预期的每小时度量标准的要求截然不同的要求。

利用可以有效计量请求的体系结构(队列,热表等)可以缓解这些问题中的一些问题。

如果数据一致性不是系统中最重要的问题(如前所述),那么复制数据系统可以帮助在请求进行负载平衡或智能路由时保持单一入口点的压力。

虽然无服务器计算提供了诸如内置扩展等显着优势,但它需要更多纯函数的无状态代码结构。对于新系统的绿地greenfield实施,这可能没问题,但迁移遗留系统可能是一个挑战。

读者福利

分享免费学习资料

针对于Java程序员,我这边准备免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

资料领取方式:加入Java技术交流群963944895,,私信管理员即可免费领取

转载于:https://juejin.im/post/5cce97ebf265da03502b4be0

你可能感兴趣的文章
.Net中GridView如何隐藏过长的内容显示
查看>>
R语言:ggplot2精细化绘图——以实用商业化图表绘图为例(转)
查看>>
BarTender中如何为称重设备设置秤显示?
查看>>
ls/cp/rm/mv/cat/whereis/locate/find
查看>>
Deployment的使用
查看>>
圆角 CSS
查看>>
vm12 安装ubuntu15.10详细图文教程 虚拟机安装ubuntu安装 ubuntu更新软件 ubuntu一直卡在下载语言怎么办?...
查看>>
你还有好多未完成的梦,怎么能够停下脚步
查看>>
php自动读取文件夹下所有图片
查看>>
js 获取checkbox选中项目
查看>>
VC6使用技巧
查看>>
文本报告生成工具gawk
查看>>
pdf文档如何转换成txt文档
查看>>
面向对象(OO)设计原则
查看>>
Python 字典的使用
查看>>
DELL32位诊断工具PEDIAGS使用
查看>>
产品经理的麻烦地图
查看>>
如何通过刷百度指数来提高网站的权重
查看>>
轻量级HTTP服务器Nginx(常用配置实例)
查看>>
FAT32文件系统
查看>>