pub enum Message {
Show 14 variants
PreCampaign {
last_index: Index,
last_term: Term,
},
PreCampaignResponse {
vote: bool,
},
Campaign {
last_index: Index,
last_term: Term,
},
CampaignResponse {
vote: bool,
},
Heartbeat {
last_index: Index,
commit_index: Index,
read_seq: ReadSequence,
},
HeartbeatResponse {
match_index: Index,
read_seq: ReadSequence,
},
Append {
base_index: Index,
base_term: Term,
entries: Vec<Entry>,
},
AppendResponse {
match_index: Index,
reject_index: Index,
},
Read {
seq: ReadSequence,
},
ReadResponse {
seq: ReadSequence,
},
ClientRequest {
id: RequestID,
request: Request,
},
ClientResponse {
id: RequestID,
response: Result<Response>,
},
InstallSnapshot {
last_included_index: Index,
last_included_term: Term,
data: Vec<u8>,
membership: MembershipEntry,
},
InstallSnapshotResponse {
last_included_index: Index,
},
}Expand description
Raft 节点之间发送的消息。消息异步发送(非请求/响应模式),可能丢失或乱序。
实践中它们经 TCP 连接与 crossbeam channel 传递;只要连接保持,通常不会丢失或乱序。 一条消息及其响应走各自独立的出站 TCP 连接。
Variants§
PreCampaign
预投票请求(Pre-vote):不提升任期、不持久化投票。 用于在真正选举前确认能否获得多数,避免分区节点抬升任期打断稳定领导。
PreCampaignResponse
预投票响应。不持久化。
Campaign
候选人向同伴拉票竞选领导者。 仅当候选人的日志至少与投票者一样新时才会被授予选票。
CampaignResponse
跟随者每个任期只能投一票,且仅当候选人的日志至少与自己一样新时才投票。 候选人隐式投票给自己。
Heartbeat
领导者发送的周期性心跳,作用包括:
- 告知节点当前领导者,并阻止选举。
- 检测丢失的 append / read,作为重试机制。
- 推进跟随者的 commit 索引,以便它们应用条目。
Raft 论文没有独立的心跳消息,而是使用空的 AppendEntries RPC; 这里单独定义以便职责更清晰。
Fields
read_seq: ReadSequence领导者在本任期内最新的读序列号。
HeartbeatResponse
跟随者在仍认可其为领导者时,对心跳作出响应。
Fields
read_seq: ReadSequence心跳中的读序列号。
Append
领导者在给定 base 条目之后,向跟随者追加日志条目以进行复制。
若 base 条目与跟随者日志匹配,则两边日志在此之前完全一致(见论文 5.3 节), 可以追加(可能替换冲突条目)。否则拒绝追加,领导者需用更早的 base 索引重试, 直到找到公共 base。
空 append(无条目)用于在日志分叉、节点重启或消息丢失时探测公共 match 索引。 通常通过递减 base 索引探测,匹配后再发送后续条目。
Fields
AppendResponse
跟随者根据 base 条目是否匹配本地日志,接受或拒绝领导者的 append。
Fields
Read
领导者在提供读服务前需确认自己仍是领导者,以保证线性一致性 (防止别处已选出新领导者)。读请求在序列号被多数派确认后才执行。
Fields
seq: ReadSequenceReadResponse
跟随者确认该读序列号下的领导权。
Fields
seq: ReadSequenceClientRequest
客户端请求。可提交给领导者,或提交给跟随者由后者转发给领导者。
若无领导者,或领导者/任期变更,请求会以 Error::Abort 的
ClientResponse 中止,客户端必须重试。
ClientResponse
客户端响应,通常透传给状态机。
InstallSnapshot
安装快照(整包;教学实现不分块)。
Fields
membership: MembershipEntryInstallSnapshotResponse
快照安装确认。
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Message
impl<'de> Deserialize<'de> for Message
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl StructuralPartialEq for Message
Auto Trait Implementations§
impl Freeze for Message
impl RefUnwindSafe for Message
impl Send for Message
impl Sync for Message
impl Unpin for Message
impl UnsafeUnpin for Message
impl UnwindSafe for Message
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more