[Zookeeper] 소스 분석 서버 (4) 의 FollowerZooKeeperServer

7414 단어
1. 앞말
앞에서 LeaderZooKeeperServer를 분석한 다음에 FollowerZooKeeperServer를 분석합니다.
2. FollowerZooKeeperServer 소스 분석
2.1류의 계승 관계
public class FollowerZooKeeperServer extends LearnerZooKeeperServer {}

설명: LearnerZooKeeperServer 추상 클래스를 상속하고 역할은 Follower입니다.요청 처리 체인은 FollowerRequestProcessor->CommitProcessor->FinalRequestProcessor입니다.
2.2 클래스의 속성
public class FollowerZooKeeperServer extends LearnerZooKeeperServer {
    private static final Logger LOG =
        LoggerFactory.getLogger(FollowerZooKeeperServer.class);
    //  
    CommitProcessor commitProcessor;
    
    //  
    SyncRequestProcessor syncProcessor;

    /*
     * Pending sync requests
     */
    //  
    ConcurrentLinkedQueue pendingSyncs;
    
    //  
    LinkedBlockingQueue pendingTxns = new LinkedBlockingQueue();
}

설명: FollowerZooKeeperServer는 제출 요청 프로세서와 동기화 요청 프로세서를 유지하고 있으며, 동기화 요청 대기열과 처리할 업무 요청 대기열을 모두 유지합니다.
2.3 클래스의 구조 함수
    FollowerZooKeeperServer(FileTxnSnapLog logFactory,QuorumPeer self,
            DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
        super(logFactory, self.tickTime, self.minSessionTimeout,
                self.maxSessionTimeout, treeBuilder, zkDb, self);
        //  pendingSyncs
        this.pendingSyncs = new ConcurrentLinkedQueue();
    }

설명: 부모 클래스의 구조 함수를 먼저 호출한 다음pendingSyncs를 빈 대기열로 초기화합니다.
2.4 핵심 함수 분석
  1. logRequest 함수
    public void logRequest(TxnHeader hdr, Record txn) {
        //  
        Request request = new Request(null, hdr.getClientId(), hdr.getCxid(),
                hdr.getType(), null, null);
        //  、 、zxid
        request.hdr = hdr;
        request.txn = txn;
        request.zxid = hdr.getZxid();
        if ((request.zxid & 0xffffffffL) != 0) { // zxid 0, 
            //  pendingTxns 
            pendingTxns.add(request);
        }
        //  SyncRequestProcessor ( , )
        syncProcessor.processRequest(request);
    }

설명: 이 함수는 요청을 기록하여 처리를 기다립니다.
  2.commit 함수
    public void commit(long zxid) {
        if (pendingTxns.size() == 0) { //  
            LOG.warn("Committing " + Long.toHexString(zxid)
                    + " without seeing txn");
            return;
        }
        //  zxid
        long firstElementZxid = pendingTxns.element().zxid;
        if (firstElementZxid != zxid) { //  zxid zxid, 
            LOG.error("Committing zxid 0x" + Long.toHexString(zxid)
                    + " but next pending txn 0x"
                    + Long.toHexString(firstElementZxid));
            System.exit(12);
        }
        //  
        Request request = pendingTxns.remove();
        //  
        commitProcessor.commit(request);
    }

설명: 이 함수는 zxid에 대응하는 요청 (pendingTxns의 첫 번째 요소) 을 제출하고, 먼저 첫 번째 요청에 대응하는 zxid가 전송된 zxid인지 판단한 다음 제거 및 제출 (committed Requests 대기열에 넣기) 합니다.
  3. sync 함수
    synchronized public void sync(){
        if(pendingSyncs.size() ==0){ //  
            LOG.warn("Not expecting a sync.");
            return;
        }
        //  
        Request r = pendingSyncs.remove();
        //  
        commitProcessor.commit(r);
    }

설명: 이 함수는 동기화 요청 대기열에 있는 요소를 제출하고committedRequests 대기열에 요청합니다.
3. 총결산
이 글은 FollowerZooKeeper Server의 원본 코드를 배웠는데 그 핵심은 동기화 요청과 처리할 사무 요청을 서로 다른 요청 프로세서에 맡기는 것이다.원우 여러분들도 봐주셔서 감사합니다 ~

좋은 웹페이지 즐겨찾기