SOFAJRaft 日志复制 - pipeline 实现剖析 | SOFAJRaft 实现原理

Raft算法实现 - Sofa-JRaft,选主,数据写入,日志复制 关于raft算法相关细节,可以全看之前的文章 分布式一致性算法,两阶段提交,三阶段提交,Paxos,Raft,zookeeper的选主过程,zab协议,顺序一致性,数据写入流程,节点状态,节点的角色 这里我们说下阿里开源的sofa-jraft的实现。 首先说明下,在sofa-jraft有几个比较重要的角色 Node 代表的就是一个服务节点 Ballot 代表的是一次投票的相关信息 PeerId 代表的是一个复制组里面的一个参与角色 JRaft的投票有两个步骤preVote和vote,之所以要增加一个pr 阅读详情

SOFAStack(Scalable Open Financial Architecture Stack) 是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。

640?wx_fmt=png

SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景。

本文为《剖析 | SOFAJRaft 实现原理》第六篇,本篇作者徐家锋,来自专伟信息,力鲲,来自蚂蚁金服。《剖析 | SOFAJRaft 实现原理》系列由 SOFA 团队和源码爱好者们出品,项目代号:<SOFA:JRaftLab/>,文章尾部有参与方式,欢迎同样对源码热情的你加入。

SOFAJRaft:

https://github.com/sofastack/sofa-jraft

本文的目的是要介绍 SOFAJRaft 在日志复制中所采用的 pipeline 机制,但是作者落笔时突然觉得这个题目有些唐突,我们不应该假设读者理所应当的对日志复制这个概念已经了然于胸,所以作为一篇解析,我觉得还是应该先介绍一下 SOFAJRaft 中的日志复制是要解决什么问题。

概念介绍 

SOFAJRaft 是对 Raft 共识算法的 Java 实现。既然是共识算法,就不可避免的要对需要达成共识的内容在多个服务器节点之间进行传输,在 SOFAJRaft 中我们将这些内容封装成一个个日志块 (LogEntry),这种服务器节点间的日志传输行为在 SOFAJRaft 中也就有了专门的术语:日志复制。

为了便于阅读理解,我们用一个象棋的故事来类比日志复制的流程和可能遇到的问题。

假设我们穿越到古代,要为一场即将举办的象棋比赛设计直播方案。当然所有电子通讯技术此时都已经不可用了,幸好象棋比赛是一种能用精简的文字描述赛况的项目,比如:“炮二平五”, “马8进7”, “车2退3”等,我们将这些描述性文字称为棋谱。这样只要我们在场外同样摆上棋盘 (可能很大,方便围观),通过棋谱就可以把棋手的对弈过程直播出来。

640?wx_fmt=png

图1 - 通过棋谱直播

所以我们的直播方案就是:赛场内两位棋手正常对弈,设一个专门的记录员来记录棋手走出的每一步,安排一个旗童飞奔于赛场内外,棋手每走一步,旗童就将其以棋谱的方式传递给场外,这样观众就能在场外准实时的观看对弈的过程,获得同观看直播相同的体验。

640?wx_fmt=png

图2 - 一个简单的直播方案

这便是 SOFAJRaft 日志复制的人肉版,接下来我们完善一下这个“直播系统”,让它逐步对齐真实的日志复制。

改进1. 增加记录员的数量 

假设我们的比赛获得了很高的关注度,我们需要在赛场外摆出更多的直播场地以供更多的观众观看。

640?wx_fmt=png

图3 - 更多的直播平台

这样我们就要安排更多的旗童来传递棋谱,场外的每一台直播都需要一个旗童来负责,这些旗童不停的在赛场内外奔跑传递棋谱信息。有的直播平台离赛场远一些,旗童要跑很久才行,相应的直播延迟就会大一些,而有些直播平台离得很近,对应的旗童就能很快的将对弈情况同步到直播。

随着直播场地的增加,负责记录棋局的记录员的压力就会增加,因为他要针对不同的旗童每次提供不同的棋谱内容,有的慢有的快。如果记录员一旦记混了或者眼花了,就会出现严重的直播事故(观众看到的不再是棋手真正的棋局)。

640?wx_fmt=png

