系统拆分

为什么要进行系统拆分?

个人觉得两个方面原因,降低系统的复杂性,方便团队协作。

如果不拆分系统,在面对复杂系统的时候,无论的开发、运维、测试、上线,系统的扩展、伸缩,都是困难的。

从性能上考虑,系统内各个服务的要求、耗费的IO或CPU资源是不同的,这样,在单个服务有问题的时候,可以只对有问题的服务根据对该服务的要求,选配不同的 硬件资源、部属不同数目的节点数目。

从开发的角度上,如果服务拆开,开发的时候从物理上天然具有了一定的低耦合,程序员大部分时候不是在开发代码,而是在阅读代码和维护代码,这种低耦合尤其 在修改维护代码的时候尤为重要,不用担心修改了一个地方,重新上线了一个服务而担心整个系统翻车。

另外一个原因,个人觉得更是重要,团队协作,如果多个人开发同一个功能的时候,如果没有多个服务的功能拆分,多个人同时在一个服务下开发,不仅MR的时候问 题,沟通上的问题都会比较多。如果拆分出业务独立的,相对小的容易维护的服务,不仅在开发上协同开发方便,沟通上更是能减少很多歧义。按照DDD方式,每个 服务都有自己的领域概念,而这些概念是有限的,不用对整个系统的中的业务、领域都清楚,这样单独的服务专门的小的团队或个人来维护所需要的信息更小,更不 容易出现领域上的不清不楚。

如何进行系统拆分?

系统是逐渐演进的,不是架构师一下就设计好的。

这个演进包含了系统拆分这个维度,而且是个相对重要的维度,而且系统拆分的过程与团队的规模,团队的组织架构密切相关。

DDD领域划分是一个可以拆分的方式,但是DDD目前也有些争论,拆分的还可以参考考虑性能、业务划分、基础服务划分,分离次要的服务,分离更新修改频繁的服务 等。DDD中的领域划分是个可参考的重要的方法论,DDD后面会单独分析。

拆分的原则?

最基本的就是不能循环调用,可以通过消息队列方式部分解耦,更常见的方式是在上层服务编排的层调用需要依赖的服务,把需要的信息直接在调用服务的时候代入。

幂等,基本原则,服务接口无状态。

Table of Contents