[技术分享][002期]通过“隔离”来灵活“高内聚低耦合”

  之前的一篇文章中,我们探讨了不同编程语言之间的交互方式,当然那篇技术分享文章已经是三年前的了。最近接触了更多关于这方面的东西,就比如Docker和Containerd之间交互所用到的Unix Socket、RPC其实可以有更多巧妙应用,甚至作为用户界面。当然这次跟这个也是有关系的,本期的文章我主要想探讨的问题是所谓评判程序优秀程度时朗朗上口的两个指标“高内聚低耦合”,这是一个软件工程学中的概念,“内聚性”使得模块更加独立,“低耦合”使得模块之间的关系减弱。通常我们使用编程语言的一些特性还有巧妙的设计模式增强内聚、降低耦合。从而使得代码易于维护和重用,但这并不是强制的。这期我要说一些思路,但并不是所谓银弹,也就是说这个方案并不是一个万能钥匙,不过追求易于维护和职责分离的时候走投无路了,可以试一试我说的这些方案。

  首先我说一个背景,假如说一个操作系统没有内置进程管理器,我们要做一个进程管理器,职责就是管理系统进程(类似systemd)。首先我们就会想到参考systemd对吧,先不说他的CLI 界面,就是这个模式来说,systemctl本身功能就是管理进程相关的,这个不会受外界影响,那它管理的进程功能应用呢?细想一下,是不是systemd 对业务进程是一种“一厢情愿”的超低耦合!那加入我们自己想做一个进程管理器,你会怎么做,难道直接将运行的业务内置进进程管理器?不过也不是不可以,看这个业务架构需要的细分程度,不过我们当然还是追求一定的通用性。现在我们讨论一种架构较为庞大,且各部分需要复用或可能需要复用,并且不同层次的服务都可能被直接或间接调用。

  再来看systemd的CLI,就是我们常用的systemctl命令,它跟systemd之间呢?容易发现systemctl 与 systemd 之间是“进程隔离 + 文本协议(D-Bus)”的松耦合,就像Docker跟Containerd之间是用Unix Socket发送grpc消息一样。他们的共性就是-“进程隔离”,而根据我之前的文章,进程之间是有很多通信方式的,甚至可以跨设备、跨编程语言、跨服务。所以说在这个“颗粒度”的“隔离”是可行的,并且有效的增强高内聚低耦合的手段。

  就这?这谁都见过,道理谁都懂。我们具体该怎么做呢?作为方法论,“沙箱”这样说我感觉并不贴切,我得找到一个更通用、更贴切的“隔板”的概念