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)] A

If 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

target: T

The identity that failed to reply to the original Ping in a timely manner.

probe_number: ProbeNumber

See foca::ProbeNumber

Receiver is being asked to Ping target on their behalf and should emit IndirectPing(sender) to target

IndirectPing

Fields

origin: T

The identity that started the indirect cycle. I.e.: whoever sent the unanswered Ping.

probe_number: ProbeNumber

See foca::ProbeNumber

Analogous to Ping, with added metadata about the original requesting member. Recipient should reply IndirectAck(origin) to sender

IndirectAck

Fields

target: T

The identity that started the indirect cycle. I.e.: whoever sent the unanswered Ping.

probe_number: ProbeNumber

See foca::ProbeNumber

Analogous to Ack, with added metadta about the final destination. Recipient should emit ForwardedAck(sender) to target

ForwardedAck

Fields

origin: T

The identity that failed to reply to the original Ping in a timely manner.

probe_number: ProbeNumber

See 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

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Deserialize this value from the given Serde deserializer. Read more

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an Instrumented wrapper. Read more

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The resulting type after obtaining ownership.

Creates owned data from borrowed data, usually by cloning. Read more

🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more