微服务与康威定律

标签: 微服务 康威 定律 | 发表时间:2016-08-09 15:31 | 作者:
出处:http://gigix.thoughtworkers.org/

(本文是对《 Building Microservices》一书第10章的摘录)

康威定律

Melvin Conway于1968年发表的论文《 How Do Committees Invent》指出:系统设计的结构必定复制设计该系统的组织的沟通结构。这一论断被称为“康威定律”。在《 Exploring the Duality Between Product and Organizational Architectures》一文中,作者发现紧密耦合的组织(例如典型的商业产品公司,所有员工在同一地点工作,具有高度一致的愿景与目标)开发的软件倾向于较少模块化,而松散耦合的组织(例如分布式的开源社区)开发的软件则倾向于更加模块化、耦合较少。

当一支小型团队负责整个系统的设计与实现时,团队内部可以具有频繁的、细粒度的沟通。而随着团队变大、分布在不同地点甚至时区,协调变更成本急剧增加,紧跟着就有两种可能性:人们要么找到降低协作/沟通成本的办法,或是停止做变更。后者就会导致庞大、难以维护的代码库。最终,各个地点不得不选择各自专门处理的一部分工作,拥有一部分代码,并在团队之间形成更粗粒度的沟通机制。组织结构中的沟通路径会造就与之对应的粗粒度API,形成代码库各个大块之间的边界。

服务的边界应该围绕着约束上下文( bounded context)来画,正如我们希望团队结构与约束上下文保持一致。这样做有几方面的好处。首先,团队在一个约束上下文内更容易抓住领域概念;其次,一个约束上下文内的多个服务更可能彼此交互,因此系统设计和发布协作都得以简化;最后,交付团队与业务代表沟通时,团队只需与各自约束上下文中的一两个专家建立良好关系即可。

服务所有权

一般而言,每个服务属于一个团队,拥有这个服务的团队负责其所有修改。这个团队可以任意调整代码结构,只要这些修改不对服务的消费者造成破坏即可。在很多团队中,“所有权”延伸到了服务的各个方面,从需求来源直到软件的构建、部署和维护。由同一个团队负责开发、部署和维护会促使他们简化部署环节,而不是“写完代码扔过墙”。

有很多团队采用“共享服务所有权”的模式。这种模式并不理想,但有必要了解团队为什么做此选择。常见的理由包括:

  • 难以拆分。《Building Microservices》一书的第5章提供了一些关于如何拆分服务的建议。也可以考虑把团队合并,从而使组织结构与软件架构匹配。
  • 特性团队。比起传统的“按技术/职能划分团队”的IT组织结构,“一个团队端到端负责一个特性开发”的结构是一个进步。然而微服务环境下的团队结构可以再向前一步:如果业务领域、服务边界、团队结构三者能保持对齐,一个团队就能聚焦一组客户,以整体视角为这组客户提供服务。横切多个业务领域的修改固然会发生,但可能性会降低很多。
  • 交付瓶颈。有几个办法可以应对交付瓶颈而不必共享服务所有权。第一个办法就是等待,各个服务不一定要以同样的节奏发布,遇到交付瓶颈的服务可以稍后再发布。另外,也可以直接向有交付困难的团队中加人。横跨整个组织的技术栈越标准,临时加人的效果就会越好。当然,另一方面,标准化的技术栈也可能给团队造成束缚。

内部开源

通常的开源项目组织方式可以用在企业内部:一个代码库由一组受信任的提交者(核心团队)管理,并接受未获信任的提交者(外围团队)提交的修改。开源项目以这种方式来保障代码质量和一致性。大多数开源项目在第一个核心版本成型之前倾向于不接受外来的提交。当服务变得成熟且稳定,便可以更放心地开放接受贡献。

分布式版本控制工具允许任何人提交pull request,这是很重要的能力。取决于组织的规模,内部开源体系可能需要考虑借助代码评审工具来讨论和评估是否接受pull request。同时,类似于github提供的pull request评论功能也很有用。最后,需要让提交者很容易构建和部署整个软件,通常这需要定义良好的构建和部署流水线,以及集中管理的构建产物仓库。

案例:REA

REA的服务由“小队”(squad)拥有,小队负责服务的整个生命周期,包括构建、测试、发布、支持、直到下线。一支交付服务团队给这些小队提供建议和指导,以及必要的工具支持。REA有着强烈的自动化文化,并大量使用AWS使团队更具自主性。

不仅交付团队与业务经营对齐,软件架构也是一样。以服务集成为例:在一条业务线内部,所有服务可以用任何方式自由交流,小队自己可以做决定;然而在业务线之间,所有交流必须以异步批处理的形式发生,这是中央架构团队规定的很少几条“铁律”之一。粗粒度的系统集成与业务线之间已有的粗粒度交流相匹配。

为了对齐业务经营,组织结构和软件架构都需要改变。变革的阻力真实存在:从大一统的系统转到微服务,对于习惯了单一编程语言、不用考虑运维问题的开发者而言是一次痛苦的觉醒;习惯了把软件“丢过墙”的程序员突然发现没有别人可以推诿责任,可能会很不习惯自己对所有工作负责;如果要让开发者承担7*24在线支持工作,甚至可能有劳动合同上的阻碍。变革推动者需要理解员工的喜恶,顺势而为,不能急于求成。

