重新写松耦合这个话题是源于几年来Laxcus集群操作系统用户一直在快速增长,特别在2020年,增长幅度尤其惊人。几年前写过一篇《松耦合和紧耦合的架构设计》的文章,当时Laxcus集群操作系统是2.x版本,集群的基础架构正从紧耦合向松耦合过渡,用户数量也不是太多,我个人对松耦合的体验主要来自系统运行的前后变化。这几年下来,用户人数已经大幅度增加,Laxcus集群操作系统也发展到5.x版本,系统相关模块也全部切换到松耦合架构,对松耦合架构的体验更多是来自用户反馈。同时在松耦合架构基础上,Laxcus陆续增加了更多新的功能,系统运行却是一如即往地稳定性。现在回想起来,当初团队做出紧耦合架构向松耦合过渡的决定,虽然系统代码改动非常大,几乎是推倒重写的效果,但是成本收益绝对值得。今天再写松耦合架构,希望给从事系统设计的开发人员提供一个可供参考的现实案例。今天再来说说紧耦合和松耦合架构的优劣比较。
紧耦合采用的“客户机-服务器”模型
我先说紧耦合,这种架构是我们在Laxcus集群操作系统的 0.x和1.x采用的,到2.x版本被全部替换掉。紧耦合架构特点是点对点通信,采用了客户机-服务器模式。首先由客户机向服务器发起一个请求,服务器收到后,根据请求做出回应,把结果反馈给客户机。一次通信或者远程调用就算完成了。这种架构的典型应用是WEB服务和SQL数据库。它的优点就是架构简单、设计简单,开发周期短,可以快速开发部署上线。
由于Laxcus集群操作系统早期侧重体系设计,还有上线时间和研发成本的原因,使用紧耦合架构也是不得已的急就章选择。如果Laxcus一直局限于Web服务器这样简单的网络应用,或者SQL数据库这样小规模的数据处理,使用紧耦合架构确实是一个不错的选择,只是Laxcus定位于处理超大规模的分布存储和分布计算,所以从Laxcus 1.x版本之后,随着集群规模越来越大,处理的数据量越来越多(最多时达到EB级),尤其是Laxcus集群引入虚拟化后,需要支持海量用户共享使用计算机集群,每个用户还要在自己空间里运行各种应用软件,连续多层的业务负载迭代,导致集群复杂性和管理维护成本直线上升,紧耦合架构的弊病逐渐暴露出来,主要集中以下问题:
- 底层代码关联度过高,不利于模块化设计。这是非常严重的问题,直接影响系统稳定性。
- 安全控制力度差。在网络环境里,客户机和服务器都是直接暴露给对方,很容易被黑客利用实施网络攻击,这是致命问题。
- 网络资源消耗大。紧耦合使用TCP通信,在客户机发出请求和服务器返回结果之间,有很长一段空窗期,这段资源被客户机和服务器占用却没有使用,严重浪费有限的网络资源。
- 集群负载很难控制。因为客户机发出的请求需要服务器实时处理,原来设计中的负载控制在紧耦合架构上基本属于空谈。
- 分布管理难度大。因为上述原因,计算机集群执行过程中,计算任务和分布资源很难管控。
- 无法支持大规模的计算业务。还是上述原因,当服务器数量越来越多时,稳定性和性能开始同步变差,导致很难实施更大规模的分布存储和分布计算。
- 能够支持的在线人数有限。原因同上。
从Laxcus1.x版本开始,为了解决上述问题,我们开始考虑把基础架构从紧耦合向松耦合转移。由于团队最初缺乏松耦合架构的设计经验,在修改设计过程中,我们采用了小步快跑策略,在不改变大框架情况下,先从简单的模块入手,进行各种试错尝试,从中找到最佳技术路线。一个模块测试稳定后,再把上一套技术方案迁移到下一个模块。就这样一点点,通过不断的技术迭代,先易后难,逐渐积累经验,设计了很多有针对性的松耦合架构方案,扩展到所有模块,最终把Laxcus集群操作系统从紧耦合架构完全迁移到松耦合架构。
松耦合采用的“客户机-代理-服务器”模型
和紧耦合架构相比,Laxcus集群操作系统的松耦合架构虽然复杂,各个模块采用的策略也不尽相同,但是都遵循了“客户机-代理-服务器”三层模型,这是Laxcus集群操作系统各个模块松耦合共同的特点。
这个改变是在原来客户机-服务器模型之间,增加了一个中间代理层(Agent),把原来的CS模型变成CAS模型。客户机和服务器之间的通信和交互工作,都通过代理层保持后转发,类似网络通信的“存储转发”机制,原来的客户机和服务器之间的透明关系也因为代理层转成隔离状态。
新的松耦合架构全部开发完成后,我们对前后两种架构做了对比测试,结果是松耦合架构表现出其的好,不仅解决了之前紧耦合架构上存在的所有问题,而且其中很多技术指标还超出了我们的预期,主要有以下这些方面:
- 代码解耦。经过重新设计后,模块之间的代码关联度减少,提高了独立性。因为相互影响减少,非常利于各个模块内部的优化。
- 网络通信从TCP通信改为UDP通信,长连接变成短连接,这项改变大幅提高网络资源利用率。
- 利用“中间代理”,把业务流程从同步模式改为异步模式,有了类似“缓存”的功能。
- 杜绝网络攻击行为。因为客户机和服务器之间的通信需要通过代理转发,实际上客户机和服务器都被隐藏起来,只有代理暴露在网络上。而代理具有筛查能力,不被信任和恶意操作都被识别和过滤掉,这样就保护了客户机和服务器不受干扰。
- 提高了在线人数。在单节点硬件配置不变情况下,松耦合架构能够比紧耦合架构提高一倍以上。
- 基于以上原因,计算机集群的安全管理、负载平衡、计算任务协同、资源复用和管控都得以轻松实现。
- 扩展出更多的基础功能。比如Invoke/Produce模型,它提供了自定义的业务接口,允许用户或者应用软件开发者根据自己的业务需要,实现各种复杂的业务定义。还有结合我们团队研发的DFL人工智能集群管理方案,基本实现了计算机集群自主管理。
- 集群节点增长两个数量量级,稳定性良好。根据目前虚拟测试,结合多域并行集群技术,Laxcus集群操作系统能够支持数十万台规模的服务器集群,并且能够让集群保持稳定运行。
在之后几年,Laxcus集群操作系统被应用到更多的生产环境中,现在已经深入物联网、超级计算机、云计算、工业互联网等行业,这些改进后的总体特性表现良好,同时也进一步辅证了松耦合架构在超大规模处理领域的优越性。
最后用一张表格对两种架构做个对比总结: