ZooKeeper - 服務器角色 - Follower

Follower

主要工作:

  • 處理客戶端的非事務請求,將事務請求轉發給Leader服務器
  • 參與事務請求proposal的投票
  • 參與Leader選舉的投票

FollowerZooKeeperServer

類的繼承關係
public class FollowerZooKeeperServer extends LearnerZooKeeperServer 
類的屬性
public class FollowerZooKeeperServer extends LearnerZooKeeperServer {
    private static final Logger LOG =
        LoggerFactory.getLogger(FollowerZooKeeperServer.class);

    CommitProcessor commitProcessor;

    SyncRequestProcessor syncProcessor;

    /*
     * 待同步請求
     */
    ConcurrentLinkedQueue<Request> pendingSyncs;
	
	/*
	 * 待處理的事務請求
	 */
	LinkedBlockingQueue<Request> pendingTxns = new LinkedBlockingQueue<Request>();
}
類的構造函數
	FollowerZooKeeperServer(FileTxnSnapLog logFactory,QuorumPeer self,
            DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
        super(logFactory, self.tickTime, self.minSessionTimeout,
                self.maxSessionTimeout, treeBuilder, zkDb, self);
        this.pendingSyncs = new ConcurrentLinkedQueue<Request>();
    }
核心函數分析
	public void logRequest(TxnHeader hdr, Record txn) {
        Request request = new Request(null, hdr.getClientId(), hdr.getCxid(),
                hdr.getType(), null, null);
        request.hdr = hdr;
        request.txn = txn;
        request.zxid = hdr.getZxid();
		
		/*
		 * zxid不爲0,表示本服務器已經處理過請求
		 */
        if ((request.zxid & 0xffffffffL) != 0) {
        	// 則需要將該請求放入pendingTxns中
            pendingTxns.add(request);
        }
		
		// 使用SyncRequestProcessor處理請求
        syncProcessor.processRequest(request);
    }
	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;
        // 如果隊首元素的zxid不等於需要提交的zxid,則退出程序
        if (firstElementZxid != 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);
    }
	synchronized public void sync(){
		// 沒有需要同步的請求
        if(pendingSyncs.size() ==0){
            LOG.warn("Not expecting a sync.");
            return;
        }
         
        // 從待同步隊列中刪除隊首請求      
        Request r = pendingSyncs.remove();
        // 提交該請求
		commitProcessor.commit(r);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章