知识卡片
复制字典再整体替换实现无锁并发读
内容
Orderer创建新应用通道时(Registrar.newChain()),不是直接往保存所有通道链支持对象的chains字典里插入新键,而是先把整个字典复制一份到临时变量,在副本上添加新通道后,再把多通道注册管理器上的chains字段整体替换成这个新字典。这样,Broadcast/Deliver服务处理句柄在读取chains字典时永远读到的是某个完整一致的版本,不会读到”正在插入中”的中间状态,也不需要为这个高频读、低频写的字典加互斥锁——这是Go里常见的”写时复制”(copy-on-write)思路:用一次性的整体替换换取读路径完全无锁。
参考来源
《Hyperledger Fabric技术内幕:架构设计与实现原理》第2章《Orderer排序节点》