知识卡片
服务本身不等于架构:解耦合与独立部署的两个流行谬论
内容
“只要用了服务,就等于有了一套架构”是一个需要批驳的流行错觉——架构设计的任务是找到高层策略与低层细节之间的边界、并让边界遵守依赖关系规则,而服务本身只是一种比函数调用成本稍高的、分割程序行为的形式,本身与架构无关。用函数做类比:无论单体还是多组件程序,系统架构都是由跨越架构边界的关键函数调用定义的,系统里其余大量起隔离作用的函数并不具备架构意义——服务也一样,本质上不过是一种跨进程/平台边界的函数调用,有些有架构意义,有些没有。这个视角能拆穿两个关于服务化的流行迷思。迷思一是”解耦合”:服务确实在变量层面彼此隔离(不同进程甚至不同处理器,无法直接访问彼此变量),接口也确实充分定义——但服务间仍可能因共享处理器资源或网络资源而耦合,任何形式的共享数据行为本身就会造成强耦合:如果服务间传递的数据记录加了一个新字段,所有需要用到这个字段的服务都得跟着变、对这条数据的解读必须彼此一致,这意味着这些服务全都间接耦合在这条数据结构上;至于”服务能很好地定义接口”这一点,普通函数接口同样能做到,并没有更正式、更严谨,算不上什么真正的好处。迷思二是”独立开发部署”:认为大型系统可以由几十几百上千个各自独立开发部署的服务组成、团队规模能跟服务数量对应——但历史上大型系统一样能用单体或组件模式构建,服务化并非唯一选择;更关键的是,解耦合谬论已经说明如果服务间在数据或行为上耦合,它们的开发部署运维就必须彼此协调,谈不上真正独立。
参考来源
- 位置:《架构整洁之道》第27章《服务:宏观与微观》"面向服务的架构""服务所带来的好处""解耦合的谬论""独立开发部署的谬论"(源文件:_epub-src/text/part0014_split_012.html)
- 结论依据:原文批驳"服务即架构"的错觉,说明架构由跨边界函数调用及其依赖关系规则定义、服务本身只是分割行为的一种形式,并逐条反驳解耦合谬论(共享数据导致间接耦合、接口定义并不比函数更严谨)与独立开发部署谬论(大型系统未必需要服务化、服务间耦合会破坏独立性),直接支撑本卡片结论。
- 原始内容:所谓的服务本身只是一种比函数调用方式成本稍高的,分割应用程序行为的一种形式,与系统架构无关……任何形式的共享数据行为都会导致强耦合……服务化并不是构建大型系统的唯一选择。