图4 - 压力很大的记录员

为此我们要作出一些优化,为每个场外的直播平台安排一个专门的记录员,这样 “赛局-记录员-旗童-直播局” 就构成了单线模式,专人专职高效可靠。

640?wx_fmt=png

图5 - “赛局-记录员-旗童-直播棋局”

改进2. 增加旗童每次传递的信息量 

起初我们要求棋手每走一步,旗童就向外传递一次棋谱。可是随着比赛进行,其弊端也逐渐显现,一方面记录员记录了很多棋局信息没有传递出去,以至于不得不请求棋手停下来等待 (不可思议);另一方面,场外的观众对于这种“卡帧”的直播模式也很不满意。

所以我们做出改进,要求旗童每次多记几步棋,这样记录员不会积攒太多的待直播信息,观众也能一次看到好几步,而这对于聪明的旗童来说并不是什么难事,如此改进达到了共赢的局面。

640?wx_fmt=png

图6 - 旗童批量携带信息

改进3. 增加快照模式 

棋局愈发精彩,应棋迷的强烈要求,我们临时增加了几个直播场地,这时棋手已经走了很多步了,按照我们的常规手段,负责新直播的记录员和旗童需要把过去的每一步都在直播棋盘上还原一遍(回放的过程),与此同时棋手还在不断下出新的内容。

从直觉上来说这也是一种很不聪明的方式,所以这时我们采用快照模式,不再要求旗童传递过去的每一步棋谱,而是把当前的棋局图直接描下来,旗童将图带出去后,按照图谱直接摆子。这样新直播平台就能快速追上棋局进度,让观众欣赏到赛场同步的棋局对弈了。

640?wx_fmt=png

图7 - 采用快照模式

改进4. 每一个直播平台用多个旗童传递信息

虽然我们之前已经在改进 2 中增加了旗童每次携带的信息量,但是在一些情况下(棋手下快棋、直播平台很远等),记录员依然无法将信息及时同步给场外。这时我们需要增加多个旗童,各旗童有次序的将信息携带到场外,这样记录员就可以更快速的把信息同步给场外直播平台。

640?wx_fmt=png

图8 - 利用多个旗童传递信息,实现 pipeline 效果

现在这个人肉的直播平台在我们的逐步改进下已经具备了 SOFAJRaft 日志复制的下面几个主要特点:

特点1:被复制的日志是有序且连续的 

如果棋谱传递的顺序不一样,最后下出的棋局可能也是完全不同的。而 SOFAJRaft 在日志复制时,其日志传输的顺序也要保证严格的顺序,所有日志既不能乱序也不能有空洞 (也就是说不能被漏掉)。

640?wx_fmt=png

图9 - 日志保持严格有序且连续

特点2:复制日志是并发的 

SOFAJRaft 中 Leader 节点会同时向多个 Follower 节点复制日志,在 Leader 中为每一个 Follower 分配一个 Replicator,专用来处理复制日志任务。在棋局中我们也针对每个直播平台安排一个记录员,用来将对弈棋谱同步给对应的直播平台。

640?wx_fmt=png

图10 - 并发复制日志

特点3:复制日志是批量的 

SOFAJRaft 中 Leader 节点会将日志成批的复制给 Follower,就像旗童会每次携带多步棋信息到场外。

640?wx_fmt=png

图11 - 日志被批量复制

特点4:日志复制中的快照 

在改进 3 中,我们让新加入的直播平台直接复制当前的棋局,而不再回放过去的每一步棋谱,这就是 SOFAJRaft 中的快照 (Snapshot) 机制。用 Snapshot 能够让 Follower 快速跟上 Leader 的日志进度,不再回放很早以前的日志信息,即缓解了网络的吞吐量,又提升了日志同步的效率。

特点5:复制日志的 pipeline 机制 

在改进 4 中,我们让多个旗童参与信息传递,这样记录员和直播平台间就可以以“流式”的方式传递信息,这样既能保证信息传递有序也能保证信息传递持续。

在 SOFAJRaft 中我们也有类似的机制来保证日志复制流式的进行,这种机制就是 pipeline。Pipeline 使得 Leader 和 Follower 双方不再需要严格遵从 “Request - Response - Request” 的交互模式,Leader 可以在没有收到 Response 的情况下,持续的将复制日志的 AppendEntriesRequest 发送给 Follower。

在具体实现时,Leader 只需要针对每个 Follower 维护一个队列,记录下已经复制的日志,如果有日志复制失败的情况,就将其后的日志重发给 Follower。这样就能保证日志复制的可靠性,具体细节我们在源码解析中再谈。

640?wx_fmt=png

图12 - 日志复制的 pipeline 机制

源码解析 

上面就是日志复制在原理层面的介绍,而在代码实现中主要是由 Replicator 和 NodeImpl 来分别实现 Leader 和 Follower 的各自逻辑,主要的方法列于下方。在处理源码中有三点值得我们关注。

640?wx_fmt=png

图13 - 相关的方法

关注1: Replicator 的 Probe 状态

640?wx_fmt=png

图14 - Replicator 的状态

Leader 节点在通过 Replicator 和 Follower 建立连接之后,要发送一个 Probe 类型的探针请求,目的是知道 Follower 已经拥有的的日志位置,以便于向 Follower 发送后续的日志。

640?wx_fmt=png

图15 - 发送探针来知道 follower 的 logindex

关注2: 用 Inflight 来辅助实现 pipeline

Inflight 是对批量发送出去的 logEntry 的一种抽象,他表示哪些 logEntry 已经被封装成日志复制 request 发送出去了。

640?wx_fmt=png

图16 - Inflight 结构

Leader 维护一个 queue,每发出一批 logEntry 就向 queue 中 添加一个代表这一批 logEntry 的 Inflight,这样当它知道某一批 logEntry 复制失败之后,就可以依赖 queue 中的 Inflight 把该批次 logEntry 以及后续的所有日志重新复制给 follower。既保证日志复制能够完成,又保证了复制日志的顺序不变。

这部分从逻辑上来说比较清晰,但是代码层面需要考虑的东西比较多,所以我们在此处贴出源码,读者可以在源码中继续探索。

640?wx_fmt=png

图17 - 复制日志的主要方法

640?wx_fmt=png

图18 - 添加 Inflight 到队列中

当然在日志复制中其实还要考虑更加复杂的情况,比如一旦发生切换 leader 的情况,follower 该如何应对,这些问题希望大家能够进入源码来寻找答案。

关注3: 通信层采用单线程 & 单链接

在 pipeline 机制中,虽然我们在 SOFAJRaft 层面通过 Inflight 队列保证了日志是被有序的复制,对于乱序传输的 LogEntry 通过各种异常流程去排除掉,但是这些被排除掉的乱序日志最终还是要通过重传来保证最终成功,这就会影响日志复制的效率。

640?wx_fmt=png

图19 - 通信层不能保证有序

如上图所示,发送端的 Connection Pool 和 接收端的 Thread Pool 都会让原本“单行道”上有序传输的日志进入“多车道”,因而无法保证有序。所以在通信层面 SOFAJRaft 做了两部分优化去尽量保证 LogEntry 在传输中不会乱序。

1. 在 Replicator 端,通过 uniqueKey 对日志传输所用的 Url 进行特殊标识 ,这样 SOFABolt (SOFAJRaft 底层所采用的通信框架) 就会为这种 Url 建立单一的连接,也就是发送端的 Connection Pool 中只有一条可用连接。

640?wx_fmt=png

图20 - 通过 uniqueKey 定制 Url

2. 在接收端不采用线程池派发任务,增加判断 _dispatch_msg_list_in_default_executor_ 使得我们可以通过 io 线程直接将任务投递到 Processor 中。我们对 SOFABolt 做过一些功能增强,这里提供相关 PR #84 ,有兴趣的读者可以前往了解。

PR #84:

https://github.com/sofastack/sofa-bolt/pull/84

640?wx_fmt=png

图21 - SOFABolt 利用 IO 线程派发 AppendEntriesRequest 到 Processor

这样日志复制的通信模型就变成了我们期望的“单行道”的模式。这种“单行道”能够很大程度上保证传输的日志是有序且连续的,从而提升了 pipeline 的效率。

640?wx_fmt=png

图22 - 优化通信模型

总结 

