#[non_exhaustive]pub enum SchemaCachePolicy {
Disabled,
Cached {
capacity: NonZeroUsize,
subject_ttl: Option<Duration>,
},
}Expand description
How the default cache ages and bounds what it holds.
The two halves of the registry’s answer expire differently, and that is not a preference but a property of the service: a schema id is immutable. The registry assigns an id per distinct schema definition, by content - registering a new version of a subject mints a new id and leaves the old one resolving to the old schema for ever, and registering an identical schema under a different subject hands back the id it already had. A subject’s latest version, by contrast, moves whenever someone registers one.
“Per registry” is really per schema context: a registry can carry several, and each numbers
its ids from one, so the same id means different schemas in two of them. This was checked
against a live registry - the same schema registered in the default context and in a named one
both came back as id 1. It bounds what this cache is: keyed by id, it is correct for a client
that stays inside one context, which is what a client addressing plain subject names does. An
app that reaches across contexts through one client, by writing :.context:subject subject
names, needs a client per context rather than one cache spanning them.
So an id-keyed entry can never go stale and needs no expiry - a TTL over it could only cause
a refetch that returns the identical bytes - while a subject-keyed entry can, and is the only
thing the subject_ttl of Cached governs. Confluent’s own clients scope
their latest.cache.ttl.sec to exactly the latest-version caches for the same reason.
What ids still need is a bound. A consumer meets one id per writer version it is sent, which is small in a healthy topology and unbounded in a broken one (a producer registering a schema per message), so the cache is capped and evicts in insertion order. Evicting an id that is still in use costs one refetch and never a wrong answer, which is what makes plain insertion order enough here and a recency policy not worth its bookkeeping.
§Examples
A producer that notices a newly registered version of a subject within five minutes, without a restart:
use std::time::Duration;
use ruststream_rdkafka::prelude::*;
use ruststream_rdkafka::{SchemaCachePolicy, SchemaFrame, SchemaRegistry};
fn app() -> impl App {
let registry = SchemaRegistry::new("http://localhost:8081").cache_policy(
SchemaCachePolicy::Cached {
capacity: nonzero!(256usize),
subject_ttl: Some(Duration::from_secs(300)),
},
);
RustStream::new(AppInfo::new("orders", "0.1.0"))
.publish_layer(SchemaFrame::new(registry))
.with_broker(
KafkaBroker::new(["localhost:9092"]).default_group("orders-svc"),
|b| {
b.include(confirm);
},
)
}Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Disabled
Nothing is remembered: every lookup reaches the registry.
This is a real configuration, not a zero TTL wearing a disguise - for a process that must
hold no schema state, or a test that wants every call observable. It has one consequence
worth knowing before choosing it: a synchronous codec reads the cache and cannot await a
miss, so AvroCodec::registry and
SchemaFramed cannot work under it. The transcoding path, whose
lookups are all async, works unchanged.
Cached
Ids are remembered up to capacity, and a subject’s resolved version for subject_ttl.
Fields
capacity: NonZeroUsizeThe most id-keyed schemas held at once; the oldest is dropped past it.
subject_ttl: Option<Duration>How long a subject’s resolved version is trusted before the next async lookup
re-resolves it. None never re-resolves, which is Confluent’s own default.
This governs the async lookups only (warm and the
publish-side transcode). A codec’s subject is resolved once, when the broker
connects, and stays put: its encode is synchronous and cannot re-resolve, and a
producer changing the schema it writes mid-process is a deliberate act, not something
to absorb silently between two messages.
Trait Implementations§
Source§impl Clone for SchemaCachePolicy
impl Clone for SchemaCachePolicy
impl Copy for SchemaCachePolicy
Source§impl Debug for SchemaCachePolicy
impl Debug for SchemaCachePolicy
Source§impl Default for SchemaCachePolicy
impl Default for SchemaCachePolicy
impl Eq for SchemaCachePolicy
Source§impl PartialEq for SchemaCachePolicy
impl PartialEq for SchemaCachePolicy
impl StructuralPartialEq for SchemaCachePolicy
Auto Trait Implementations§
impl Freeze for SchemaCachePolicy
impl RefUnwindSafe for SchemaCachePolicy
impl Send for SchemaCachePolicy
impl Sync for SchemaCachePolicy
impl Unpin for SchemaCachePolicy
impl UnsafeUnpin for SchemaCachePolicy
impl UnwindSafe for SchemaCachePolicy
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.impl<T> ErasedDestructor for Twhere
T: 'static,
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