康威定律

本文来自:http://www.dockone.io/article/2691

1、概述

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

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

在这里插入图片描述
在这篇文章中最有名的一句话莫过于:

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

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

在这里插入图片描述
该图展现了企业现有沟通结构,简单地说:企业结构等于系统设计。

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

康威定律详细介绍

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

  • 第一定律:企业沟通方式会通过系统设计表达出来
  • 第二定律:再多的时间也没办法让任务完美至极,但总有时间能将它完成
  • 第三定律:线型系统和线型组织架构间有潜在的异质同态特性
  • 第四定律:大系统比小系统更适用于任务分解

2、康威第一定律

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

其他领域也提供了一些关于沟通和系统设计之间紧密关系的例证,对于一个复杂的系统,设计主题总会涉及到人们之间的交流,一个好的系统设计能解决这种沟通问题,很多老程序员都读过《The Mythical Man-Month》,里面的一些观点都是这句话的佐证。
在这里插入图片描述
《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个只打过照面的朋友

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

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

3、康威第二定律

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

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

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

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

——Erik Hollnagel(2009)

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

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

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

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

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

在这里插入图片描述
听起来是不是很熟悉?没错,这就是我们常说的持续集成和敏捷开发的概念。

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

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

4、 康威第三定律

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

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

在这里插入图片描述
相反,如果系统是以业务边界划分的,按照业务目标去构建小的系统或产品,整体系统将会如下图所示,即微服务架构:
在这里插入图片描述
团队中微服务的理念应是Inter-Operate,而不是Integrate ,Inter-Operate是指定义系统边界和接口,并为整个团队提供完整的堆栈,实现完全的自制。如此就能降低系统间的依赖性,减少通信成本。

5、 康威第四定律

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

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

  • 创业的项目很好,拿到一大笔风投,再招募更多的程序员
  • 人员太多,需要找几个经理进行管理

康威定律好告诉我们,可以从系统设计中看出组织通信的模式,每个经理要对大系统的某一小部分负责,通过这种方式,它们和更大的系统间沟通有了便捷,因此大的系统也会被拆分成一个个小系统。(微服务可以更好地服务于此)。

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

  • 人与人之间的交流很复杂,每个人的精力是有限的,因此当问题很复杂,需要协调地去解决时,需要将组织划分进而提高沟通效率。
  • 团队成员工作的系统设计依赖于成员之间的沟通,管理人员可以调整划分模式,实现团队之间的不同沟通方式,这也会影响系统的设计。
  • 如果子系统有清晰的外部通信便捷,那么就可以有效地降低通信成本,响应地设计将更加适合和有效。
  • 需要不断优化一个复杂的系统,并容错性和故障恢复率的帮助下进行优化,不要期望大而全面的设计或架构,因为它们的开发以迭代的方式发生。

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

  • 利用一切手段提高通信效率,如Slack、Github和Wiki,且只与相关人员进行沟通,每个人和每个系统必须有明确的职责,在遇到问题时,知道该找谁去解决。
  • 在MVP模式下设计一套系统,以迭代的方式优化及验证,并确保系统的弹性。
  • 采用与系统设计相一致的团队,以扁平化和以业务为基准的方式去简化团队,每个小团队之间必须有对应负责的模块,避免模糊的界限,以免在发生问题时互相推卸责任。
  • 要做小而美的团队,人员数量的增加会降低效率以及加大成本,亚马逊CEO Jeff Bezos有个一个经验法则:如果两个披萨对于一个团队来说不够,那么这个团队就太大了。一般来说,一家互联网公司的产品团队由7到8个人组成(包括前端和后端测试、交互和用户体验师,一些人可能身兼数职)。

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

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

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

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

相关文章

Cannot find or open the PDB file

http://blog.chinaunix.net/uid-11765716-id-3074932.html 遇到问题 SVM_demo.exe (Win32): Loaded ...\SVM_demo\Debug\SVM_demo.exe. Symbols loaded. SVM_demo.exe (Win32): Loaded C:\Windows\System32\ntdll.dll. Symbols loaded. SVM_demo.exe…

基于ASP.NET Core 3.0的ABP v0.21已发布

在微软发布仅仅一个小时后, 基于ASP.NET Core 3.0的ABP v0.21也紧跟着发布了.v0.21没有新功能.它只是升级到稳定的ASP.NET Core 3.0. 查看v0.20发行说明以获取新功能,增强功能和错误修复.关于v1.0ABP框架越来越接近v1.0.我们打算在今年10月中旬发布1.0. 现在,我们将完善测试和文…

SOA和微服务

一、面向服务的架构SOA SOA代表了面向服务的架构。 SOA是一种使用松耦合的黑盒子服务构建业务应用的体系架构,这些服务可以通过编排连接在一起以实现特定的功能。 面向服务的架构(Service-Oriented Architecture)是一种软件体系结构&#x…

[ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [上篇]

微软在千禧年推出 .NET战略,并在两年后推出第一个版本的.NET Framework和IDE(Visual Studio.NET 2002,后来改名为Visual Studio),如果你是一个资深的.NET程序员,相信传统的.NET应用的开发方式已经深深地烙印…

下一代微服务架构基础:ServiceMesh?

最近,ServiceMesh(服务网格) 概念在社区里头非常火,有人提出 2018 年是 ServiceMesh 年,还有人提出 ServiceMesh 是下一代的微服务架构基础。作为架构师,如果你现在还不了解 ServiceMesh 的话,是否感觉有点落伍了&…

ASP.NET Core 2.0 Web API项目升级到ASP.NET Core 3.0概要笔记

本文结构先决条件升级目标框架(Target Framework)的版本过时的IHostingEnvironment与IApplicationLifetime对象Endpoint Routing与AddMvc中间件Swashbuckle.AspNetCore总结手头有个ASP.NET Core 2.0的项目,打算将里面的依赖包进行一个版本升级…

常见消息队列对比

一、消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,Rabbit…

Precision-Recall Curve

原文出自:http://blog.csdn.net/pirage/article/details/9851339 最近一直在做相关推荐方面的研究与应用工作,召回率与准确率这两个概念偶尔会遇到, 知道意思,但是有时候要很清晰地向同学介绍则有点转不过弯来。 召回率和准确率是…

2019 中国.NET 开发者峰会正式启动

2014年微软组织并成立.NET基金会,微软在成为主要的开源参与者的道路上又前进了一步。2014年以来已经有众多知名公司加入.NET基金会,Google,微软,AWS三大云厂商已经齐聚.NET基金会,在平台项目中,.NET平台上有…

聊一聊顺序消息(RocketMQ顺序消息的实现机制)

本文来自:https://www.cnblogs.com/hzmark/p/orderly_message.html 当我们说顺序时,我们在说什么? 日常思维中,顺序大部分情况会和时间关联起来,即时间的先后表示事件的顺序关系。 比如事件A发生在下午3点一刻&#…

如何摆脱「技术思维」的惯性?

大家好,我是Z哥。虽然从标题上看,这篇文章是写给“技术人”的,但从广义上来说,只要你是一位以理性见长的人,那么这篇文章要讲的东西可能会与你有关。先问大家一个问题。如果你现在打算做一件事A,它的目的是…

RocketMq重试及消息不丢失机制

1、消息重试机制 由于MQ经常处于复杂的分布式系统中,考虑网络波动、服务宕机、程序异常因素,很有可能出现消息发送或者消费失败的问题。因此,消息的重试就是所有MQ中间件必须考虑到的一个关键点。如果没有消息重试,就可能产生消息…

cmake编译opencv3.0

本文参照了 http://www.huqiwen.com/2012/11/27/compile-opencv-243-in-visual-studio-2012/ 安装CMake 从CMake的官方网站下载最新版的CMake。http://www.cmake.org/cmake/resources/software.html,选择Windows (Win32 Installer)平台的进行下载。 安装时请勾选…

【 .NET Core 3.0 】框架之五 || JWT权限验证

前言关于JWT一共三篇 姊妹篇,内容分别从简单到复杂,一定要多看多想:一、Swagger的使用 3.3 JWT权限验证【修改】二、解决JWT权限验证过期问题三、JWT完美实现权限与接口的动态分配这里一共三个文章,目前是第一篇,剩下两…

OpenCV Stitching 工程搭建

转自http://www.tuicool.com/articles/fMbUfaF Opencv中提供Stitcher类,实现了多图像自动拼接,Opencv是开源的,程序实现的源代码都在Opencv安装文件中,以及Opencv提供的函数查询手册和Opencv教程都可以在…

asp.net core 3.0 更新简记

asp.net core 3.0 更新简记Intro最近把活动室预约项目从 asp.net core 2.2 更新到了 asp.net core 3.0,记录一下,升级踩过的坑以及经验总结,包括但不限于TargetFramework ( netcoreapp2.2 需要更新为 netcoreapp3.0)DependencyHost/Environme…

kafka吞吐量高的原因

kafa 吞吐量高的原因 1、顺序读写 kafka的消息是不断追加到文件中的,这个特性使kafka可以充分利用磁盘的顺序读写性能 顺序读写不需要硬盘磁头的寻道时间,只需很少的扇区旋转时间,所以速度远快于随机读写 2、零拷贝 在Linux kernel2.2 之…

【 .NET Core 3.0 】框架之三 || swagger的使用

一、为什么使用Swagger上文中已经说到,单纯的项目接口在前后端开发人员使用是特别不舒服的,那所有要推荐一个,既方便又美观的接口文档说明框架,当当当,就是Swagger,随着互联网技术的发展,现在的…

MQ问题集(kafka主从同步与高可用,MQ重复消费、幂等)

1、kafka主从同步与高可用 https://1028826685.iteye.com/blog/2354570 http://developer.51cto.com/art/201808/581538.htm 2、MQ有可能发生重复消费,如何避免,如何做到幂等 2.1 MQ消息发送 1、发送端MQ-client(消息生产者:Producer)将消…

微软编程题:寻找最小的k个值

转载自:http://blog.csdn.net/v_JULY_v/article/details/6370650 寻找最小的k个数 题目描述:5.查找最小的k个元素 题目:输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5&#xf…