前言
本篇文章主要介绍 写时复制(COW)相关知识。通过阅读你会有如下收获:
1. 什么是 写时复制的思想?
2. 如何通过CopyOnWriteArraySet来实现一个RPC框架中的路由表 ?
3. Java中使用COW的工具类应该注意哪些问题 ?
一. 什么是COW
Copy-on-Write,缩写为COW或者CoW,顾名思义就是写时复制。 Copy-on-Write 更多地体现的是一种延时策略,只有在真正需要复制的时候才复制,而不是提前复制好。
例如,Unix创建进程的API是fork(),会创建父进程的一个完整副本,如父进程占用1G内存,fork()子进程要复制父进程的整个内存,非常耗时;Linux系统fork()子进程,先不复制,让父子进程共享同一个地址空间;只用在父进程或者子进程需要写入的时候才会复制地址空间,从而使父子进程拥有各自的地址空间。
除此之外,很多其他领域也都能看到 Copy-on-Write 的身影:Docker 容器镜像的设计是 Copy-on-Write,甚至分布式源码管理系统 Git 背后的设计思想都有 Copy-on-Write
二. 实战
1. 需求
RPC 框架的一个核心任务就是维护服务的路由关系,我们可以把服务的路由关系简化成下图所示的路由表。当服务提供方上线或者下线的时候,就需要更新客户端的这张路由表。