首先需要搞清什么是 inFlight,inFlight 在 Raft 中存储的是已发送给 Follower 的 MsgApp 消息,但没有收到 MsgAppResp 的消息 Index 值。简单的说就是 Leader 发送一个消息给 Follower,Leader 在对应的 Follower 状态维护结构(progress)中,将这个消息的 ID 记录在 inFlight 中, 当 Follower 收到消息之后,告知 Leader 收到了这个 ID 的消息,Leader 将从 inFlight 中删除,表示 Follower 已经接收,否则如果 Follower 在指定时间内没有响应,Leader 会根据一定策略进行重发。
今天主要讲的是 inFlight 的设计思路,个人觉得挺有意思。Raft 中的 inFlight 是通过一个具有最大长度(size)的数组([]uint64)构造成一个环形数组。
主要文件
/raft/tracker/inflights.go inflight 的实现
源码
type Inflights struct {
start int //记录最旧的那个未被响应的消息,在buffer中的位置
count int //已发送,但未响应的消息总数
size int //buffer的最大长度
buffer []uint64 //存储ID值
}
1.inFlight 通过 start、count、size 使 buffer 形成一个环形数组,流程如下:
(1)初始状态