文档章节

康威定律——这个50年前就被提出的微服务概念,你知多少?

数人云
 数人云
发布于 2017/09/11 19:00
字数 2877
阅读 1323
收藏 47
点赞 6
评论 6

概述

微服务架构是一种非常流行的新概念,即便可供以借鉴的经验比较少,当然不能阻挡它成为热门话题与研究对象。

令人惊讶地是,其实微服务的概念早在五十多年前就已经被提出,多年来,很久研究表明了这些观点的准确性。这就是本文所介绍的——康威定律。现在已经有很多企业正在尝试使用它创建高效的微服务架构。

image

在这篇文章中最有名的一句话莫过于:

设计系统的企业受限于生产设计,这些设计是企业沟通结构的副本——Melvin Conway(1967)。

这意味着设计系统的企业,它们生产的设计等同于企业内的沟通结构。下图说明了此概念:

image

该图展现了企业现有沟通结构,简单地说:企业结构等于系统设计。

作者这里提到的系统并不局限于应用系统,据说这篇文章最初投稿于哈佛商业评论,但被拒绝,因此康威将其提交到了一个编程杂志,所以被误解为只针对应用开发,起初,作者并没有把这种理论作为定律,只是描述了发现和结论,不过著名的《The Mythical Man-Month》一书介绍了Brooks的理论,并引用了康威的一些观点,于是康威的理论被推崇成为我们现在所熟知的康威定律。

康威定律详细介绍

在文章中,Mike Amundesn总结了一些核心观点:

  • 第一定律:企业沟通方式会通过系统设计表达出来

  • 第二定律:再多的时间也没办法让任务完美至极,但总有时间能将它完成

  • 第三定律:线型系统和线型组织架构间有潜在的异质同态特性

  • 第四定律:大系统比小系统更适用于任务分解

〓 康威第一定律

“人类是复杂的社会动物。”

其他领域也提供了一些关于沟通和系统设计之间紧密关系的例证,对于一个复杂的系统,设计主题总会涉及到人们之间的交流,一个好的系统设计能解决这种沟通问题,很多老程序员都读过《The Mythical Man-Month》,里面的一些观点都是这句话的佐证。

image

《The Mythical Man-Month》 这本书里有一句令人难忘的话:在应用项目后期加大人员的投资,会更加拖慢它的速度。——Fred Brooks(1975)

增加开发者的数量以跟上紧凑的进度是许多企业常见的问题,虽然增加劳动以达到增加产出的目的是有意义的,但在沟通成本上也会大大增加——随着项目或企业中的人员数量增加,沟通成本成指数级增长,它可以通过公式n(n-1)/2来计算,而项目管理算法的复杂度是O(N 2),下面的例子说明了沟通成本的概念:

  • 5人团队,需要沟通的渠道是 5*(5–1)/2 = 10
  • 15人团队,需要沟通的渠道是15*(15–1)/2 = 105
  • 50人团队,需要沟通的渠道是50*(50–1)/2 = 1,225
  • 150人团队,需要沟通的渠道是150*(150–1)/2 = 11,175

这也就是互联网创业公司一般都比较小的原因,如果创业公司有太多的员工,Boos向每个人介绍自己的想法,那么风投估计也快花完了。

生物学家Dunbar在1992年提出了一个名为Dunbar Number的理论:灵长类动物的大脑容量与它的族群大小有关,然后推论出一些人类大脑能够维持的关系数量,例如,一个典型的人会有:

  • 5个死党
  • 15个信任的朋友
  • 35个一般的朋友
  • 150个只打过照面的朋友

image

所以它们与上面提到的沟通成本有关,大脑只能维持这么多的关系(在开发团队中,这个数字可能更小)。

沟通的问题会影响系统设计,进而影响整个系统的开发效率以及最终结果。

〓 康威第二定律

罗马不是一天建成的,学会先解决首要问题。

敏捷开发巨头之一Erik Hollnagel 在他的书中阐述了类似的观点:

问题太复杂?那么不妨忽略不必要的细节。

没有足够的资源?放弃无用的功能。

——Erik Hollnagel(2009)

image

