架构决定下限,代码决定上限。虽然代码影响很大,但是整体的稳定性,依然是架构占大部分决定因素。linux 网络栈足够复杂,但又有足够的扩展性,且非常的高性能,为什么?因为它流水线 + sk_buff。

核心:架构决定稳定性

架构决定下限,代码决定上限。

虽然代码影响很大,但是整体的稳定性,依然是架构占大部分决定因素。

linux 网络栈(sk_buff),足够复杂,但又有足够的扩展性,且非常的高性能。

它确很稳定,为什么?

因为他流水线 + sk_buff:

  • 它的核心对象,是高内聚的、面向对象的;
  • 它子模块是松耦合的,通过核心对象来协作。

我们的 iaas 流程呢?

没有核心对象,全是临时去数据库查,临时到数据库更新,临时到 hyper 获取环境信息。

修改也是修改很细微的变量,而不是一个从一而终的对象。

这种构成了各种千丝万缕的关系,且环节之间直接调用,相互耦合。

缺乏一个解耦式的流水线的设计。

即便不是 k8s 那种声明式的架构,即便是流程式的、面向过程的架构,也不至于这么乱呀。

最简单的解法

最简单的,主机是一个核心对象,从创建开始就确定了的,后续就不要再改了。

volume 是核心对象,和主机绑在一起。再加个网络核心对象,和主机绑定。

全流程从头到尾,都操作这三个核心对象,且通过责任链的方式,A 环节操作完了,B 环节。

这样每个环节是解耦的,他们不关心上下环节,只关心核心对象。

这种简单、稳定多了呀。

web 框架 gin,也是这样呀,大家都操作一个 context 对象,这样各个处理模块互不耦合,且扩展性好。

小结

  • 架构决定下限,代码决定上限;
  • 整体的稳定性,依然是架构占大部分决定因素;
  • linux 网络栈稳定,因为它流水线 + sk_buff,核心对象高内聚,子模块松耦合;
  • 我们的 iaas 流程没有核心对象,全是临时去数据库查、临时更新,构成千丝万缕的关系;
  • 主机、volume、网络是核心对象,全流程操作这三个核心对象,通过责任链的方式,每个环节解耦。