一、前言
前面分析了FollowerZooKeeperServer,接著分析ObserverZooKeeperServer。
二、ObserverZooKeeperServer原始碼分析
2.1 類的繼承關係
public class ObserverZooKeeperServer extends LearnerZooKeeperServer {}
說明:ObserverZooKeeperServer也繼承了LearnerZooKeeperServer抽象類,角色為Observer,其請求處理鏈為ObserverRequestProcessor -> CommitProcessor -> FinalRequestProcessor。可能會存在SyncRequestProcessor。
2.2 類的屬性
public class ObserverZooKeeperServer extends LearnerZooKeeperServer { // 日誌 private static final Logger LOG = LoggerFactory.getLogger(ObserverZooKeeperServer.class); /** * Enable since request processor for writing txnlog to disk and * take periodic snapshot. Default is ON. */ // 同步處理器是否可用 private boolean syncRequestProcessorEnabled = this.self.getSyncEnabled(); /* * Request processors */ // 提交請求處理器 private CommitProcessor commitProcessor; // 同步請求處理器 private SyncRequestProcessor syncProcessor; /* * Pending sync requests */ // 待同步請求佇列 ConcurrentLinkedQueue<Request> pendingSyncs = new ConcurrentLinkedQueue<Request>(); }
說明:該類維護了提交請求處理器和同步請求處理器,同時維護一個待同步請求的佇列,是否使用同步請求處理器要根據其標誌而定。
2.3 類的建構函式
ObserverZooKeeperServer(FileTxnSnapLog logFactory, QuorumPeer self, DataTreeBuilder treeBuilder, ZKDatabase zkDb) throws IOException { // 父類建構函式 super(logFactory, self.tickTime, self.minSessionTimeout, self.maxSessionTimeout, treeBuilder, zkDb, self); LOG.info("syncEnabled =" + syncRequestProcessorEnabled); }
說明:其會呼叫父類建構函式進行初始化操作,同時可確定此時同步請求處理器是否可用。
2.4 核心函式分析
1. commitRequest函式
public void commitRequest(Request request) { if (syncRequestProcessorEnabled) { // 同步處理器可用 // Write to txnlog and take periodic snapshot // 使用同步處理器處理請求 syncProcessor.processRequest(request); } // 提交請求 commitProcessor.commit(request); }
說明:若同步處理器可用,則使用同步處理器進行處理(放入同步處理器的queuedRequests佇列中),然後提交請求(放入提交請求處理器的committedRequests佇列中)。
2. sync函式
synchronized public void sync(){ if(pendingSyncs.size() ==0){ // 沒有未完成的同步請求 LOG.warn("Not expecting a sync."); return; } // 移除隊首元素 Request r = pendingSyncs.remove(); // 提交請求 commitProcessor.commit(r); }
說明:若還有未完成的同步請求,則移除該請求,並且進行提交。
三、總結
本篇博文分析了ObserverZooKeeperServer的原始碼,其核心也是請求處理鏈對於請求的處理。至此,ZooKeeper的原始碼分析就告一段落了,其中之分析了部分原始碼,還有很多的沒有分析到,之後在使用過程中遇到則再進行分析,也謝謝各位園友的觀看~