系统的复杂性、功能数量、市场竞争以及投资人的期望值都在增加,而人的智力是有上限的,没有企业能说一定能找到合适的人,对于一个极其复杂的系统,总会有考虑不周全的地方,Erik认为这个问题最好的解决办法就是:不去管它。

在日常开发任务汇总会遇到一些问题如,产品经理提出的要求是否过于复杂?如果是,首先关注那些主要的需求,忽略次要的需求,产品经理的需求太多了?那就放弃一些功能。

据称,Erik曾收到一家航空公司的顾问邀请,保证飞行系统的稳定性和安全性,他相信通过两种方式可以确保安全性:

  • 常规安全:必须检测和消除尽可能多的错误
  • 非常规安全:若出现错误,要及时处理,最快恢复服务

对于像飞行系统这样复杂的系统,不管测试人员的业务多么纯熟,也会忽略一些漏洞,因此Erik建议公司放弃建立一个完美系统的想法,尽量去保证安全和正确性,通过不断地飞行测试,去识别安全问题,确保系统能够在出现故障时自动回复,下图显示了安全的不同解释。

image

听起来是不是很熟悉?没错,这就是我们常说的持续集成和敏捷开发的概念。

而这个原则与互联网公司维护的分布式系统弹性设计也相同,即使单元测试覆盖整个系统,也不不可能识别和修复分布式系统中所有的缺陷,分布式系统很容易出现错误,最佳解决方案不是消除所有问题,而是允许它们存在,在发生故障时实现自动恢复。

在由微服务组成的系统中,每个微服务都可能停止响应,这是完全正常的,只需要确保足够的冗余和备份,这就是弹性或高可用性设计。

〓 康威第三定律

创建独立的子系统,减少沟通成本。

image

上图代表了第一定律的团队和系统设计之间的内部关系具体应用,简单地说,需要建立一个适合自身系统的团队,如果有一个前端团队、Java后端开发团队、DBA团队和O&M团队,那么系统将会如下图:

image

相反,如果系统是以业务边界划分的,按照业务目标去构建小的系统或产品,整体系统将会如下图所示,即微服务架构:

image

团队中微服务的理念应是Inter-Operate,而不是Integrate ,Inter-Operate是指定义系统边界和接口,并为整个团队提供完整的堆栈,实现完全的自制。如此就能降低系统间的依赖性,减少通信成本。

〓 康威第四定律

前面提到,人类是复杂的社会动物,人与人之间的交流是非常复杂的,当涉及到一个系统时,人们经常选择增加人力去减少复杂性,对于企业来说,该如何处理这样的沟通问题?答案是:分而治之。

看看公司内,一名经理管理的员工一般少于15个,二三线经理管理的员工要更少,因此,大企业通常会将团队拆成一个个小团队或部门减少沟通成本及管理的问题,有一些需要考虑的场景:

  • 创业的项目很好,拿到一大笔风投,再招募更多的程序员
  • 人员太多,需要找几个经理进行管理
  • 康威定律好告诉我们,可以从系统设计中看出组织通信的模式,每个经理要对大系统的某一小部分负责,通过这种方式,它们和更大的系统间沟通有了便捷,因此大的系统也会被拆分成一个个小系统。(微服务可以更好地服务于此)。

〓 康威定律与微服务

再来看一下康威定律是如何在半个世纪前就奠定了微服务理论基础的。

  • 人与人之间的交流很复杂,每个人的精力是有限的,因此当问题很复杂,需要协调地去解决时,需要将组织划分进而提高沟通效率。

  • 团队成员工作的系统设计依赖于成员之间的沟通,管理人员可以调整划分模式,实现团队之间的不同沟通方式,这也会影响系统的设计。

  • 如果子系统有清晰的外部通信便捷,那么就可以有效地降低通信成本,响应地设计将更加适合和有效。

  • 需要不断优化一个复杂的系统,并容错性和故障恢复率的帮助下进行优化,不要期望大而全面的设计或架构,因为它们的开发以迭代的方式发生。

