[Zookeeper] 소스 분석 서버 (4) 의 FollowerZooKeeperServer
앞에서 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의 원본 코드를 배웠는데 그 핵심은 동기화 요청과 처리할 사무 요청을 서로 다른 요청 프로세서에 맡기는 것이다.원우 여러분들도 봐주셔서 감사합니다 ~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.