日志复制并不是一个复杂的概念,pipeline 机制也是一种符合直觉思维的优化方式,甚至在我们的日常生活中也能找到这些概念的实践。在 SOFAJRaft 中,日志复制的真正难点是如何在分布式环境下既考虑到各种细节和异常,又保证高性能。本文只是从概念上尝试介绍了日志复制,更多的细节还需读者进入代码去寻找答案。

SOFAJRaft 源码解析系列阅读

本文归档在 sofastack.tack 网站,点击“阅读原文”即可查看。

640?wx_fmt=png

SOFAJRaft 源码分析二(日志复制、心跳) 1.概述 今天来看一下jraft的日志复制,其实读源码并不一定需要完全理解其逻辑,更重要的是对于需求的实现方式。如果能深刻领悟,应用的自己的工作中,是非常有意义的。 2.日志同步架构 其实主要依赖Replicator、LogManager、LogStorage这三个实现。 Replicator,leader发送日志和心跳的功能就是在此实现。每个leader>>都会有一个ReplicatorGroup,用来管理所有followers LogManager用于处理日志,主要就是消费复制或者app 阅读详情

相关推荐

焦距与视差的关系及其对深度估计的影响

焦距在立体视觉中的作用至关重要,它直接影响视差的大小,从而影响深度估计的精度。焦距越长,视差差异越大,物体的深度估计就越精确。这一关系使得焦距长的相机在一些需要高精度深度估计的应用场景中更加优越。了解焦距与视差的关系,对于优化相机配置和提升深度估计精度具有重要意义。在实践中,选择合适的焦距对于获得精确的深度信息至关重要,特别是在自动驾驶、虚拟现实、三维重建等领域,精确的深度估计能够提供更好的用户体验和技术支持。

计算机科学与技术专业学生的成长之路 1671

SOFAJRaft 选举机制剖析 | SOFAJRaft 实现原理

我们在本文中采用了类比的方式来剖析源码,主要是为了让读者能更容易的理解如何在分布式环境中达成共识,其实这也是整个 SOFAJRaft 要实现的目标。行文至此,作者感觉已经把选举说清楚了,如果还有没提到的地方,或者一些流程中的分支任务,欢迎从源码中进一步寻找答案。最后贴出上面提到的四个方法的源码。图14 - preVote 预投票图15 - electSelf 投票图16 - handlePreVoteRequest 处理预投票图17 - handleRequestVoteRequest 处理投票。

summer_fish的专栏 642

STM32实战:5分钟搞定MXL90614红外测温模块的I2C驱动(附完整代码)

本文提供了一份快速集成MLX90614红外测温模块的STM32实战指南。通过详细的软件I2C驱动代码,重点解析了SMBus通信协议、CRC校验及温度数据转换,帮助开发者避开常见陷阱,实现5分钟内完成模块驱动并读取准确温度值。

wasm7browser的博客 353

分布式锁详解

1.Redis是基于它的命令执行是单线程的这个特性,所以在获取数据的时候不会有并发问题来去做分布式锁的,其中Redisson客户端,对分布式锁进行了很好的包装,redisson分布式锁 基于lua+hash来实现加锁逻辑,同时利用Redis的发布与订阅以及seamphore来实现锁的等待。2.zk的分布式锁,主要是基于zk的临时有序节点+watch机制来实现的,每个线程去尝试加锁都会创建一个临时有序节点,然后拿锁的时候,判断是否是最小的那几个节点,如果不是,就线程安全的去监听上一个节点。

刘皇叔说Java的博客 1278

从ADC校准到精准测量:避开PY32F030小信号采样的那些坑

本文深入探讨了PY32F030微控制器进行ADC小信号采样时面临的挑战与解决方案。从硬件设计、软件滤波算法到系统级校准策略,详细分析了如何避开常见陷阱,实现精准测量,特别是在25mV以下小信号场景中的应用实践。

ujm567890的博客 758

金蝶ERP元数据解析:字段属性与表结构映射实战

本文深入解析金蝶ERP元数据的核心价值与应用实践,详细介绍了字段属性与表结构映射的关键技术。通过缓存获取与工具类直连两种方案对比,结合实际案例展示元数据在数据库校验、动态表单生成等场景的应用,帮助开发者高效解决二次开发中的常见问题。

