世界上大多数的应用程序,可能有90%,都是由单体结构(monolithic)完美地提供服务的;Randy Shoup在Summit 2018年峰会上宣布,为了避免过度设计,我们应该从一个简单的架构开始,并根据需要进行演进。在他最近发表的演讲中,他描述了自己与在一些公司的项目经历,这些公司起初规模很小,后来发展成为大型全球性互联网公司,它们的架构在那段时间是如何演变的,以及他从IT的角度对新公司或新产品的建议。

Shoup曾在eBay、谷歌和Stitch Fix工作过,目前是WeWork技术副总裁。他的第一个例子是eBay,它于1995年作为一个为期三天的周末项目启动,目的不是验证商业概念(PoC),而是为了看看是否有可能在网上做一些有趣的事情。今天,它已经是第五次完全重写基础架构,Shoup将该公司描述为一个多语言的微服务集合,并补充说Twitter和亚马逊都经历了类似的演变。

从某种形式的单体结构(Monolith)开始,以一组微服务结束,这对于Shoup来说是大公司的一种常见模式,并注意到这一模式中有两个部分——(1)没有人从微服务开始;(2)超过一定的规模,每个系统都以微服务结束。

Shoup所提到的公司都非常庞大,在他们的规模下工作的架构对大多数公司来说是完全不合适的。大多数应用程序都是由单体结构提供服务的,Shoup在构建新应用程序或系统时的建议是,从简单的开始,并根据需要改进整个系统的体系结构。

对于大多数公司和产品来说,一个常见的进展曲线包括:(1)构思和开始阶段;(2)分布式系统可能相关的扩展阶段;(3)以及通常的优化阶段:

在构思及开始阶段,根本不应该有任何花哨的架构——这个时点最关键的是原型。为了避免过度设计,我们应该不断地问自己:“最想要解决的是什么问题?”这一阶段的目标是尽可能快地探索解决方案,并以最小的成本来实现:

  • 找到一种商业模式

  • 找到适合的产品市场

  • 获得第一批客户

在这一阶段,如果可能的话,不需要引入任何不必要的技术,例如使用谷歌广告来查看是否有人点击它,直接使用纸和笔或Excel电子表格就能解决大部分问题。

在构思及开始阶段时,目标是满足客户的短期需求,并尽可能地降低成本。通常这个阶段可以由一个4-6人组成的小团队来进行快速迭代,项目时间一般很短,大概3-4个月,快速的探索解决方案。此时,通常很难预见将来要构建什么特性,因此只需要很少的架构,就足以让我们快速前进。在这阶段考虑的不是伸缩性的,而是应该使用简单和熟悉的技术,并且绝对是单体架构——比如,一个应用程序和一个数据库。而且基础设施建议使用开发代价最小的,不要自己去构建;相反,可以使用平台即服务(PaaS)或类似的技术服务。

在这一点上使用单体架构的优势包括:

  • 简单快速,

  • 只有进程内延迟(注:没有服务间网络调用开销)

  • 简单的构建部署单元

  • 小规模上非常节约资源

除了缺乏可伸缩性和单点故障外,单体架构的一个主要缺点是在模块化方面不给力。但是在这个阶段,这些都不是关注的重点。尽管如此,有意识地在单体架构中使用组件或模块来遵守模块化原则,为了后续的扩展提前做准备是值得的,这将简化未来的服务拆分与系统重构。

什么时候需要重建这个庞然大物,以下是一些可供参考的征兆:

  • 交付速率:由于耦合和缺乏隔离,交付能力持续降低

  • 可扩展性:垂直扩展将不再起作用,或者系统的不同部分需要独立扩展

  • 部署:不同的模块以不同的速度在发展,因此需要独立的部署

当我们进入扩展阶段时,目标是领先于快速增长的业务,并保持应用程序正常运行。在组织环境中,这阶段通常会增加团队人员的数量,并在更长的时间范围内工作,通常还需要引入可重复的标准化流程(例如,开发流程、发布流程)。

在技术方面,扩展阶段通常意味着向可扩展的技术迁移。现在可以从整体上拆分单体服务,尝试减少单个数据库上的负载,例如创建一些数据的只读副本实现读写分离。按业务拆分服务(例如,支付和计费服务),并引入中间件、消息服务等。

这个阶段通常也是考虑是否应该将单体服务迁移到微服务的时候。此外还必须考虑存储,使用单点主存储是否仍然是存储数据的正确方法。在QCon纽约2017大会上,Shoup展示了如何将单体应用程序增量迁移到不同领域的微服务和多个独立存储机制。

在《可伸缩性的艺术》一书中,描述了一个三维可伸缩性模型(AKF Scale Cube),其中三个轴表示不同类型的可伸缩性:

  • X:水平复制和克隆

  • Y:功能分解和细分(微服务)

  • Z:水平数据分区(分片)

最后是优化阶段,如果达到这个阶段就是成功的标志。我们的目标是维持功能稳定,并且使用更少的资源以及更少的团队。这个阶段可能会有更长的时间跨度,比如2-5年。

总结:重新构建一个系统是成功的标志,而不是失败的标志。重构是由于业务发展的好,业务体量的增长对现有技术有了新的要求,而绝不是为了重构而重构。

原文作者:Jan Stenberg  译者:江玮

原文链接:

https://www.infoq.com/news/2019/01/rearchitecture-system-success?utm_source=infoq&utm_medium=popular_widget&utm_campaign=popular_content_list&utm_content=

版权声明:本文版权归作者(译者)及公众号所有,欢迎转载,但未经作者(译者)同意必须保留此段声明,且在文章页面明显位置给出,本文链接如有问题,可留言咨询。

