zookeeper的client源碼理解

##Watcher接口 實現Watcher的類是一個回調函數,process中實現的方法,會在znode變動的時候觸發html

interface Watcher() {
// 不太懂爲啥在Wacher中又定義了一個interface
    public interface Event(){        
        public enum EventType{}
    }
    abstract public void process(WatcherEvent event){}
}

調用zookeeper.create的時候要求傳入權限控制參數(ACL),找了文章發如今UNIX中權限的管理仍是頗有意思的: http://ifeve.com/zookeeper-access-control-using-acls/ 有空能夠繼續研究一下java

##繼續看zookeeper 發如今構造函數的實現中,有兩個Thread。這個就有意思了,爲啥在構造函數中有Thread?能夠繼續追蹤下去node

SendThread sendThread = new SendThread(clientCnxnSocket); 
ReadThread eventThread = new EventThread();

查閱資料能夠了解到zookeeper實現了一個事件驅動模型,先貼一張圖或許有助於理解:函數

來源http://www.wangjingfeng.com/38.html

來源http://www.wangjingfeng.com/38.htmlcode

class sendThread {
    void run() {
        // 實現NIO
        // pendingQueue等待響應的packet,outgoingQueue等待發送的packet
        //int waitTimeOut, List<Packet> pendingQueue, LinkedList<Packet> outgoingQueue,ClientCnxn cnxn
        clientCnxnSocket.doTransport(waitTimeOut, pendingQueue, outgoingQueue,cnxn){};
    }   
}

###EventThread -> BlockedQueue -> SendThead 經過加鎖固定長度的隊列實現消費者模型,同時sendThread使用了java自帶的NIO技術,每次輪詢全部的selector,處理已經傳輸完成的selector。很好的實現瞭解耦。 ##一些其餘classserver

class ClientCnxn {
    // ClientCnxn是一個管理I/O的類, 包含了一系列的可用的servers,而且控制這些servers的開關
    
}
class AuthData {
    String scheme;
    byte data[];
}
static class Packet {
    RequestHeader requestHeader;
    ReplyHeader replyHeader;
    Record request;
    Record response;
    ByteBuffer bb;
    AsyncCallBack cb;
}
class EventThread {
    void queueEvent(WatcherEvent watcherEvent){}
    void queuePacket(Packet packet){}
    void processEvent(Object event){
        WatcherSetEventPair pair = (WatcherSetEventPair) event;
        watcher = pair.watchers;
        watcher.process(pair.event);
    }
}
public class ClientCnxnSocketNio{
    
}
相關文章
相關標籤/搜索