全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-24 15 分钟 ✍️ juanwangdev

ZooKeeper ZAB协议源码实现

深入源码理解ZAB协议实现细节。

ZAB协议源码实现

核心类结构

角色作用
LeaderZooKeeperServerLeader处理写请求、发起提议
FollowerZooKeeperServerFollower接收提议、参与投票
LearnerHandlerLeader管理每个Follower连接
CommitProcessor全角色提交处理流水线

Leader请求处理链

Java
PrepRequestProcessor 
  → ProposalRequestProcessor 
  → CommitProcessor 
  → FinalRequestProcessor

关键源码分析

Leader发送提议

Java
// ProposalRequestProcessor.java
public void processRequest(Request request) {
    zks.getLeader().propose(request);  // 发送提议
    zks.getLeader().forwardToFollowers(request);  // 转发给Follower
}

Leader.propose()方法

Java
public void propose(Request request) {
    // 创建Proposal
    Proposal proposal = new Proposal(request);
    // 设置ZXID
    proposal.zxid = getNextZxid();
    // 加入提议队列
    outstandingProposals.add(proposal);
    // 发送给所有Learner
    for (LearnerHandler f : learners) {
        f.sendPacket(proposal);
    }
}

Follower处理提议

Java
// FollowerRequestProcessor.java
public void run() {
    while (running) {
        Request request = queuedRequests.take();
        // 发送ACK给Leader
        follower.writePacket(new Ack(request.zxid), false);
    }
}

Leader收集ACK

Java
// LearnerHandler.java
public void run() {
    while (true) {
        QuorumPacket qp = readPacket();
        if (qp.getType() == Leader.ACK) {
            // 更新ACK计数
            leader.processAck(qp.getZxid(), qp.getTag());
        }
    }
}

提示:核心实现集中在Leader和LearnerHandler类中。

两阶段提交优化

传统2PC问题

问题说明
同步阻塞参与者等待协调者
网络往返多提议+投票+提交三次
性能瓶颈等待全部确认

ZAB优化设计

异步提交

Java
// Leader收到过半ACK后立即提交
public void processAck(long zxid, long sender) {
    Proposal proposal = outstandingProposals.get(zxid);
    proposal.addAck(sender);
    
    if (proposal.hasQuorum()) {
        // 过半确认,立即提交
        commit(zxid);
        // 不等待全部Follower确认
    }
}

流水线处理

Java
// Leader持续发提议,不必等前一个提交
public void propose(Request request) {
    // 异步发送,不阻塞
    sendPacket(proposal);
    // 继续处理下一个请求
}

批处理优化

text
// LearnerHandler批量发送
public void sendPackets() {
    List<Proposal> batch = new ArrayList<>();
    while (!toSend.isEmpty()) {
        batch.add(toSend.poll());
        if (batch.size() >= BATCH_SIZE) {
            sendBatch(batch);
            batch.clear();
        }
    }
}

优化效果对比

方式吞吐量
传统2PC
ZAB异步
ZAB流水线

优化总结

优化效果
过半提交不等全部,减少延迟
流水线连续提议,吞吐提升
批处理减少网络往返

注意:流水线+批处理是ZAB高性能的核心设计。

要点总结

  • LeaderZooKeeperServer处理写请求和提议
  • FollowerZooKeeperServer接收提议并投票
  • LearnerHandler管理Follower连接和ACK收集
  • 处理链:Prep→Proposal→Commit→Final
  • 过半ACK立即提交,不等全部
  • 流水线连续提议,批处理减少网络往返
  • 异步提交+流水线是性能优化核心

📝 发现内容有误?点击此处直接编辑

← 上一篇 ZooKeeper Epoch与数据同步机制
下一篇 → ZooKeeper JVM与磁盘调优
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库