《阿里云产品四月刊》—得物 ZooKeeper SLA 也可以 99.99%丨最佳实践(5)https://developer.aliyun.com/article/1554136
优化探索
锁的优化
在默认版本中,使用的 HashSet 是线程不安全的。在这个版本中,相关操作方法如addWatch 、 removeWatcher 和 triggerWatch 都 是 通 过 在 方 法 上 添 加 了synchronized 重型锁来实现的。而在优化版中,采用了 ConcurrentHashMap 和ReadWriteLock 的组合,以更精细化地使用锁机制。这样一来,在添加 Watch 和触发 Watch 的过程中能够实现更高效的操作。
存储优化
这是关注的重点。从 WatchManager 的分析可以看出, 使用 WatchTables 和Watch2Paths 存储效率并不高。如果 ZNode 的订阅关系较多,将会额外消耗大量无效的内存。
感到惊喜的是,WatchManagerOptimized 在这里使用了“黑科技” -> 位图。利用位图将关系存储进行了大量的压缩,实现了降维优化。
Java BitSet 主要特点:
空间高效:BitSet 使用位数组存储数据,比标准的布尔数组需要更少的空间。
处理快速:进行位操作(如 AND、OR、XOR、翻转)通常比相应的布尔逻辑操作更快。动态扩展:BitSet 的大小可以根据需要动态增长,以容纳更多的位。
BitSet 使用一个 long[] words 来存储数据,long 类型占 8 字节,64 位。数组中每个元素可以存储 64 个数据,数组中数据的存储顺序从左到右,从低位到高位。比如下
图中的 BitSet 的 words 容量为 4,words[0] 从低位到高位分别表示数据 0~63 是否存在,words[1] 的低位到高位分别表示数据 64~127 是否存在,以此类推。其中words[1] = 8,对应的二进制第 8 位为 1,说明此时 BitSet 中存储了一个数据 {67}。
《阿里云产品四月刊》—得物 ZooKeeper SLA 也可以 99.99%丨最佳实践(7)https://developer.aliyun.com/article/1554134