Raft實(shí)現(xiàn)報(bào)告(19)
客戶端的交互
本篇將會(huì)介紹客戶端如何與Raft交互,包括客戶端如何找到集群的leader,以及Raft如何支持線性化語(yǔ)義。這些問(wèn)題適用于所有基于共識(shí)的系統(tǒng),Raft的解決方案與其他系統(tǒng)類似。
Raft的客戶端將所有請(qǐng)求發(fā)送給leader。當(dāng)客戶端第一次啟動(dòng)時(shí),他會(huì)連接到隨機(jī)選擇的服務(wù)器。如果客戶端的首選不是leader,則該服務(wù)器將拒絕客戶端的請(qǐng)求并提供有關(guān)它所聽(tīng)到的最新的leader的信息(AppendEntries請(qǐng)求包括leader的網(wǎng)絡(luò)地址)。如果leader崩潰,客戶端請(qǐng)求會(huì)超時(shí);客戶端然后使用隨機(jī)選擇的服務(wù)器重試。
我們對(duì)Raft的目標(biāo)是實(shí)現(xiàn)可線性化的語(yǔ)義。然而,到目前為止,Raft可以多次執(zhí)行命令:例如,如果leader在提交日志條目后但在響應(yīng)客戶端之前崩潰,則客戶端將使用新的leader重試命令,導(dǎo)致他被執(zhí)行了多幾秒的時(shí)間。解決方案是讓客戶為每一個(gè)命令分配唯一的序列號(hào)。然后,狀態(tài)機(jī)跟蹤為每個(gè)客戶端處理的最新序列號(hào)以及相關(guān)響應(yīng)。如果他收到一個(gè)序列號(hào)已經(jīng)被執(zhí)行過(guò)的命令,他會(huì)立即響應(yīng)而不重新執(zhí)行一次。