[Zookeeper] 소스 분석 서버(3)의 LeaderZooKeeperServer
앞에서 ZooKeeperServer 원본을 분석했는데 QuorumZooKeeperServer의 원본이 상대적으로 간단하기 때문에 LeaderZooKeeperServer를 직접 분석했다.
2. LeaderZooKeeperServer 소스 분석
2.1류의 계승 관계
public class LeaderZooKeeperServer extends QuorumZooKeeperServer {}
설명: LeaderZooKeeperServer는 QuorumZooKeeperServer 추상 클래스를 계승하고 ZooKeeperServer의 많은 방법을 계승합니다.
2.2 클래스의 속성
public class LeaderZooKeeperServer extends QuorumZooKeeperServer {
//
CommitProcessor commitProcessor;
}
설명: 커밋 프로세서 클래스는 하나만 있습니다. 요청 프로세서를 제출하는 것을 나타냅니다. 처리 체인의 위치는 Proposal Request Processor 다음, To Be Applied Request Processor 이전입니다.
2.3 클래스의 구조 함수
LeaderZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self,
DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException {
super(logFactory, self.tickTime, self.minSessionTimeout,
self.maxSessionTimeout, treeBuilder, zkDb, self);
}
설명: 상위 클래스 QuorumZooKeeper Server의 구조 함수를 직접 호출한 다음 ZooKeeper Server의 구조 함수를 단계별로 호출합니다.
2.4 핵심 함수 분석
1.setupRequestProcessors 함수
protected void setupRequestProcessors() {
// FinalRequestProcessor
RequestProcessor finalProcessor = new FinalRequestProcessor(this);
// ToBeAppliedRequestProcessor
RequestProcessor toBeAppliedProcessor = new Leader.ToBeAppliedRequestProcessor(
finalProcessor, getLeader().toBeApplied);
// CommitProcessor
commitProcessor = new CommitProcessor(toBeAppliedProcessor,
Long.toString(getServerId()), false);
// CommitProcessor
commitProcessor.start();
// ProposalRequestProcessor
ProposalRequestProcessor proposalProcessor = new ProposalRequestProcessor(this,
commitProcessor);
// ProposalProcessor
proposalProcessor.initialize();
// firstProcessor PrepRequestProcessor
firstProcessor = new PrepRequestProcessor(this, proposalProcessor);
// PrepRequestProcessor
((PrepRequestProcessor)firstProcessor).start();
}
설명: 이 함수는 처리 체인을 생성하는 것을 나타냅니다. 처리 체인의 순서는 PrepRequestProcessor-> ProposalRequestProcessor-> CommitProcessor-> Leader입니다.ToBeAppliedRequestProcessor -> FinalRequestProcessor.
2.registerJMX 함수
protected void registerJMX() {
// register with JMX
try {
// DataTreeBean
jmxDataTreeBean = new DataTreeBean(getZKDatabase().getDataTree());
//
MBeanRegistry.getInstance().register(jmxDataTreeBean, jmxServerBean);
} catch (Exception e) {
LOG.warn("Failed to register with JMX", e);
jmxDataTreeBean = null;
}
}
설명: 이 함수는 JMX 서비스를 등록하는 데 사용됩니다. 먼저 DataTree를 사용하여 DataTreeBean을 초기화한 다음에 DataTreeBean과 ServerBean을 사용하여register 함수를 호출하여 등록합니다. 그 원본은 다음과 같습니다.
public void register(ZKMBeanInfo bean, ZKMBeanInfo parent)
throws JMException
{
// bean
assert bean != null;
String path = null;
if (parent != null) { // parent(ServerBean)
// parent bean2Path path
path = mapBean2Path.get(parent);
// path
assert path != null;
}
//
path = makeFullPath(path, parent);
if(bean.isHidden())
return;
//
ObjectName oname = makeObjectName(path, bean);
try {
// Server
mBeanServer.registerMBean(bean, oname);
// bean path mapBean2Path
mapBean2Path.put(bean, path);
// name bean mapName2Bean
mapName2Bean.put(bean.getName(), bean);
} catch (JMException e) {
LOG.warn("Failed to register MBean " + bean.getName());
throw e;
설명:parent를 통해 경로를 가져와 이름을 만들고 bean을 등록한 다음 해당 필드를 mBeanServer와mapBean2Path에 넣으면 등록 과정이 완료됩니다.
3.unregisterJMX 함수
protected void unregisterJMX() {
// unregister from JMX
try {
if (jmxDataTreeBean != null) {
//
MBeanRegistry.getInstance().unregister(jmxDataTreeBean);
}
} catch (Exception e) {
LOG.warn("Failed to unregister with JMX", e);
}
jmxDataTreeBean = null;
}
설명: 이 함수는 JMX 서비스 등록을 취소하는 데 사용되며, unregister 함수를 호출합니다. 원본은 다음과 같습니다.
public void unregister(ZKMBeanInfo bean) {
if(bean==null)
return;
//
String path=mapBean2Path.get(bean);
try {
//
unregister(path,bean);
} catch (JMException e) {
LOG.warn("Error during unregister", e);
}
// mapBean2Path mapName2Bean bean
mapBean2Path.remove(bean);
mapName2Bean.remove(bean.getName());
}
설명: unregister와register의 과정은 정반대이고 bean을 제거하는 과정입니다.
3. 총결산
이 편은 LeaderZooKeeperServer의 원본 코드를 배웠습니다. 그 원본 코드는 매우 간단합니다. 주로 등록 및 등록 취소 서비스와 관련됩니다. 대부분의 논리는 ZooKeeperServer의 방법을 직접 사용할 수 있습니다. 또한 원우 여러분의 시청에 감사드립니다~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.