weixin_33738555的博客 433

分布式共识算法 (Consensus Algorithm)

分布式共识算法 (Consensus Algorithm) 如何理解分布式共识? 多个参与者针对某一件事达成完全一致:一件事,一个结论 已达成一致的结论,不可推翻 有哪些分布式共识算法? Paxos:被认为是分布式共识算法的根本,其他都是其变种,但是 paxos 论文中只给出了单个提案的过程,并没有给出复制状态机中需要的 multi-paxos 的相关细节的描述,实现 paxos 具有很高的工程复杂度(如多点可写,允许日志空洞等) Zab:被应用在 zookeeper 中,业界使用广泛,...

INGNIGHT的专栏 5776

从零开始的立绘拆包教程

蓝毒小天使天下第一! 本文拆包教程不限于明日方舟,在后面也会给出其他手游的拆包教程,例如少女前线 首先拆包最简单的无非就是拆取游戏资源,例如游戏立绘,音频,视频等,再深层次一点有拆取游戏配置文件,apk反编译得到部分源码 在本文,我们只介绍拆取游戏资源和对游戏资源的后期处理(因为另外两个讲道理我也没太搞懂,虽然可以提取游戏配置文件,但似乎大部分重要的数据都有加密,反编译出来的源码也只是部分,...

Conyrol的博客 9万+

SOFAJRaft-RheaKV 分布式锁实现剖析 | SOFAJRaft 实现原理

SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构...

金融级分布式架构 1525

华硕天选3 win11+ubuntu20.04双硬盘双系统配置(包括ubuntu重启后无法成功进入、没有wifi图标的设置)

1、制作系统盘 2、分区 3、重启电脑按F2

baidu_38431960的博客 1万+

踩遍Windows所有坑:Codex CLI桌面端+命令行双环境安装避坑实战

Windows下装Codex CLI的坑,本质上都是Windows本身的路径、环境变量、权限、编码这些历史遗留问题,和工具本身关系不大。只要避开中文路径、正确配置PATH、注意终端环境差异,其实安装非常简单。这套双环境方案配好之后,桌面端适合可视化调试、多会话管理,终端适合嵌入编辑器、脚本调用,一套配置两边通用,体验还是很流畅的。按照上面的流程走,基本不会出大问题,就算出问题也能在排查表里找到对应解法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 299

SOFAJRaft-RheaKV MULTI-RAFT-GROUP 实现分析 | SOFAJRaft 实现原理

SOFAStack (Scalable Open Financial Architecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架...

金融级分布式架构 1179

【Unity实战】实现最完美最简单的UI适配方案,背景压缩或者拉伸变形解决方案,手机刘海屏适配,适配不同分辨率,不同尺寸,不同设备。

这期来讲一个简单的UI设计方案,很多同学可能搞不懂锚点、轴心这些概念,导致做好的UI在别人的设备上,乱跑或者是重叠,或者是参加游戏老发时间比较紧来不及做适配,都可以来试试这个方法,通过填充边框来保持游戏画面的原始比例,所以它的缺点也很明显,在一些移动设备上会浪费比较大的显示面积。 unity不同设备UI变形? UI在不同设备上如何适配?

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3650

dataguard日志传输模式解析_SOFAJRaft 日志复制 - pipeline 实现剖析 | SOFAJRaft 实现原理

SOFAStack(Scalable Open Financial Architecture Stack)是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景。本文为《剖析 | SOFAJ...

weixin_39700548的博客 184

通达信文件解密-脱壳版

通达信文件解密-脱壳版可以解密和加密通达信embui.dai和Connect.cfg等文件

efence2416调试内存

#cd efence_2_4_16#make //即产生libefence.so.0.0动态库electric-fence程序一越界立即coredump,然后启动cgdb调试调试openssl非常好用

考虑题4所示的日志记录_SOFAJRaft 日志复制 pipeline 实现剖析 | SOFAJRaft 实现原理...

SOFAStack(Scalable Open Financial Architecture Stack) 是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。SOFAJRaft 是一个基于 Raft 一致性算法的生产级高性能 Java 实现,支持 MULTI-RAFT-GROUP,适用于高负载低延迟的场景。本文为《剖析 | ...

weixin_34229578的博客 222

【2026年8月】最新wsl.2.7.11.0安装包下载

包含docker+wsl.2.7.11.0+wsl_update全套包

SOFA Weekly | 每周精选【8/5 - 8/9】

SOFA WEEKLY | 每周精选,筛选每周精华问答同步开源进展,欢迎留言互动SOFAStack(Scalable Open Financial Architectur...

金融级分布式架构 222

TDC-GP22的使用手册

本资源包含TDC-GP22的使用手册,TDC芯片寄存器的官方配置,本人基于stm32写的TDC-GP22寄存器配置程序,TDC-GP22的接线图和一个用文档方式写的注意事项

5个关键步骤:从零开始掌握SOFAJRaft分布式一致性框架

SOFAJRaft是一个基于Raft一致性算法的生产级高性能Java实现,专为高负载、低延迟的分布式场景设计。它提供了完整的Raft算法实现,包括领导者选举、日志复制、成员变更等核心功能,帮助开发者快速构建可靠的分布式系统。 ## 🚀 快速部署指南:搭建你的第一个Raft集群 ### 环境准备与项目构建 首先确保你的开发环境满足以下要求: - JDK 1.8或更高版本 - Maven 3.

gitblog_00788的博客 798

SOFAJRaft 日志复制共识算法

Raft 分组中的一个节点,连接封装底层的所有服务,用户看到的主要服务接口,特别是 apply(task) 用于向 raft group 组成的复制状态机集群提交新任务应用到业务状态机。StateMachine: 用户核心逻辑的实现,核心是 onApply(Iterator) 方法,应用通过 Node#apply(task) 提交的日志到业务状态机。 FSMCaller: (Finite State Machine),封装对业务 StateMachine 的状态转换的调用以及日志的写入等,一个有限状态机的实

谢文峰的博客 1015

共同学习|Spring Cloud Alibaba一一服务日志+Nacos集群

在整个微服务架构中,微服务很多,一个请求可能需要调佣很多很多的服务,最终才能完成一个功能,如果说,整个功能出现了问题,在这么多的服务中,如何去定位到问题的所在点,出现问题的原因是什么?

Jum的博客 1459

从一个例子开始体验 SOFAJRaft | SOFAChannel#8 直播整理

SOFA:Channel/,有趣实用的分布式架构频道。 本文根据 SOFAChannel#8 直播分享整理,主题:从一个例子开始体验 SOFAJRaft。 回顾视频以及 PPT 查看地址见文末。 欢迎加入直播互动钉钉群:23390449,不错过每场直播。 大家好,我是力鲲,来自蚂蚁金服,...

710

SOFAJRaft-RheaKV 是如何使用 Raft 的 | SOFAJRaft 实现原理

SOFAStackScalable Open Financial Architecture Stack是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。本文为《剖析 | SOFAJRaft 实现原理》第二篇,本篇作者米麒麟,来自陆金所。《剖析 | SOFAJRaft 实现原理》系列由 SOFA 团队和源码爱好者们出品,项目代号:&l...

weixin_34189116的博客 522

科普: 中间件底层实现的分布式协议之Raft

正式介绍 Raft 协议之前,我们先来举一个例子????进行展开。 方式一: 在一个技术团队内假设角色都是均等的,会导致什么情况呢?产品提出一个需求,就可以随便去找团队中的任意一个人去发起需求。如果这个人因为请假走了,但是他没有把需求及时同步给团队其他人,因此会导致该需求存在很大的延迟。 方式二: 在技术团队中选举一个Leader 角色,产品提出的需求必须优先提给 Leader,找 Lead...

dayformyjob 729

浅谈Etcd中Raft库的实现

随便说说Etcd中Raft的实现,能够理解Raft库的核心

weixin_46253576的博客 619

Raft中Batching和pipelining到底是什么?

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34224941的博客 508
上一篇: SOFA Weekly | 每周精选【7/29 - 8/2】
下一篇: SOFA Weekly | 每周精选【8/5 - 8/9】
SOFAStack
博客等级 码龄7年 747粉丝 389原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值