6.824 Raft Lab2A
Make()函数到底要做什么?
- 初始化
rf
。只要照着论文的Figure2左上角State那些赋值就行。 - 启动一些背景go程(background goroutines)。
- 这个实验中只需要2个背景go程:1个处理选举超时,1个处理心跳超时。两个都让它永远不停地运行。(即使我现在不是Leader,也可以运行心跳go程,只要超时的时候判断一下当前state就行了。)
- 超时发生的时候直接在本go程内处理Figure2右下角Rules for Servers那些事。当然要判断一下当前
state
是Follower、Candidate、Leader的哪一种,然后执行相应的逻辑。比如Follower和Candidate在选举超时发生时要开启新的一轮election。Leader在心跳超时发生时要向所有人发送心跳。
程序结构
- 不需要用到通道(channel)!我看到github上很多人都用了channel,至少用一个来通知超时。还有人用channel来通知state改变。其实没必要。
- 两个背景go程分别处理2种超时。为什么不合起来?因为超时发生后处理的逻辑不同,因为超时重置的时机不同,所以最好分开写。
- 每个RPC都要实现接收和发送两个部分。比如
RequestVote
函数,就是该RPC的接受者部分。sendRequestVote
函数实现发送者的逻辑。 - 每个sendRequestVote、sendAppendEntries调用都要用go语句调用,让它们独立go程运行。这样才能同时向所有