Skip to main content

RedisPubSub

Struct RedisPubSub 

Source
pub struct RedisPubSub { /* private fields */ }
Expand description

Describes one Pub/Sub subscription on a single channel, against a ConnectedRedisBroker.

A glob is RedisPubSubPattern instead.

§Examples

use ruststream_fred::pubsub::prelude::*;
use serde::Deserialize;

#[derive(Deserialize)]
struct Event {
    kind: String,
}

// Classic: `SUBSCRIBE`, broadcast to every node of a cluster.
#[subscriber(RedisPubSub::new("events"))]
async fn on_event(event: &Event) -> HandlerOutcome {
    tracing::info!(event.kind, "event");
    HandlerOutcome::ack()
}

// Sharded: `SSUBSCRIBE`, served by the node that owns the channel's slot.
#[subscriber(RedisPubSub::new("metrics").mode(PubSubMode::Sharded))]
async fn on_metric(event: &Event) -> HandlerOutcome {
    tracing::info!(event.kind, "metric");
    HandlerOutcome::ack()
}

#[ruststream::app]
fn app() -> impl App {
    RustStream::new(AppInfo::new("events", "0.1.0")).with_broker(
        RedisBroker::cluster(["10.0.0.1:6379"]),
        |b| {
            b.include(on_event);
            b.include(on_metric);
        },
    )
}

Implementations§

Source§

impl RedisPubSub

Source

pub fn new(channel: impl Into<String>) -> Self

A subscription on the exact channel.

Source

pub const fn mode(self, mode: PubSubMode) -> Self

Sets the delivery mode. Defaults to PubSubMode::Classic.

Source

pub fn codec(self, codec: impl Codec + 'static) -> Self

Decodes the header/payload envelope with codec (must match the publisher). Without it the default binary framing is used. Either way the payload arrives as it was published.

Source

pub const fn buffer(self, messages: NonZeroUsize) -> Self

Sets how many messages the subscription holds that its handler has not taken yet.

Redis pushes a Pub/Sub message the moment it is published, and the subscription keeps it until the handler asks for the next one. The buffer bounds how many may wait. Once it is full, each new message drops the oldest, and the subscription logs a warning with the channel and the count it lost. The default is fred’s own (PerformanceConfig::broadcast_channel_capacity, 32 messages in fred 10.1).

Raise it for a handler that falls behind bursts: set it to the largest burst the handler must absorb. The room is reserved when the subscription opens, about 600 bytes per message of buffer whatever the payloads weigh, because fred sizes all eight of a client’s notification channels by it.

§Examples
use ruststream::nonzero;
use ruststream_fred::pubsub::prelude::*;

// A handler that falls behind a burst of up to ten thousand events loses none of them.
#[subscriber(RedisPubSub::new("events").buffer(nonzero!(10_000)))]
async fn on_event(event: &Event) -> HandlerOutcome {
    tracing::info!(event.kind, "event");
    HandlerOutcome::ack()
}
Source

pub fn channel(&self) -> &str

The channel this subscription listens on.

Trait Implementations§

Source§

impl Clone for RedisPubSub

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RedisPubSub

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl IntoSource for RedisPubSub

Source§

type Source = RedisPubSub

The source the constructor stores.
Source§

fn into_source(self) -> Self

Builds the source.
Source§

impl RedeliveryAddressed<ConnectedRedisBroker> for RedisPubSub

The channel itself.

The answer is about the address, not about the command: reaching a PubSubMode::Sharded subscription still takes a publisher in the same mode, which is the policy the mount site names with out_retry.

Source§

fn redelivery_address( &self, _connected: &ConnectedRedisBroker, ) -> impl Future<Output = Result<RedeliveryAddress, RedisError>>

Where a publish reaches this subscription again. Read more
Source§

impl SubscriptionSource<ConnectedRedisBroker> for RedisPubSub

Source§

type Copies = AddressedCopies

Pub/Sub cannot acknowledge, so every retry is a copy this process publishes, and the channel is where it goes.

Source§

type Subscriber = RedisPubSubSubscriber

The subscriber type this source opens.
Source§

fn name(&self) -> &str

The name (subject / channel) this subscription binds to. Read more
Source§

fn declare_retry(self, declaration: &RetryDeclaration) -> Self

Takes the registration’s retry declaration into the descriptor, before the subscription opens. Read more
Source§

async fn subscribe( self, connected: &ConnectedRedisBroker, ) -> Result<Self::Subscriber, RedisError>

Opens the subscription against the connected broker. Called once at startup. Read more
Source§

fn channel_bindings(&self) -> Bindings

What this subscription adds to its channel in the generated AsyncAPI document. Read more
Source§

fn declare_retry_on( &self, connected: &C, declaration: &RetryDeclaration, ) -> Result<(), DeclareRetryError>

Carries the registration’s declaration to the broker, at the same point and before the subscription opens. Read more
Source§

fn operation_bindings(&self) -> Bindings

What this subscription adds to its receive operation in the document. Read more
Source§

fn message_bindings(&self) -> Bindings

What this subscription adds to the messages that arrive on it. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<Descriptor> OpensWindow for Descriptor
where Descriptor: Base,

Source§

type Pipelined = Pipelined<Descriptor>

The same source with a window.
Source§

fn open_window(self) -> <Descriptor as OpensWindow>::Pipelined

Opens the window.
Source§

impl<T> PublishedThrough<DefaultSlot> for T

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more