pub struct NatsSubscriber { /* private fields */ }Expand description
A NATS subscription.
Backed transparently by either a Core subscription (no ack) or a JetStream pull consumer
(full ack/nack/term). Construct via ConnectedNatsBroker::subscribe_with with
CoreSubject or JetStreamSubject, or let the runtime resolve either source at startup.
A handler over &[T] takes its deliveries in batches, and the mount site sets the largest
batch with batch(n). On JetStream one batch is one pull request for at most n messages,
and pull_expires closes a short one early. Core NATS
has no batch on the wire, so the client assembles one and closes a partial batch 10 ms after
its first delivery.
§Examples
use ruststream_nats::prelude::*;
use serde::Deserialize;
#[derive(Deserialize)]
struct Order {
id: u64,
}
#[subscriber(JetStreamSubject::new("orders.*", "ORDERS").durable("orders-worker"))]
async fn handle(order: &Order) -> HandlerOutcome {
tracing::info!(order.id, "handled");
HandlerOutcome::ack()
}
#[subscriber(JetStreamSubject::new("orders.*", "ORDERS").durable("orders-reconciler"))]
async fn reconcile(orders: &[Order]) -> HandlerOutcome {
tracing::info!(count = orders.len(), "reconciled");
HandlerOutcome::ack()
}
#[ruststream::app]
fn app() -> impl App {
RustStream::new(AppInfo::new("orders", "0.1.0")).with_broker(
NatsBroker::new("nats://localhost:4222"),
|b| {
b.include(handle);
// One pull request fetches at most six messages.
b.include(reconcile.batch(nonzero!(6)));
},
)
}Trait Implementations§
Source§impl BatchSubscriber for NatsSubscriber
impl BatchSubscriber for NatsSubscriber
Source§fn batches(
&mut self,
size: NonZeroUsize,
) -> impl Stream<Item = Result<Self::Batch, Self::Error>> + Send + '_
fn batches( &mut self, size: NonZeroUsize, ) -> impl Stream<Item = Result<Self::Batch, Self::Error>> + Send + '_
Returns a stream of batches of at most size messages.
size is the registration’s batch size, and each transport spends it in its own currency.
JetStream batches on the wire: one stream item is one pull fetch of up to size
messages, waiting at most pull_expires before
delivering a partial batch (an empty fetch is retried, so the stream never yields empty
batches). Core NATS has no wire-level batching, so its batches are assembled on the client
by the framework’s BufferedSubscriber: a batch closes at size deliveries or 10 ms
after its first one, whichever comes first.
Drive a subscriber through either Subscriber::stream or batches, not both at once:
on JetStream each issues its own pull requests, so deliveries would be split between
them.
§Cancel safety
Dropping the returned stream between items is allowed. On JetStream, dropping it
mid-fetch can leave already-fetched, undelivered messages to be redelivered after the
consumer’s ack_wait.
Source§type Batch = Vec<NatsMessage>
type Batch = Vec<NatsMessage>
batches. Implementations choose between Vec, custom
iterators, or anything else that yields the underlying Subscriber::Message.Source§impl Debug for NatsSubscriber
impl Debug for NatsSubscriber
Source§impl Subscriber for NatsSubscriber
impl Subscriber for NatsSubscriber
Source§type Message = NatsMessage
type Message = NatsMessage
Auto Trait Implementations§
impl !RefUnwindSafe for NatsSubscriber
impl !UnwindSafe for NatsSubscriber
impl Freeze for NatsSubscriber
impl Send for NatsSubscriber
impl Sync for NatsSubscriber
impl Unpin for NatsSubscriber
impl UnsafeUnpin for NatsSubscriber
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