#[non_exhaustive]pub struct OutboxRelay {
pub store: Arc<dyn OutboxStore>,
pub publisher: Arc<dyn OutboxPublisher>,
pub poll: Duration,
pub batch: usize,
pub leader: Option<(DistributedLock, Arc<dyn DLockBackend>)>,
}Expand description
Background poll → publish → ack loop. At-least-once: an entry is acked
only after a successful publish, so a crash between the two replays it —
consumers must dedupe on idempotency_key.
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.store: Arc<dyn OutboxStore>§publisher: Arc<dyn OutboxPublisher>§poll: Duration§batch: usize§leader: Option<(DistributedLock, Arc<dyn DLockBackend>)>Leader election: when set, only the replica holding this lock drains the outbox each tick — others skip silently. Eliminates duplicate publishing across a fleet (consumers still dedupe on idempotency_key for the at-least-once edge cases).
Implementations§
Source§impl OutboxRelay
impl OutboxRelay
Sourcepub fn new(
store: Arc<dyn OutboxStore>,
publisher: Arc<dyn OutboxPublisher>,
) -> Self
pub fn new( store: Arc<dyn OutboxStore>, publisher: Arc<dyn OutboxPublisher>, ) -> Self
Defaults: 500ms poll, batch 32, no leader election.
pub fn poll(self, v: Duration) -> Self
pub fn batch(self, v: usize) -> Self
Sourcepub fn leader(
self,
lock: DistributedLock,
backend: Arc<dyn DLockBackend>,
) -> Self
pub fn leader( self, lock: DistributedLock, backend: Arc<dyn DLockBackend>, ) -> Self
Enable leader election: only the lock holder drains each tick.
Sourcepub fn spawn(self)
pub fn spawn(self)
Spawn the relay. Call from ArclyPlugin::on_start; the task dies with
the runtime, so graceful shutdown needs no extra plumbing.
Drain-aware: once a shutdown signal flips the process drain flag the relay stops claiming new batches — pending rows are durable and the next leader picks them up. Backoff: consecutive fetch failures double the wait (up to 8× the poll interval) instead of hammering a struggling store at full poll rate.
Auto Trait Implementations§
impl !RefUnwindSafe for OutboxRelay
impl !UnwindSafe for OutboxRelay
impl Freeze for OutboxRelay
impl Send for OutboxRelay
impl Sync for OutboxRelay
impl Unpin for OutboxRelay
impl UnsafeUnpin for OutboxRelay
Blanket Implementations§
Source§impl<T> AggregateExpressionMethods for T
impl<T> AggregateExpressionMethods for T
Source§fn aggregate_distinct(self) -> Self::Outputwhere
Self: DistinctDsl,
fn aggregate_distinct(self) -> Self::Outputwhere
Self: DistinctDsl,
DISTINCT modifier for aggregate functions Read moreSource§fn aggregate_all(self) -> Self::Outputwhere
Self: AllDsl,
fn aggregate_all(self) -> Self::Outputwhere
Self: AllDsl,
ALL modifier for aggregate functions Read moreSource§fn aggregate_filter<P>(self, f: P) -> Self::Output
fn aggregate_filter<P>(self, f: P) -> Self::Output
Source§fn aggregate_order<O>(self, o: O) -> Self::Outputwhere
Self: OrderAggregateDsl<O>,
fn aggregate_order<O>(self, o: O) -> Self::Outputwhere
Self: OrderAggregateDsl<O>,
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
Source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<T> IntoSql for T
impl<T> IntoSql for T
Source§fn into_sql<T>(self) -> Self::Expression
fn into_sql<T>(self) -> Self::Expression
self to an expression for Diesel’s query builder. Read moreSource§fn as_sql<'a, T>(&'a self) -> <&'a Self as AsExpression<T>>::Expression
fn as_sql<'a, T>(&'a self) -> <&'a Self as AsExpression<T>>::Expression
&self to an expression for Diesel’s query builder. Read more