pub enum Message<T> {
Ping(ProbeNumber),
Ack(ProbeNumber),
PingReq {
target: T,
probe_number: ProbeNumber,
},
IndirectPing {
origin: T,
probe_number: ProbeNumber,
},
IndirectAck {
target: T,
probe_number: ProbeNumber,
},
ForwardedAck {
origin: T,
probe_number: ProbeNumber,
},
Announce,
Feed,
Gossip,
Broadcast,
}Expand description
Messages are how members request interaction from each other.
There are a few different kind of interactions that may occur:
Direct Probe Cycle
Foca will periodically check if members are still active. It
sends a Ping to said member and expects an Ack in return.
If B takes too long to reply with an Ack, the indirect
probe cycle starts.
Indirect Probe Cycle
A previously pinged member may be too busy, its reply may have been dropped by an unreliable network or maybe it’s actually down.
The indirect probe cycle helps with getting more certainty about its current state by asking other members to execute a ping on our behalf.
Here, member A will ask member C to ping B on their
behalf:
A ->[PingReq(B)] C
C ->[IndirectPing(A)] B
B ->[IndirectAck(A)] C
C ->[ForwardedAck(B)] AIf by the end of the full probe cycle (direct and indirect) Foca
has received either an Ack or a ForwardedAck, the member is
considered active. Otherwise the member is declared State::Suspect
and will need to refute it before the configured deadline
else it will be declared State::Down.
“Join” sub-protocol
Foca instances can join a cluster by sending Announce messages
to one or more identities. If a recipient decides to accept it,
it replies with a Feed message, containing other active cluster
members.
Variants
Ping(ProbeNumber)
A Ping message. Replied with Ack.
Ack(ProbeNumber)
Acknowledment of a Ping. Reply to Ping.
PingReq
Fields
probe_number: ProbeNumberSee foca::ProbeNumber
Receiver is being asked to Ping target on their behalf
and should emit IndirectPing(sender) to target
IndirectPing
Fields
probe_number: ProbeNumberSee foca::ProbeNumber
Analogous to Ping, with added metadata about the original
requesting member.
Recipient should reply IndirectAck(origin) to sender
IndirectAck
Fields
probe_number: ProbeNumberSee foca::ProbeNumber
Analogous to Ack, with added metadta about the final
destination.
Recipient should emit ForwardedAck(sender) to target
ForwardedAck
Fields
probe_number: ProbeNumberSee foca::ProbeNumber
The result of a successful indirect probe cycle. Sender
is indicating that they’ve managed to ping and receive
an ack from origin
Announce
Request to join a cluster. Replied with Feed.
Feed
Response to a Announce, signals that the remaining bytes in the
payload will be a sequence of active members, instead of just
cluster updates. Reply to Announce.
Gossip
Deliberate dissemination of cluster updates. Non-interactive, doesn’t expect a reply.
Broadcast
Deliberate dissemination of custom broadcasts. Broadcast messages do not contain cluster updates.
Trait Implementations
sourceimpl<'de, T> Deserialize<'de> for Message<T> where
T: Deserialize<'de>,
impl<'de, T> Deserialize<'de> for Message<T> where
T: Deserialize<'de>,
sourcefn 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>,
Deserialize this value from the given Serde deserializer. Read more
impl<T> StructuralPartialEq for Message<T>
Auto Trait Implementations
impl<T> RefUnwindSafe for Message<T> where
T: RefUnwindSafe,
impl<T> Send for Message<T> where
T: Send,
impl<T> Sync for Message<T> where
T: Sync,
impl<T> Unpin for Message<T> where
T: Unpin,
impl<T> UnwindSafe for Message<T> where
T: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcefn clone_into(&self, target: &mut T)
fn clone_into(&self, target: &mut T)
toowned_clone_into)Uses borrowed data to replace owned data, usually by cloning. Read more
sourceimpl<T> WithSubscriber for T
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
Attaches the provided Subscriber to this type, returning a
WithDispatch wrapper. Read more
sourcefn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber to this type, returning a
WithDispatch wrapper. Read more