Skip to main content

Sink

Struct Sink 

Source
pub struct Sink<T: Record> { /* private fields */ }
Expand description

A streaming data sink.

Sinks receive records from a Source and distribute them to subscribers. The sink supports both single-subscriber and broadcast modes.

§Subscription Model

When you call subscribe(), you get a Subscription that receives records from this sink. If you subscribe multiple times, the sink automatically enters broadcast mode where each subscriber gets a copy of every record.

§Performance Notes

  • Single subscriber mode: Zero overhead, direct channel access
  • Broadcast mode: Uses RwLock for subscriber list (read-heavy optimization)
  • poll_and_distribute(): Takes a read lock (fast, non-blocking with other readers)
  • subscribe(): Takes a write lock (rare, happens at setup time)

§Example

let (source, sink) = streaming::create::<MyEvent>(1024);

// Subscribe to receive records
let subscription = sink.subscribe();

// Process records
while let Some(batch) = subscription.poll() {
    process(batch);
}

Implementations§

Source§

impl<T: Record> Sink<T>

Source

pub fn subscribe(&self) -> Subscription<T>

Creates a subscription to receive records from this sink.

The first subscriber receives records directly from the source channel. Additional subscribers trigger broadcast mode where records are copied.

§Returns

A Subscription that can be used to poll or receive records.

§Performance

This method takes a write lock and should only be called during setup, not on the hot path. Subscription setup is O(1).

§Panics

Panics if the internal lock is poisoned (should not happen in normal use).

Source

pub fn subscriber_count(&self) -> usize

Returns the number of active subscribers.

Source

pub fn mode(&self) -> SinkMode

Returns the sink mode based on subscriber count.

Source

pub fn schema(&self) -> SchemaRef

Returns the schema for this sink.

Source

pub fn is_disconnected(&self) -> bool

Returns true if the source has been dropped.

Source

pub fn pending(&self) -> usize

Returns the number of pending items from the source.

Source

pub fn poll_and_distribute(&self) -> usize
where T: Clone,

Polls for records and distributes them to subscribers.

In single-subscriber mode, this is a no-op (direct channel). In broadcast mode, this copies records to all subscriber channels.

Returns the number of records distributed.

§Performance

Snapshots subscriber producers under the read lock (cheap Arc bumps), then releases the lock before the poll loop to avoid holding it during I/O.

Trait Implementations§

Source§

impl<T: Record + Debug> Debug for Sink<T>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<T> Freeze for Sink<T>

§

impl<T> !RefUnwindSafe for Sink<T>

§

impl<T> Send for Sink<T>

§

impl<T> Sync for Sink<T>

§

impl<T> Unpin for Sink<T>

§

impl<T> UnsafeUnpin for Sink<T>

§

impl<T> !UnwindSafe for Sink<T>

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
§

impl<T> ArchivePointee for T

§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
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<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

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

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

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
§

impl<T> LayoutRaw for T

§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Returns the layout of the type.
§

impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
where T: SharedNiching<N1, N2>, N1: Niching<T>, N2: Niching<T>,

§

unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool

Returns whether the given value has been niched. Read more
§

fn resolve_niched(out: Place<NichedOption<T, N1>>)

Writes data to out indicating that a T is niched.
§

impl<T> Pointee for T

§

type Metadata = ()

The metadata type for pointers and references to this type.
§

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Scope for T

§

fn with<F, R>(self, f: F) -> R
where Self: Sized, F: FnOnce(Self) -> R,

Scoped with ownership.
§

fn with_ref<F, R>(&self, f: F) -> R
where F: FnOnce(&Self) -> R,

Scoped with reference.
§

fn with_mut<F, R>(&mut self, f: F) -> R
where F: FnOnce(&mut Self) -> R,

Scoped with mutable reference.
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> Value for T
where T: Send + Sync + 'static,