《阿里云产品四月刊》—得物 ZooKeeper SLA 也可以 99.99%丨最佳实践(3)https://developer.aliyun.com/article/1554138
WatchTables【正向查询表】
HashMap>
场景:某个 ZNode 发生变化,订阅该 ZNode 的 Watcher 会收到通知。
逻辑:用该 ZNode,通过 WatchTables 找到对应的所有 Watcher 列表,然后逐个发通知。
Watch2Paths【逆向查询表】
HashMap
场景:统计某个 Watcher 到底订阅了哪些 ZNode。
逻辑:用该 Watcher,通过 Watch2Paths 找到对应的所有 ZNode 列表。Watcher 本质是 NIOServerCnxn,可以理解成一个连接会话。
如果 ZNode、和 Watcher 的数量都比较多,并且客户端订阅 ZNode 也比较多,甚至全量订阅。这两张 Hash 表记录的关系就会呈指数增长,最终会是一个天量!
当全订阅时,如图演示:
当 ZNode 数 量 :3,Watcher 数 量 :2 WatchTables 和 Watch2Paths 会 各 有 6 条关系。
当 ZNode 数 量 :4,Watcher 数 量 :3 WatchTables 和 Watch2Paths 会 各 有 12 条关系。
通过监控发现,异常的 ZK-Node。ZNode 数量大概有 20W,Watcher 数量是 5000。而 Watcher 与 ZNode 的关系条数达到了 1 亿。
如果存储每条关系的需要 1 个 HashMap&Node(32Byte), 由于是两个关系表, double 一下。那么其它都不要计算,光是这个“壳”,就需要 2*10000^2*32/1024^3
= 5.9GB 的无效内存开销。
《阿里云产品四月刊》—得物 ZooKeeper SLA 也可以 99.99%丨最佳实践(5)https://developer.aliyun.com/article/1554136