Skip to main content

DistributedBus

Struct DistributedBus 

Source
pub struct DistributedBus { /* private fields */ }
Expand description

Clustered EventBus: a doorbell over the durable store (spec §3.2).

Implementations§

Source§

impl DistributedBus

Source

pub async fn connect(url: &str, store: Arc<dyn Store>) -> Result<Self>

Build a bus on its own pool. Each live subscription pins one connection for its LISTEN, so the pool is sized above sqlx’s default of 10 to allow a useful SSE fan-out before subscribe/publish start queuing on the pool; raise it further (or share a pool) for high-fan-out deployments.

Source

pub fn new(pool: PgPool, store: Arc<dyn Store>) -> Self

Build a bus on an existing pool (shared-pool wiring — size the pool for the SSE fan-out, since each subscription pins a LISTEN connection).

Source

pub async fn subscribe_all_ready(&self) -> Result<BusSubscription>

EventBus::subscribe_all, but the LISTEN is established before this returns rather than lazily on the stream’s first poll (#132).

The lazy form cannot tell a caller when it is safe to publish. A doorbell rung in the gap is simply not heard, and because the per-key high-water starts at 0, the miss is only repaired by the next doorbell for that key — which, for a stream that just went quiet, may never come. Ringing repeatedly and hoping is what the #132 test was doing, and it still starved to zero deliveries on a contended runner.

Connection and LISTEN failures surface here as an Err instead of silently ending the stream, which is the other thing the lazy form cannot express.

Trait Implementations§

Source§

impl EventBus for DistributedBus

Source§

fn publish(&self, event: FleetEvent)

Fan an event out to current subscribers. Never blocks on slow/absent receivers (delivery is best-effort relative to the durable store).
Source§

fn subscribe(&self, stream_key: &str) -> BusSubscription

A live subscription to one stream’s events. The returned stream yields only events whose stream key equals stream_key; consumers dedup the initial-history/live overlap on seq.
Source§

fn subscribe_all(&self) -> BusSubscription

A live subscription to EVERY stream’s events, unfiltered. Needed by fleet-wide watchers (e.g. FleetManager::watch_changes) that can’t name a stream key in advance — a brand-new agent’s own id keys its AgentDiscovered event, so no one can pre-subscribe to it by key.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

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

fn in_current_span(self) -> Instrumented<Self> ⓘ

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

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

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