Skip to main content

RedisPubSubPattern

Struct RedisPubSubPattern 

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

Describes one Pub/Sub subscription on a glob pattern (PSUBSCRIBE), against a ConnectedRedisBroker.

Patterns are classic-only: sharded Pub/Sub routes by slot and has no PSUBSCRIBE, so this descriptor carries no mode to get wrong.

§Examples

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

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

#[subscriber(RedisPubSubPattern::new("events.*"))]
async fn on_any_event(event: &Event, Ctx(channel): Ctx<keys::Channel>) -> HandlerOutcome {
    tracing::info!(event.kind, channel, "event");
    HandlerOutcome::ack()
}

#[ruststream::app]
fn app() -> impl App {
    RustStream::new(AppInfo::new("events", "0.1.0")).with_broker(
        RedisBroker::standalone("redis://localhost:6379"),
        |b| {
            // A glob is no channel a `PUBLISH` can name, so the mount site says where a
            // retry copy goes.
            b.include(on_any_event)
                .out_retry(Publish::default())
                .to("events.retry");
        },
    )
}

Sharded Pub/Sub has no pattern subscription, so a pattern takes no mode:

ⓘ
use ruststream_fred::{PubSubMode, RedisPubSubPattern};

let events = RedisPubSubPattern::new("events.*").mode(PubSubMode::Sharded);

Implementations§

Source§

impl RedisPubSubPattern

Source

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

A subscription on every channel matching the glob pattern.

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(RedisPubSubPattern::new("events.*").buffer(nonzero!(10_000)))]
async fn on_event(event: &Event) -> HandlerOutcome {
    tracing::info!(event.kind, "event");
    HandlerOutcome::ack()
}
Source

pub fn pattern(&self) -> &str

The glob this subscription matches channels against.

Trait Implementations§

Source§

impl Clone for RedisPubSubPattern

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 RedisPubSubPattern

Source§

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

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

impl IntoSource for RedisPubSubPattern

Source§

type Source = RedisPubSubPattern

The source the constructor stores.
Source§

fn into_source(self) -> Self

Builds the source.
Source§

impl SubscriptionSource<ConnectedRedisBroker> for RedisPubSubPattern

A pattern subscription reads every channel the glob matches, and a glob is not a channel a PUBLISH can name, so the mount site names where a retry copy goes: .out_retry(policy).to(..) for a fixed channel, or a transform that reads the delivery’s own channel.

Source§

type Subscriber = RedisPubSubSubscriber

The subscriber type this source opens.
Source§

type Copies = NamedCopies

Who publishes the copies this subscription’s retries are made of, and who names where they go: AddressedCopies, NamedCopies or BrokerMoves. Read more
Source§

fn name(&self) -> &str

The name (subject / channel) this subscription binds to. 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(self, declaration: &RetryDeclaration) -> Self
where Self: Sized,

Takes the registration’s retry declaration into the descriptor, before the subscription opens. 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