内容来自《微服务治理:体系、架构及实践》

上一节讨论的服务分层已经涉及服务拆分,但仅是对宏观层面的拆分原则的把控,本节将讨论更细粒度层面的服务拆分原则。

服务拆分属于系统架构设计的一部分,做架构设计本质上追求的并不是“最优解”,而是“更优解”。尤其是在一个整体联动的体系中,组织的人力资源和成本投入都有限,上线时间压力也客观存在,架构人员只能在一定的资源基础上追求一个整体优化的方案。这就必然会在服务能力设计上做妥协,最终的架构无非是各方妥协的结果。所以,服务拆分也一定会遵循“妥协”原则,否则某个服务最优化却导致其他服务复杂度升高,就不合适了。从这点上看,服务拆分本身就不存在所谓的最佳原则、最佳粒度。若非要追求最佳,也必须从特定的角度来评判,比如基于运维角度的“最佳”,或者基于开发角度的“最佳”。

古希腊哲学家赫拉克利特曾经说过:“人不能两次踏进同一条河流。”随着时间的流逝,任何事物的状态都会发生变化。线上系统同样如此,即使同一个系统在不同时刻的状况也绝不会一模一样。现在拆分出来的服务粒度也许很合适,但谁都不能保证这个粒度就是包打天下的“银弹”,随着架构的不断变迁,在未来的某个时刻,当业务发展到新的阶段,它也要随之改变。因此,从时间的维度来看,根本不存在所谓的最佳原则。

综上所述,谈论服务的拆分原则和拆分粒度,不能脱离诉求和系统演进的客观规律。必须承认我们的认知是有限的,必须承认只能基于目前的业务状态和有限的对未来的预测来制定出一个相对合适的拆分方案,而不是所谓的最优方案,任何方案都只能保证在当下提供了相对合适的粒度和划分原则,要时刻做好在未来的某一个时刻会变得不合时宜、需要再次调整的准备。

因此,与其纠结于找到服务拆分的最佳原则,不如将架构优化工作做好。构建起一套持之以恒的架构优化体系,通过持续地优化架构,不断对每个阶段的服务粒度进行监控和调整,让它能够适配业务发展的要求,这才是架构的可持续之道。

所以,在服务拆分上,我们应该做行动派,而不是理论派,不要太纠结于是否合适,不动手又怎么知道合不合适呢?拆了之后真的不合适,再重新调整就好了。有的读者可能会说,调整的成本太高、可能涉及数据迁移的工作。这实际上不是服务拆分的问题,因为拆分一定会持续存在,这个问题的本质还是没有针对服务化架构构建起一套完整的能力体系,从而导致应对服务拆分的能力不足。试问,如果我们在服务灰度、数据双写、数据迁移、分布式事务方面的能力很完备,又怎么会害怕数据迁移呢?

所以大道至简,在服务拆分上不需要太刻意追求所谓的最佳实践,结合业务现实及团队的技术能力,适度应用如下5条业界提炼出来的普适拆分原则即可。