RedisStreamStore Class
Stream registrations on one Redis hash: the durable IStreamStore for a transmitter whose streams must outlive its process, without a database of its own.
public sealed class RedisStreamStore : Abblix.SharedSignals.Transmitter.IStreamStoreInheritance System.Object → RedisStreamStore
Implements IStreamStore
Remarks
One hash rather than a key per stream, because the dispatcher's view is "every stream at once" on every event: HGETALL over a transmitter's registrations beats a SCAN walking a shared keyspace, and a single key stays valid under Redis Cluster without hash-tag ceremony. The cost of that shape is that the whole registry travels on every dispatched event and lives on one cluster slot - fine for the tens of receivers a transmitter serves, and the reason this store is not the answer for thousands.
The key carries the transmitter's own issuer, so two deployments sharing one Redis - a staging and a production, two products - keep separate registries. Without it they would share a hash, and each would read the other's streams out of ListAllAsync(CancellationToken) and deliver its own signed events to the other's receivers.
Losing Redis loses registrations - deliberately a tier below a database. The consequence is worth stating plainly: the transmitter stops delivering to everybody until each receiver creates its stream again (SSF 1.0 Section 8.1.1.1), and whether a receiver ever does is a property of that receiver, not of the protocol. A deployment that cannot accept that keeps its registrations in its own database, which is what the interface is for.
Registrations carry the receivers' delivery credentials
(authorization_header), so this Redis holds secrets and deserves the protection of one:
TLS, authentication, and a database of its own.
Constructors
RedisStreamStore(IConnectionMultiplexer, SharedSignalsTransmitterOptions) Constructor
Stream registrations on one Redis hash: the durable IStreamStore for a transmitter whose streams must outlive its process, without a database of its own.
public RedisStreamStore(StackExchange.Redis.IConnectionMultiplexer connection, Abblix.SharedSignals.Transmitter.SharedSignalsTransmitterOptions options);Parameters
connection StackExchange.Redis.IConnectionMultiplexer
The Redis connection; opening and configuring it is the host's.
options SharedSignalsTransmitterOptions
The transmitter's options, read for the issuer the key is scoped by.
Remarks
One hash rather than a key per stream, because the dispatcher's view is "every stream at once" on every event: HGETALL over a transmitter's registrations beats a SCAN walking a shared keyspace, and a single key stays valid under Redis Cluster without hash-tag ceremony. The cost of that shape is that the whole registry travels on every dispatched event and lives on one cluster slot - fine for the tens of receivers a transmitter serves, and the reason this store is not the answer for thousands.
The key carries the transmitter's own issuer, so two deployments sharing one Redis - a staging and a production, two products - keep separate registries. Without it they would share a hash, and each would read the other's streams out of ListAllAsync(CancellationToken) and deliver its own signed events to the other's receivers.
Losing Redis loses registrations - deliberately a tier below a database. The consequence is worth stating plainly: the transmitter stops delivering to everybody until each receiver creates its stream again (SSF 1.0 Section 8.1.1.1), and whether a receiver ever does is a property of that receiver, not of the protocol. A deployment that cannot accept that keeps its registrations in its own database, which is what the interface is for.
Registrations carry the receivers' delivery credentials
(authorization_header), so this Redis holds secrets and deserves the protection of one:
TLS, authentication, and a database of its own.
Methods
RedisStreamStore.DeleteAsync(string, string, CancellationToken) Method
Deletes a stream (SSF 1.0 Section 8.1.1.5).
public System.Threading.Tasks.Task<bool> DeleteAsync(string receiverId, string streamId, System.Threading.CancellationToken cancellationToken=default(System.Threading.CancellationToken));Parameters
receiverId System.String
The receiver the stream belongs to.
streamId System.String
The stream's identifier.
cancellationToken System.Threading.CancellationToken
Cancels I/O a durable implementation performs.
Implements DeleteAsync(string, string, CancellationToken)
Returns
System.Threading.Tasks.Task<System.Boolean>
True when deleted; false when no such stream existed.
RedisStreamStore.FindAsync(string, string, CancellationToken) Method
Finds one stream of one receiver.
public System.Threading.Tasks.Task<Abblix.SharedSignals.Transmitter.StreamState?> FindAsync(string receiverId, string streamId, System.Threading.CancellationToken cancellationToken=default(System.Threading.CancellationToken));Parameters
receiverId System.String
The receiver the stream belongs to.
streamId System.String
The stream's identifier.
cancellationToken System.Threading.CancellationToken
Cancels I/O a durable implementation performs.
Implements FindAsync(string, string, CancellationToken)
Returns
System.Threading.Tasks.Task<StreamState>
The stream's state, or null when no such stream exists for this receiver.
RedisStreamStore.ListAllAsync(CancellationToken) Method
Lists every stream of every receiver - the dispatcher's view, since an event is matched against all streams at once.
public System.Threading.Tasks.Task<System.Collections.Generic.IReadOnlyList<Abblix.SharedSignals.Transmitter.StreamState>> ListAllAsync(System.Threading.CancellationToken cancellationToken=default(System.Threading.CancellationToken));Parameters
cancellationToken System.Threading.CancellationToken
Cancels I/O a durable implementation performs.
Implements ListAllAsync(CancellationToken)
Returns
System.Threading.Tasks.Task<System.Collections.Generic.IReadOnlyList<StreamState>>
RedisStreamStore.ListAsync(string, CancellationToken) Method
Lists the streams of one receiver, for the list form of the configuration read (SSF 1.0 Section 8.1.1.2). An empty list is a receiver with no streams, never an error.
public System.Threading.Tasks.Task<System.Collections.Generic.IReadOnlyList<Abblix.SharedSignals.Transmitter.StreamState>> ListAsync(string receiverId, System.Threading.CancellationToken cancellationToken=default(System.Threading.CancellationToken));Parameters
receiverId System.String
The receiver whose streams are listed.
cancellationToken System.Threading.CancellationToken
Cancels I/O a durable implementation performs.
Implements ListAsync(string, CancellationToken)
Returns
System.Threading.Tasks.Task<System.Collections.Generic.IReadOnlyList<StreamState>>
RedisStreamStore.TryCreateAsync(StreamState, CancellationToken) Method
Stores a new stream.
public System.Threading.Tasks.Task<bool> TryCreateAsync(Abblix.SharedSignals.Transmitter.StreamState stream, System.Threading.CancellationToken cancellationToken=default(System.Threading.CancellationToken));Parameters
stream StreamState
The stream's initial state.
cancellationToken System.Threading.CancellationToken
Cancels I/O a durable implementation performs.
Implements TryCreateAsync(StreamState, CancellationToken)
Returns
System.Threading.Tasks.Task<System.Boolean>
True when stored; false when a stream with the same receiver and identifier
already exists.
RedisStreamStore.UpdateAsync(StreamState, CancellationToken) Method
Replaces a stream's state with a new snapshot, keyed by its receiver and identifier.
public System.Threading.Tasks.Task<bool> UpdateAsync(Abblix.SharedSignals.Transmitter.StreamState stream, System.Threading.CancellationToken cancellationToken=default(System.Threading.CancellationToken));Parameters
stream StreamState
The new state.
cancellationToken System.Threading.CancellationToken
Cancels I/O a durable implementation performs.
Implements UpdateAsync(StreamState, CancellationToken)
Returns
System.Threading.Tasks.Task<System.Boolean>
True when replaced; false when no such stream exists to replace.