pub enum KinesisPosition {
Horizon,
Latest,
Timestamp(u64),
Sequence {
shard: String,
sequence: String,
},
}Expand description
A position in the stream’s retained log: the whole start vocabulary of this broker,
accepted by Seeker::seek and by the start_at(..) clause of
#[subscriber(..)].
Repositioning resets the checkpoint bookkeeping of every shard it moves: acknowledgements of records delivered before the seek stop advancing the watermark, so a stale checkpoint cannot drag the cursor back over the position just taken. Records from the new position onward are delivered again, which at-least-once permits.
Without a position a subscription resumes from the stored checkpoint of each shard, and
starts at the tip on a shard that has none. A position given to start_at(..) applies to
the shards the subscription opens with; a shard it takes on later resumes from its
checkpoint.
Opening a subscription returns once every shard it took has its reader and its starting cursor, so the tip is the moment the subscription opened: a record published after that is read.
§Examples
use ruststream_kinesis::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct Order {
id: u64,
}
/// Rebuilds a read model from every record the stream still retains, on every shard.
#[subscriber(KinesisStream::new("orders"), start_at(KinesisPosition::horizon()))]
async fn backfill(order: &Order) -> HandlerOutcome {
tracing::info!(order.id, "backfilled");
HandlerOutcome::ack()
}
#[ruststream::app]
fn app() -> impl App {
RustStream::new(AppInfo::new("orders", "0.1.0")).with_broker(KinesisBroker::new(), |b| {
b.include(backfill);
})
}Variants§
Horizon
The trim horizon: everything the stream still retains.
Stream-wide - it applies to every shard the subscription reads when it lands, and to a shard whose reader starts later without a checkpoint.
Latest
The tip: only records published after the reposition.
Stream-wide, and the position a shard without a checkpoint starts at by default. A child of a split or a merge whose parent was read to its end opens at its own beginning instead, so nothing written to it before its reader started is skipped.
Timestamp(u64)
The first record at or after this timestamp, in milliseconds since the Unix epoch.
Stream-wide; each shard opens at its own first record from that instant. The instant is matched against the arrival timestamp the service stamped on the record, and the service calls that stamp approximate: records that arrived around the same moment are not separated exactly.
Sequence
Exactly one record on one shard.
This is the pinned form the framework defines for captured positions
(Positioned::position): seeking to one redelivers that very record. It addresses a
single shard, so it moves that shard’s reader only, the way a partitioned log seeks
per partition, and the shard must be owned and live.
Implementations§
Source§impl KinesisPosition
impl KinesisPosition
Sourcepub const fn horizon() -> Self
pub const fn horizon() -> Self
The trim horizon, for every shard: see KinesisPosition::Horizon.
Sourcepub const fn latest() -> Self
pub const fn latest() -> Self
The tip, for every shard: see KinesisPosition::Latest.
Sourcepub const fn timestamp(millis: u64) -> Self
pub const fn timestamp(millis: u64) -> Self
A wall-clock instant (milliseconds since the Unix epoch), for every shard: see
KinesisPosition::Timestamp.
Sourcepub fn sequence(shard: impl Into<String>, sequence: impl Into<String>) -> Self
pub fn sequence(shard: impl Into<String>, sequence: impl Into<String>) -> Self
One record on one shard: see KinesisPosition::Sequence.
Captured positions come from Positioned::position; this constructor is for a
sequence number carried in from elsewhere (an operator’s replay request, say).
Trait Implementations§
Source§impl Clone for KinesisPosition
impl Clone for KinesisPosition
Source§impl Debug for KinesisPosition
impl Debug for KinesisPosition
impl Eq for KinesisPosition
Source§impl PartialEq for KinesisPosition
impl PartialEq for KinesisPosition
impl StructuralPartialEq for KinesisPosition
Auto Trait Implementations§
impl Freeze for KinesisPosition
impl RefUnwindSafe for KinesisPosition
impl Send for KinesisPosition
impl Sync for KinesisPosition
impl Unpin for KinesisPosition
impl UnsafeUnpin for KinesisPosition
impl UnwindSafe for KinesisPosition
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.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