相关 [微服务 康威 定律] 推荐:

微服务与康威定律

- - 透明思考
(本文是对《 Building Microservices》一书第10章的摘录). Melvin Conway于1968年发表的论文《 How Do Committees Invent》指出:系统设计的结构必定复制设计该系统的组织的沟通结构. 在《 Exploring the Duality Between Product and Organizational Architectures》一文中,作者发现紧密耦合的组织(例如典型的商业产品公司,所有员工在同一地点工作,具有高度一致的愿景与目标)开发的软件倾向于较少模块化,而松散耦合的组织(例如分布式的开源社区)开发的软件则倾向于更加模块化、耦合较少.

系统架构之引言(墨菲定律、康威定律) - 小白进阶 - CSDN博客

- -
任何事都没有表面看起来那么简单. 所有的事都会比你预计的时间长;. 如果你担心某种情况发生,那么它就更有可能发生. “墨菲定律”的根本内容是“凡是可能出错的事有很大几率会出错”,指的是任何一个事件,只要具有大于零的机率,就不能够假设它不会发生. 第一定律:组织沟通方式会通过系统设计表达出来. 组织的沟通和系统设计之间的紧密联系,解决好人与人的沟通问题,才能有一个好的系统设计.

初识微服务

- - ITeye博客
微服务架构越来越火,有必要学习一下. 软件开发过程中碰到什么问题. 一个简单的应用会随着时间推移逐渐变大. 在每次的sprint中,开发团队都会面对新“故事”,然后开发许多新代码. 几年后,这个小而简单的应用会变成了一个巨大的怪物. 一旦你的应用变成一个又大又复杂的怪物,那开发团队肯定很痛苦. 敏捷开发和部署举步维艰,其中最主要问题就是这个应用太复杂,以至于任何单个开发者都不可能搞懂它.

27岁定律

- lzhi - Lzhi's Views
       很多女人会选择在27岁时跟男友说分手,他让她看不到未来,她已然不能再等. 尤其,28岁,对女人,意味着衰老的开始.   女人一生美丽的巅峰是在27岁,此后,美丽的容貌状态便开始呈现逐渐递减的态势.   男人一生魅力的开始是在27岁,此后,之前的幼稚慢慢退却,成熟气质开始占领高地.   这就是让男人女人又爱又恨的“27岁定律”.

谈微服务架构

- - 人月神话的BLOG
其实在前面很多文章谈到SOA,特别是系统内的SOA和组件化的时候已经很多内容和微服务架构思想是相同的,对于微服务架构,既然出现了这个新名称,那就再谈下微服务架构本身的一些特点和特性. 从这个图可以看到微服务架构的第一个重点,即业务系统本身的组件化和服务化,原来开发一个业务系统本身虽然分了组件和模块,但是本质还是紧耦合的,这关键的一个判断标准就是如果要将原有的业务系统按照模块分开部署到不同的进程里面并完成一个完整业务系统是不可能实现的.

微服务性能模式

- - 互联网 - ITeye博客
前言:基于微服务系统越来越普遍. 下面我们就来看看五种常见的特定微服务性能的挑战,以及如何应解他们. 背景:在IT界微服务架构为基础的系统越来越多, 每一个应用系统都集成了不同的组件和服务,几乎所有的特定业务应用程序都需要集成一个或更多的应用服务. 但是一个综合性系统集成不同的服务这无疑是一个巨大的挑战.

微服务与架构师

- - 乱象,印迹
因为工作的关系,最近面试了很多软件架构师,遗憾的是真正能录用的很少. 很多候选人有多年的工作经验,常见的框架也玩得很溜. 然而最擅长的是“用既定的技术方案去解决特定的问题”,如果遇到的问题没有严格对应的现成框架,就比较吃力. 这样的技能水平或许适合某些行业,但很遗憾不符合我们的要求. 软件架构师到底应该做什么,又为什么这么难做好,这都是近来的热门问题,我也一直在和朋友们讨论.

从Excel到微服务

- - 乱象,印迹
Excel很老,Excel很土,Excel一点也不sexy;微服务新,微服务很潮门,微服务很高大上. 那么,Excel和微服务有什么关系. 上个月看了篇文章,The Unbunlding of Excel. 作者认为,对于初创公司(尤其是非“纯IT”初创公司)来说,Excel几乎包办各种工作. 想做轻量级的CRM,可用Excel.

微服务拆分之道

- - DockOne.io
微服务在最近几年大行其道,很多公司的研发人员都在考虑微服务架构,同时,随着 Docker 容器技术和自动化运维等相关技术发展,微服务变得更容易管理,这给了微服务架构良好的发展机会. 在做微服务的路上,拆分服务是个很热的话题. 我们应该按照什么原则将现有的业务进行拆分. 接下来一起谈谈服务拆分的策略和坚持的原则.

微服务之saga模式

- -
你已经使用 database ber service 模式. 每个service拥有自己的database. 一些业务事务会跨越多个service,所以你需要来确保data consistency. 例如,假设你正在构建一个电子商务网站,这个网站的用户的会有一个最大欠款限制,应用程序必须确保一个新订单不能超过用户的最大前款限制,但是orders表和customers表不在同一个数据库,所以应用程序不能简单的使用本地的ACID事务.