这是由Kubernetes创始人发表的论文,总结了基于容器的分布式系统的设计模式,让我们来一览究竟吧。
论文认为,继OOP(面向对象编程)所引领的软件开发革命之后,如今似乎在分布式系统开发中也发生着一场相似的革命:基于容器化组件构建的微服务架构。
容器的一大独特优势在于:良好的边界——恰好适合应用开发的隔离性。
作者总结了一些设计模式,并且分为三大类型:
Single-container management patterns
- 容器的传统接口有run(), pause(), stop()
-
可以有更丰富的接口
- “向上看”的视角:metrics, config, logs等,通常用HTTP+JSON来暴露
- “向下看”的视角:lifecycle(提供生命周期回调钩子), priority(为了空出资源给高优先级任务,甚至能提前关掉低优先级任务),"replicate yourself"(迅速创建一组相同的服务容器来应对突发流量)
接下来两类都依赖Pod抽象(Kubernetes有提供),因为都涉及容器编排了,而且已进入Sevice Mesh这门新概念的范围。
Single-node, multi-container application patterns
多个容器组成一个原子单位
Sidecar模式
- 例如:web server + log collector
- 前提是容器间能共享“存储卷”之类的资源
为什么要用多容器,而非容器内多进程?
- 资源审计和分配:这点很重要,虽然多进程也勉强能做,但多容器做得更成熟
- 职责划分、解耦
- 重用:如果一个容器包含多种进程,就笨重而难以重用了,小巧的单用途容器更适合重用
- 故障隔离:重启一个容器,比修复容器内的故障进程要容易多了
- 交付隔离:每个容器能独立地升级/降级
Ambassador模式
- 类似于OOP的proxy模式
- 例如:memcache + twemproxy,考虑到本分类为单结点多容器模式,因此twemproxy要和其中1个memcache部署到同一结点上
- 前提是容器间能共享localhost网络接口
Adapter模式
- 例如:统一的metrics接口(JMX,statsd等统一收集到HTTP端点)
- 可以免于修改已有的容器(因为已经以容器作为软件开发的单位了)
Multi-node application patterns
Leader election模式
- 领导者选举这件事已经有很多库了,但往往对编程语言有所限定
- 容器则对编程语言中立
- 容器只需构建一次就能重用,高度贯彻了抽象和封装的原则
Work queue模式
- 传统的工作队列框架对编程语言有所限定
- 实现了run(), mount()接口的容器,可作为“工作”的抽象
- 基于此可打造一种通用的工作队列框架(可能是Kubernetes的未来方向)
- 虽然没给例子,但有些类似Mesos的可插拔调度器架构
Scatter/gather模式
- 这样传递请求:client->root->server
- root结点把请求分发给很多servers,再把它们的响应汇总到一起,交给client
- 例如:搜索引擎,分布式查询引擎
- 多个leaf容器+1个merge容器,就能实现通用的scatter/gather框架(可能也是Kubernetes的未来方向)
结语
总之,论文将容器视为软件开发的一等公民,像OOP的对象一样重要,提倡单用途可组合可重用的容器。
这似乎是对UNIX编程艺术的重申。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。