关于微服务的介绍,能够参考微服务那点事。html
微服务是最近很是火热的新概念,你们都在追,也都以为很对,可是彷佛没有很充足的理论基础说明这是正确的,给人的感受是 不明觉厉 。前段时间看了Mike Amundsen 《远距离条件下的康威定律——分布式世界中实现团队构建》(是Design RESTful API的做者)在InfoQ上的一个分享,以为颇有帮助,结合本身的一些思考,整理了该演讲的内容。前端
可能出乎不少人意料以外的一个事实是,微服务不少核心理念其实在半个世纪前的一篇文章中就被阐述过了,并且这篇文章中的不少论点在软件开发飞速发展的这半个世纪中居然一再被验证,这就是康威定律(Conway's Law)。git
在康威的这篇文章中,最有名的一句话就是:程序员
Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations. - Melvin Conway(1967)github
中文直译大概的意思就是:设计系统的组织,其产生的设计等同于组织以内、组织之间的沟通结构。看看下面的图片(来源于互联网,侵删),再想一想Apple的产品、微软的产品设计,就能形象生动的理解这句话。算法
用通俗的说法就是:组织形式等同系统设计。编程
这里的系统按原做者的意思并不局限于软件系统。听说这篇文章最初投的哈佛商业评论,结果程序员屌丝的文章不入商业人士的法眼,无情被拒,康威就投到了一个编程相关的杂志,因此被误解为是针对软件开发的。最初这篇文章显然不敢自称定律(law),只是描述了做者本身的发现和总结。后来,在Brooks Law著名的人月神话中,引用这个论点,并将其“吹捧”成了如今咱们熟知“康威定律”。后端
Mike从他的角度概括这篇论文中的其余一些核心观点,以下:安全
组织的沟通和系统设计之间的紧密联系,在不少别的领域有相似的阐述。对于复杂的系统,聊设计就离不开聊人与人的沟通,解决好人与人的沟通问题,才能有一个好的系统设计。相信几乎每一个程序员都读过的《人月神话》(1975年,感受都是老古董了,经典的就是经得起时间考验)里面许多观点都和这句话有殊途同归之妙。架构
好比《人月神话》中最著名的一句话就是
Adding manpower to a late software project makes it later --Fred Brooks, (1975)
Boss们都听到了吗?为了赶进度加程序员就像用水去灭油锅里的火同样(无奈你们仍是前赴后继)。
为何?人月神话也给出了很简洁的答案:沟通成本 = n(n-1)/2,沟通成本随着项目或者组织的人员增长呈指数级增加。是的,项目管理这个算法的复杂度是O(n^2)。举个例子
因此知道为何互联网创业公司都这么小了吧,必须小啊,否则等CEO和全部人讲一遍创业的想法后,风投的钱都烧完了。
Mike还举了一个很是有意思的理论,叫“Dunbar Number”,这是一个叫Dunbar(废话)生物学家在1992年最先提出来的。最初,他发现灵长类的大脑容量和其对应的族群大小有必定关联,进而推断出人类的大脑能维系的关系的一些有趣估计。举例来讲
是否是和上面的沟通成本的数字很貌似有关联?是的,咱们的大脑智力只能支持咱们维系这么多的关系。(你们都知道这不是程序猿擅长的领域,在开发团队里,这个值应该更小,估计和猿差很少 -_-凸 )
沟通的问题,会带来系统设计的问题,进而影响整个系统的开发效率和最终产品结果。
Eric Hollnagel是敏捷开发社区的泰斗之一,在他《Efficiency-Effectiveness Trade Offs》 一书中解释了相似的论点。
Problem too complicated? Ignore details.
Not enough resources?Give up features.
--Eric Hollnagel (2009)
系统越作越复杂,功能愈来愈多,外部市场的竞争愈来愈剧烈,投资人的期待愈来愈高。但人的智力是有上限的,即便再牛逼的人,融到钱再多也不必定招到足够多合适的人。对于一个巨复杂的系统,咱们永远没法考虑周全。Eric认为,这个时候最好的解决办法居然是——“破罐子破摔”。
其实咱们在平常开发中也常常碰到。产品经理的需求太复杂了?适当忽略一些细节,先抓主线。产品经理的需求太多了?放弃一些功能。
听说Eric被一家航空公司请去作安全咨询顾问,复杂保证飞机飞行系统的稳定性和安全性。Eric认为作到安全有两种方式:
对于飞机这样的复杂系统,再牛逼的人也没法考虑到漏洞的方方面面,因此Eric建议放弃打造完美系统的想法,而是经过不断的试飞,发现问题,确保问题发生时,系统能自动复原便可,而不追求飞行系统的绝对正确和安全。
下面的图很好的解释了这个过程:
听着很耳熟不是吗?这不就是 持续集成 和敏捷开发吗?的确就是。
另外一方面,这和互联网公司维护的分布式系统的弹性设计也是一个道理。对于一个分布式系统,咱们几乎永远不可能找到并修复全部的bug,单元测试覆盖1000%也没有用,错误流淌在分布式系统的血液里。解决方法不是消灭这些问题,而是容忍这些问题,在问题发生时,能自动回复,微服务组成的系统,每个微服务均可能挂掉,这是常态,咱们只有有足够的冗余和备份便可。即所谓的 弹性设计(Resilience) 或者叫高可用设计(High Availability)。
这是康威第必定律组织和设计间内在关系的一个具体应用。更直白的说,你想要什么样的系统,就搭建什么样的团队。若是你的团队分红前端团队,Java后台开发团队,DBA团队,运维团队,你的系统就会长成下面的样子:
相反,若是你的系统是按照业务边界划分的,你们按照一个业务目标去把本身的模块作出小系统,小产品的话,你的大系统就会长成下面的样子,即微服务的架构
微服务的理念团队间应该是 inter-operate, not integrate 。inter-operate是定义好系统的边界和接口,在一个团队内全栈,让团队自治,缘由就是由于若是团队按照这样的方式组建,将沟通的成本维持在系统内部,每一个子系统就会更加内聚,彼此的依赖耦合能变弱,跨系统的沟通成本也就能下降。
前面说了,人是复杂的社会动物,人与人的经过很是复杂。可是当咱们面对复杂系统时,又每每只能经过增长人力来解决。这时,咱们的组织通常是如何解决这个沟通问题的呢?Divide and conquer,分而治之。你们看看本身的公司的组织,是否是一个一线经理通常都是管理15我的如下的?二线经理再管理更少的一线?三线再管理更少的,以此类推。(这里彻底没有暗示开发经理比程序猿更难管理)
因此,一个大的组织由于沟通成本/管理问题,总为被拆分红一个个小团队。
了解了康威定律是什么,再来看看他如何在半个世纪前就奠基了微服务架构的理论基础。
带来的具体的实践建议是:
再对应下衡量微服务的标准,咱们很容易会发现他们之间的密切关系: