#[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> 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> 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> 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::Request