美文网首页
sofa-jraft线性一致读实现

sofa-jraft线性一致读实现

作者: zhangsean | 来源:发表于2020-02-05 18:20 被阅读0次

    线性一致读

    实现api

    //NodeImpl
    readIndex(final byte[] requestContext, final ReadIndexClosure done)
    

    调用readIndex后

    1. 把请求添加到队列readIndexQueue (disruptor队列)

    2. 添加后被ReadIndexEventHandler处理 (如果生产速度过快32个一批)

    3. 构造请求ReadIndexRequest, 调用NodeImpl.handleReadIndexRequest处理,根据Node是leader还是follwer执行不同的操作

    4. leader

      • 记录lastCommittedIndex

      • 向所有的peer发送心跳,过半节点心跳反馈后,触发ReadIndexResponseClosure的run方法。

      • 如果lastCommittedInde未提交则批量请求都等待

      • 如果lastCommittedInde已提交,则批量的请求都释放,见ReadIndexClosure (核心代码ReadIndexResponseClosure.notifySuccess)

        private void notifySuccess(final ReadIndexStatus status) {
            final long nowMs = Utils.monotonicMs();
            final List<ReadIndexState> states = status.getStates();
            final int taskCount = states.size();
            for (int i = 0; i < taskCount; i++) {
                final ReadIndexState task = states.get(i);
                final ReadIndexClosure done = task.getDone(); // stack copy
                if (done != null) {
                    this.nodeMetrics.recordLatency("read-index", nowMs - task.getStartTimeMs());
                    done.setResult(task.getIndex(), task.getRequestContext().get());
                    done.run(Status.OK());
                }
            }
        }
        

        ReadIndexClosure.run核心代码会执行用户定义的run方法

        public void run(final Status status) {
            run(status, this.index, this.requestContext);
        }
        
    5. follower

      • 向leader发送readIndex rpc请求
      • leader执行一次readIndex, 返回leader的readIndex给follower
      • 等待收到的readIndex已经apply,执行donw

    相关文章

      网友评论

          本文标题:sofa-jraft线性一致读实现

          本文链接:https://www.haomeiwen.com/subject/actexhtx.html