Make the Easy Change Hard
9 months ago
- #Rust
- #Software Development
- #Kubernetes
- 文章探讨了一个软件开发格言:'先让困难变更变得容易,再完成容易的变更',强调在实施修改前应通过重构代码来实现这一目标。
- 作者描述了在SimKube项目中反其道而行之的经历:由于Kubernetes资源所有权的复杂性,先故意将简单变更复杂化,再处理核心难题。
- 在Kubernetes中,资源可通过OwnerReferences建立父子关系,SimKube的追踪器组件正是监控这种关系来捕获集群变更以实现模拟重放。
- 当同时追踪父子资源(如Deployment和ReplicaSet)时会出现问题:追踪器和Kubernetes控制器会重复创建相同资源,导致模拟数据冗余。
- 解决方案是改造追踪器使其忽略被追踪资源拥有的子资源,这需要将原本基于Arc<Mutex<TraceStore>>的结构重构为基于通道通信的架构,以提升性能和设计合理性。
- 重构过程暴露了Rust异步编程的诸多挑战:需在标准库与tokio原语间抉择、处理通道可变接收器问题、确保动态创建通道的'static生命周期等。
- 最终作者意识到必须在导出阶段(而非摄入阶段)过滤被拥有的资源才能避免竞态条件,这引发了更深层次的重构。
- 相关改进已随SimKube 2.4.0版本发布,显著提升了资源追踪精度和模拟准确性。