我在木筏上遇到了问题。
在论文《寻找一种可理解的共识算法(扩展版)》中写道:
要开始选举,追随者会增加其当前任期并过渡到候选状态。(第 5.2 节)
它还说:
AppendEntries RPC 和 RequestVot RPC 中的接收者应为“Reply false if args.term < currentTerm”
所以,让我们想象一下这个场景,raft系统中有5台机器,现在机器0是leader,机器1到4是follower,现在是term 1。突然,机器1断开网络,然后机器1超时,并且它开始选举领导者,它发送RequestVot RPC,肯定会失败(网络断开)。然后它将开始新的领导者选举......等等。机器1的项是增加很多倍。也许增加到10。当机器1'Term增加到10时,它连接了网络。领导者(机器0)向机器1发送心跳,机器1将拒绝该心跳(机器0的期限小于机器1),现在机器1将无法重新加入系统。
在 GO net/http Response Body 注释中说:
调用者有责任关闭 Body。默认 HTTP 客户端的 Transport 不会尝试重用 HTTP/1.0 或 HTTP/1.1 TCP 连接(“保持活动”),除非 Body 被读取完成并关闭。
这意味着:如果我使用 http.Get 并且不调用 resp.Body.Close() 那么它不会恢复 HTTP/1.0 或 HTTP/1.1 TCP 连接(“保持活动”)是吗?
所以我写了一些代码:
包主进口 ( “时间” “FMMT” “io/ioutil” “网络/http” )
函数主() { resp, err := http.Get(" http://127.0.0.1:8588 ")
Run Code Online (Sandbox Code Playgroud)if err != nil { panic(err) } _, err = ioutil.ReadAll(resp.Body) if err != nil { panic(err) } resp2, err := http.Get("http://127.0.0.1:8588") if err != nil { panic(err) } _, err = ioutil.ReadAll(resp2.Body) if …