#[non_exhaustive]pub enum Commit {
Auto,
Tracked,
Transactional(String),
}Expand description
How processed deliveries are committed back to the consumer group.
§Examples
A tracked subscription with one lane per record key, a cap on deliveries and a dead-letter topic:
use ruststream_rdkafka::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct Payment {
id: u64,
}
/// One lane per record key, so payments of one account stay ordered while others run
/// concurrently.
#[subscriber(
KafkaTopic::new("payments")
.group("payments-svc")
.commit(Commit::Tracked)
.start(StartOffset::Earliest)
.lane_key(LaneKey::RecordKey),
workers(8, by_key)
)]
async fn charge(payment: &Payment) -> HandlerOutcome {
if payment.id == 0 {
return HandlerOutcome::drop();
}
HandlerOutcome::ack()
}
fn app() -> RustStream {
RustStream::new(AppInfo::new("payments", "0.1.0")).with_broker(
KafkaBroker::new(["localhost:9092"]),
|b| {
// Five deliveries of one payment, the first included; the sixth goes to the
// dead-letter topic instead, payload and headers as they arrived.
b.include(charge)
.max_attempts(nonzero!(5u32))
.dead_letter("payments.dlq");
},
)
}Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Auto
librdkafka auto-commit, the librdkafka default: positions are stored as messages are
handed to the application and committed every auto.commit.interval.ms. ack and
nack(false) are advisory no-ops and nack(true) reports
AckError::Unsupported; a crash can lose the tail of
processed-but-uncommitted work or skip unprocessed deliveries that were already stored.
Tracked
Per-message acknowledgement: enable.auto.offset.store is switched off and an ack
advances the stored position to just below the lowest still-unsettled delivery (or to
the highest delivered offset once none are outstanding). At-least-once stays precise
with concurrent handler lanes, and offset gaps the consumer never receives (transaction
markers, compacted-away records) cannot block the position. Auto-commit still flushes
the stored position in the background and once more when the consumer closes.
Transactional(String)
Exactly-once: the consumer never commits its own offsets - the
EosPipeline whose transactional id matches this name commits
them through the producer transaction (send_offsets_to_transaction), so source
positions move atomically with the records the handlers publish. enable.auto.commit
and enable.auto.offset.store are switched off; ack advances the shared watermark
exactly like Tracked, and the pipeline picks the watermark up at its
next window commit.
Trait Implementations§
impl Eq for Commit
impl StructuralPartialEq for Commit
Auto Trait Implementations§
impl Freeze for Commit
impl RefUnwindSafe for Commit
impl Send for Commit
impl Sync for Commit
impl Unpin for Commit
impl UnsafeUnpin for Commit
impl UnwindSafe for Commit
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.impl<T> ErasedDestructor for Twhere
T: 'static,
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 more