以下是一些具体的实践建议:

  • 利用一切手段提高通信效率,如Slack、Github和Wiki,且只与相关人员进行沟通,每个人和每个系统必须有明确的职责,在遇到问题时,知道该找谁去解决。

  • 在MVP模式下设计一套系统,以迭代的方式优化及验证,并确保系统的弹性。

  • 采用与系统设计相一致的团队,以扁平化和以业务为基准的方式去简化团队,每个小团队之间必须有对应负责的模块,避免模糊的界限,以免在发生问题时互相推卸责任。

  • 要做小而美的团队,人员数量的增加会降低效率以及加大成本,亚马逊CEO Jeff Bezos有个一个经验法则:如果两个披萨对于一个团队来说不够,那么这个团队就太大了。一般来说,一家互联网公司的产品团队由7到8个人组成(包括前端和后端测试、交互和用户体验师,一些人可能身兼数职)。

在查看以下微服务标准时,我们可以很容易地看到微服务与康威定律之间的密切关系:

  • 由分布式服务组成的系统
  • 企业部门的业务线
  • 开发优秀的产品
  • Smart endpoints and dumb pipes
  • DevOps
  • 容错
  • 快速发展

原文作者: 云栖团队博客 原文链接:http://www.tuicool.com/articles/3MF7BnV

© 著作权归作者所有

共有 人打赏支持
数人云
粉丝 16
博文 101
码字总数 328110
作品 0
朝阳
架构师
加载中

评论(6)

GKTest
GKTest
好东西
clouddyy
clouddyy
好文!收藏
请点赞
请点赞
确实有很多先进的概念在很早之前就有人提出来,但局限于当时的环境不被重视,现在重拾起旧概念。请点赞
开源中国首席PHP宣传专家
开源中国首席PHP宣传专家
这个定律描述的是啥意思?
piyoma
piyoma
扯淡了吧 又在黑微软
伊人梦醉
伊人梦醉
这个很赞
微服务架构的理论基础 - 康威定律

概述 关于微服务的介绍,可以参考微服务那点事。 微服务是最近非常火热的新概念,大家都在追,也都觉得很对,但是似乎没有很充足的理论基础说明这是正确的,给人的感觉是 不明觉厉 。前段时间...

⋅ 2017/12/11 ⋅ 0

程序员你为什么这么累【续】:编码习惯之配置规范

程序员你为什么这么累【续】:编码习惯之配置规范 程序猿DD | 博客2017-09-095 阅读 配置编码程序员 导读: 程序员你为什么这么累? 我的编码习惯 - 接口定义 我的编码习惯 - Controller规范 ...

程序猿DD | 博客 ⋅ 2017/09/09 ⋅ 0

活动干货|基于Docker的DevOps实现

作者:精灵云 众所周知,传统开发模式已经面临了诸多难题。首先,在代码集成方面,因为没有合适粒度的代码合并,大规模的合并会有很大的风险,且传统开发模式中没有自动化测试,以至于测试周...

精灵云 ⋅ 2017/03/16 ⋅ 0

微服务化改造

1 写在前面 背景技术圈流行一句话,凡脱离业务谈架构的,都是耍流氓。作为微服务改造系列的第一篇博客,首先介绍一下实施这次技术改造的背景。 第一,我所在公司(简称XR)的后台服务采用的主...

English0523 ⋅ 01/12 ⋅ 0

当DDD遇上微服务

DDD与微服务是可以相通的,其关键在于Bounded Context。 分布式系统的定义 在谈论这个之前,我们需要就什么是分布式系统达成一致。在我看来,判断一个系统是否是分布式的,其标准是看系统中是...

技术小能手 ⋅ 2017/12/22 ⋅ 0

广州站|一场36小时的集中脑爆式Docker培训课程

Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotCloud公司。Docker自开源后就受到广泛的关注和讨论,目前已有多个相关项目,逐渐形成了围绕Docker的生态体系。dotClou...

DockOne ⋅ 2016/11/10 ⋅ 0

网易容器云平台的微服务化实践

摘要:网易云容器平台期望能给实施了微服务架构的团队提供完整的解决方案和闭环的用户体验,为此从 2016 年开始,我们容器服务团队内部率先开始进行 dogfooding 实践,看看容器云平台能不能支...

