zookeeper之acl 張飛的繡花針
眾所周知,內存資源總是有限的;
即便是java程序員,我們依然要考慮在使用低內存的情況下,高效地實現業務目標,構建優秀的軟體,這是成為一個優秀的架構師的必經之路;
今天我們就和大家分享下,zookeeper 的acl的緩存存儲,其主要的類是ReferenceCountedACLCache;
主要成員變數
其中
longKeyMap 和 aclKeyMap 分別是acl集合信息和acl整形值之間建立的hashmap;
referenceCounter: 是一個許可權值引用計數器;
aclIndex: acl許可權編號;
許可權新建
當我們創建節點的時候,可以看到datatree.java中createnode中有一行這樣的代碼
該代碼是將我們會話中的acl集合信息轉換為long,也就是ReferenceCountedACLCache中的convertAcls,首先它會在aclKeyMap中查詢是否有該acl集合信息,如果沒有,就生成acl編號aclIndex,其實就是aclIndex 1;然後將這個值添加到longKeyMap 和aclKeyMap,這裡的目的是為了建立一個aclIndex 和 acl的關係;最後再調用addUsage,而addUsage如下代碼所示;
由addUsage的代碼可以看出其主要就是存儲該acl有多少個節點引用了;
許可權獲取
上面是創建,那麼在我們查詢許可權的時候,就可以先獲得某個節點,然後通過該節點的acl,就可以獲取對應的acl集合信息;即下列代碼
zookeeper這種設計的思想,如下圖所示
設計的好處
各節點上的信息,只保存了acl的整形值,這個整形值就是對acl緩存的引用值,而真正的acl集合信息在緩存ReferenceCountedACLCache,對於datatree整個樹形結構來說節省了大量的內存;
※深入淺析一致性模型之Linearizability
※推進微服務落地的 7 個步驟
TAG:千鋒JAVA開發學院 |