pub struct RedisMessage { /* private fields */ }Expand description
A Redis Streams delivery, read from a consumer group via XREADGROUP or XAUTOCLAIM.
Settlement follows the republish-retry model: ack is XACK; a retry re-appends a copy of the
entry to the same stream and then acks the original (at-least-once, so a duplicate is possible
if the process crashes between the two); a drop acks the original.
On a claiming subscription the retry is the read mode’s own:
the entry stays in the pending entries list, and the subscription’s next read claims it back
with the server’s delivery count one higher, which is the count this delivery reports.
Implementations§
Trait Implementations§
Source§impl BuildBatchContext<RedisMessage> for StreamBatchContext
impl BuildBatchContext<RedisMessage> for StreamBatchContext
Source§fn build(first: &RedisMessage) -> Self
fn build(first: &RedisMessage) -> Self
Source§impl BuildContext<RedisMessage> for StreamContext
impl BuildContext<RedisMessage> for StreamContext
Source§fn build(msg: &RedisMessage) -> Self
fn build(msg: &RedisMessage) -> Self
msg.Source§impl BuildContext<RedisMessage> for PoolContext
impl BuildContext<RedisMessage> for PoolContext
Source§fn build(msg: &RedisMessage) -> Self
fn build(msg: &RedisMessage) -> Self
msg.Source§impl Debug for RedisMessage
impl Debug for RedisMessage
Source§impl IncomingMessage for RedisMessage
impl IncomingMessage for RedisMessage
Source§fn redelivery_count(&self) -> Option<u64>
fn redelivery_count(&self) -> Option<u64>
How many times the server has delivered this entry, counting this delivery.
Answered on the two read modes that claim, from the count Redis keeps in the pending
entries list: claiming is told the count as of the
previous delivery, so this one is added to it, and reclaim
reads XPENDING after the claim, where this delivery is already counted. The fresh tail
claims nothing and has no count of its own, so a cap on it is the runtime’s header instead.
Source§fn supports_nack_after(&self) -> bool
fn supports_nack_after(&self) -> bool
Whether a delay reaches Redis rather than the runtime’s deferred copy.
True on a subscription that named a ZSET delay queue with
RedisStream::delayed_retry, and on a
claiming subscription, whose pending entries list is a
delayed redelivery of Redis’s own. Elsewhere the runtime publishes the copy, which the
mount site can customise with out_retry.
Source§async fn nack_after(self, delay: Duration) -> Result<(), AckError>
async fn nack_after(self, delay: Duration) -> Result<(), AckError>
Holds the message back for delay and redelivers it.
A ZSET delay queue serves the delay exactly: the delayed copy is ZADDed and the original
XACKed, and the subscriber’s sweeper re-XADDs it once due, so the retry survives a
crash. Without one, a claiming subscription leaves the entry pending and claims it back on
its own min_idle, which is the granularity Redis offers there: a shorter delay waits
min_idle, a longer one is honoured by the read that finds the entry still idle.
§Errors
Returns AckError::Unsupported when the subscription has neither, or
AckError::Broker when the ZADD or XACK fails.
Source§fn partition_key(&self) -> Option<&[u8]>
fn partition_key(&self) -> Option<&[u8]>
None when the
message carries no key. Read moreSource§impl Partitioned for RedisMessage
impl Partitioned for RedisMessage
Source§fn partition_key(&self) -> Option<&[u8]>
fn partition_key(&self) -> Option<&[u8]>
None if the broker should pick a partition.Source§impl Positioned for RedisMessage
The position of a delivery is the group cursor that redelivers it.
impl Positioned for RedisMessage
The position of a delivery is the group cursor that redelivers it.
The cursor is exclusive (a group resumes after the id it holds), so the pinned position is
the id immediately below this entry’s - seeking to it delivers this message again, followed by
the entries after it. Repositioning is group-wide; see
RedisGroupSeeker.
Source§type Position = RedisGroupPosition
type Position = RedisGroupPosition
Seeker::Position.Source§fn position(&self) -> RedisGroupPosition
fn position(&self) -> RedisGroupPosition
Auto Trait Implementations§
impl !Freeze for RedisMessage
impl !RefUnwindSafe for RedisMessage
impl !UnwindSafe for RedisMessage
impl Send for RedisMessage
impl Sync for RedisMessage
impl Unpin for RedisMessage
impl UnsafeUnpin for RedisMessage
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> 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