转载于:https://www.cnblogs.com/davidwang456/p/10372986.html

增量架构方法与系统构建相关推荐

  1. Linux 之八 完整嵌入式 Linux 环境、(交叉)编译工具链、CPU 体系架构、嵌入式系统构建工具

      最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,由于之前对嵌入式 Linux 环境并不是很了解,因此,第一步就是需要了解如何搭建一个完整的嵌入式 Linux 环境.现在将学习心得记录 ...

  2. 微服务实战(五):落地微服务架构到直销系统(构建高性能大并发系统)

    在现代系统中,特别是互联网软件,通常会涉及到大量用户的并发访问,我们的系统一定要在架构上支持高性能.大并发的访问.一个高性能的系统通常由很多的方面组成,包括数据库高性能.Web服务器高性能.负载均衡. ...

  3. 根据个人亲身进阶架构师经历系统构建20大进阶架构师专题!

    本人经过自己的亲身进阶经历,打造的以下20大进阶架构专题!(纯个人!非培训机构网络学院的推广!),头条和简书的友链排版太差! [极简入门专题][dubbo实战专题][设计模式专题][dubbo源码专题 ...

  4. mysql剪标_一种数据库检索机制的构建方法及系统与流程

    本发明属于网络存储技术领域,尤其涉及一种数据库检索机制的构建方法及系统. 背景技术: 随着互联网技术的发展,云端整套的服务解决方案也在与时俱进.传统的KTV应用数据的落地和使用方案比较单调低效,缺乏先 ...

  5. PCB CS架构(工程系统)实现单点登入方法

    社会的不断进步发展,分工也越来越细了.而我们工作接触的范围也越来越狭小了,但这不是倒退了,而是分工之细让人们在各个方面深耕细作.PCB企业软件系统发展路线同样也如此,随着我们PCB企业发展不断壮大,软 ...

  6. 百信银行架构解密:如何构建全云系统

    这几天,百信银行首度公开了技术架构,信息量非常大.这是我国第一家具有独立法人代表的直销银行,也是一家纯粹将业务构架在云上的互联网公司,还是一家正在利用AI构建智慧大脑的金融机构. 尽管云计算谈论多年, ...

  7. python构建知识图谱_一种构建知识图谱的方法及系统与流程

    本发明涉及计算机领域,具体涉及一种构建知识图谱的方法及系统. 背景技术: 随着人工智能技术的不断发展,智能机器人被越来越多的应用于人类的生产生活当中. 在智能机器人与人类的交互过程中,为了提高智能机器 ...

  8. 如何在cocos2d-x中使用ECS(实体-组件-系统)架构方法开发一个游戏?

    引言 在我的博客中,我曾经翻译了几篇关于ECS的文章.这些文章都是来自于Game Development网站.如果你对这个架构方式还不是很了解的话,欢迎阅读理解 组件-实体-系统和实现 组件-实体-系 ...

  9. 在微服务架构下基于 Prometheus 构建一体化监控平台的最佳实践

    欢迎关注方志朋的博客,回复"666"获面试宝典 随着 Prometheus 逐渐成为云原生时代的可观测事实标准,那么今天为大家带来在微服务架构下基于 Prometheus 构建一体 ...

最新文章

  1. 2020卫星参数表大全_王者荣耀比较秀的名字 2020年比较骚气比较浪的王者荣耀名字大全...
  2. R语言ggplot2可视化:使用R原生plot函数为指定曲线下面的区域着色、ggplot2可视化在曲线的特定下方添加分割线、ggplot2为指定曲线下面的区域着色
  3. mysql批量插入:语法
  4. php post登陆 json,php 之 post json 数据
  5. 使用ADF绑定创建视图对象行CreateInsert操作
  6. android中ActionBar的几个属性
  7. jJMeter UDP Request:不等待服务器响应
  8. C/C++的思索 C++之父访谈录
  9. Docker运行tensorflow试试
  10. 【华为云实战开发】15.Maven依赖的JAR包下载慢?赶紧看过来
  11. memcached php封装类,PHP Memcached + APC + 文件缓存封装_PHP - key
  12. Java的GUI学习十二(文件的打开和保存)
  13. php正则表达式替换ubb,自定义ubb代码,preg_replace()函数的一些代码
  14. 优化算法(一)SGD算法实现
  15. 主从表mysql外键_主从表主键外键
  16. 深入理解搜索引擎-排序算法
  17. linux 内核网络中 RPS/RFS 原理Ⅱ
  18. Linux(入门基础):85---Linux单一计划任务(at服务、at、atq、atrm、batch命令)
  19. [上海博物馆全集列表]
  20. opencv 矩阵行列求和

热门文章

  1. html如何将段落对齐,如何用CSS设置段落的垂直对齐(附代码)
  2. c语言双链表是什么意思,双链表的表示和实现(C语言)
  3. mysql分析表锁,MySQL锁分析和监控
  4. html 文件上传与移除,js jquery分别实现动态的文件上传操作按钮的添加和删除
  5. python资源管理错误漏洞_国家信息安全漏洞库
  6. Qt工程pro文件配置详解
  7. 北京数码视讯s905l固件_神州数码与MAXHUB构建更紧密的伙伴关系,共同开启可持续发展之旅...
  8. android 分段显示百分比,按百分比设置排名-Android DisplayMetrics
  9. win10 mysql5.5无响应_Win10安装mysql5.5安装最后一步停住卡死未响应的解决方法
  10. hbase把表删除后又新建该表提示表已存在,解决方案