上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
模块化
在API与单个二进制文件以外,适用于面向对象编程的许多经验法则也适用于分布式系统的设计。对系统中某个部分进行隔离式的变更的能力对创建一个可以运维的系统来说非常必要。具体而言,在二进制文件之间或者二进制文件与配置之间推行松耦合,是一种同时提高开发人员的灵活性和系统的稳定性的简化模式。如果在一个更大系统的某个组件中发现一个错误,我们可以修复这个错误并且独立于系统的其他部分更新该程序。
虽然API提供的模块化可能看上去很容易理解,但是如何将模块化的概念延伸到API的变更就没那么明显了。某个API的一个变更就可以迫使开发人员重建他们的整个系统,同时承担引入新问题的风险。通过将API版本化,可以允许开发人员继续使用它们的系统所依赖的版本,以更安全和深思熟虑的方法升级到新的版本。这样不必要求整个系统的每一次功能增加或改进都需要全面的生产更新,整个系统中的更新节奏可以不同。
随着系统变得越来越复杂,API与二进制文件之间的责任分离变得越来越重要。某种程度上,这与面向对象编程中的类设计类似:正如普遍认同的,编写一个其中包含无关功能的“大杂烩”类是一个糟糕的实践。构建和发布“util”或“misc”二进制文件同样也是个糟糕的实践。一个设计良好的分布式系统是由一系列合作者组成的,每一个合作者都具有明确的、良好定义的范围。
模块化的概念同样适用于数据格式。Google的Protobuf[27]的一个主要优势和设计目标就是创建一个同时向后和向前兼容的传输格式。