fl63zv9zou86950w ⋅ 2017/12/15 ⋅ 0

组件化、模块化、集中式、分布式、服务化、面向服务的架构、微服务架构概念介绍

最近最火的词是什么?那大概就是微服务()了。最近也火的一踏糊涂的Docker、AppOps也都是围绕着微服务领域的。在微服务领域还有很多相关名词。这些名词有一个共同的特点那就是晦涩难懂。他们...

狼行-狼行 ⋅ 03/27 ⋅ 0

【docker&spring cloud】微服务化改造

微服务化改造系列之一:总览 1 写在前面 背景 技术圈流行一句话,凡脱离业务谈架构的,都是耍流氓。作为微服务改造系列的第一篇博客,首先介绍一下实施这次技术改造的背景。 第一,我所在公司...

English0523 ⋅ 01/12 ⋅ 0

单体式应用向微服务架构迁移实践经验

1、这些都是推动微服务诞生的重要因素 2、领域驱动设计指导我们如何分析并模型化复杂的业务 3、敏捷方法论帮助我们消除浪费,快速反馈; 4、持续交付促使我们构建更快、更可靠、更频繁的软件...

0了凡0 ⋅ 2015/12/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud构建微服务架构—创建“服务注册中心”

创建一个基础的Spring Boot工程,命名为eureka-server,并在pom.xml中引入需要的依赖内容: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-par......

itcloud ⋅ 21分钟前 ⋅ 0

拖动

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>event</title> <style> #box { width: 100px; height: 100px; background-color: aquamarine; position: absolute; } </style......

fyliujj ⋅ 23分钟前 ⋅ 0

es6 polyfill array

polyfill之javascript函数的兼容写法——Array篇 1. Array.isArray(obj) if (!Array.isArray) { Array.isArray = function(arg) { return Object.prototype.toString.call(arg) === '[objec......

球球 ⋅ 25分钟前 ⋅ 0

kibana启动异常

检查一下:kibana.yml 每一对key:value中,冒号之后应有空格。

增删改查1 ⋅ 27分钟前 ⋅ 0

js修改img的src属性刷新图片时的图片缓存问题

问题:上传一张图片,通过js更新src属性刷新图片使其即时显示时, 当img的src当前的url与上次地址无变化时(只更改图片,名称不变,不同图片名称相同)图片不变化(仍显示原来的图片) 但通过...

HaierBrother ⋅ 27分钟前 ⋅ 0

Mysql

1.Jdbc Url 设置allowMultiQueries为true和false mysql的批量更新是要我们主动去设置的, 就是在数据库的连接url上设置一下,加上* &allowMultiQueries=true *即可。 参数名称 参数说明 缺省...

瑟青豆 ⋅ 31分钟前 ⋅ 0

mysql导出导入表结构与数据

当我们需要进行数据迁移时,mysql自带的mysqldump会是最好的方式。 1.导出某张表的结构和数据 首先,我们应当使用服务器,打开终端,连接到所需要导出的表所在的服务器上。执行命令: mysqld...

hengbao5 ⋅ 31分钟前 ⋅ 0

世界杯也走向“比拼”大数据的时代

《日本经济新闻》6月19日报道称,俄罗斯足球世界杯已于6月14日揭开战幕。作为第21次举办的足球世界杯,如何活用大数据有可能成为决定各支球队胜负的重要因素。从对阵球队的分析到战术建议,还...

加米谷大数据 ⋅ 31分钟前 ⋅ 0

金额转为千分制,金额转中文大写

金额转关为大写 /** 数字金额大写转换(可以处理整数,小数,负数) */ function digitUppercase(n){ if(!n) reutrn "" let fraction = ['角', '分']; let digit = [...

YXMBetter ⋅ 34分钟前 ⋅ 0

开发利器JRebel部署SpringBoot项目

不要以为年纪轻轻就跌倒了人生谷底,未来还有更大的下降空间等着你。 idea下载和安装JRebel 激活JRebel 访问https://my.jrebel.com/ 使用facebook或twitter登录 勾选 Build project automati...

郑龙飞 ⋅ 40分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部