Class ClickHouseEventStore
Namespace: Cephalon.EventSourcing.ClickHouse
Assembly: Cephalon.EventSourcing.ClickHouse.dll
ClickHouse-backed implementation of MergeTree table
ordered by (stream_id, stream_version) for efficient per-stream range scans and append operations.
public sealed class ClickHouseEventStore : IEventStore, IDisposableInheritance
Section titled “Inheritance”Implements
Section titled “Implements”IEventStore, IDisposable
Inherited Members
Section titled “Inherited Members”object.Equals(object?), object.Equals(object?, object?), object.GetHashCode(), object.GetType(), object.ReferenceEquals(object?, object?), object.ToString()
Remarks
Section titled “Remarks”
Known limitation — optimistic concurrency: ClickHouse MergeTree does NOT enforce
uniqueness on the ORDER BY key. Two concurrent writers that both observe the same
expectedVersion can both INSERT successfully — there is no database-level rejection.
The pre-read version check in
ClickHouse is optimized for append-heavy analytics workloads. This provider is well-suited to high-throughput event append scenarios where occasional duplicate detection at the application layer is acceptable.
Constructors
Section titled “Constructors”ClickHouseEventStore(string, string)
Section titled “ ClickHouseEventStore(string, string)”Initializes a new instance of the
public ClickHouseEventStore(string connectionString, string tableName)Parameters
Section titled “Parameters”connectionString string
The ClickHouse ADO.NET connection string.
tableName string
The ClickHouse table name used to persist event stream rows.
Methods
Section titled “Methods”AppendAsync(string, IReadOnlyCollection<IDomainEvent>, long, CancellationToken)
Section titled “ AppendAsync(string, IReadOnlyCollection<IDomainEvent>, long, CancellationToken)”Appends one or more events to the requested stream after checking the expected version.
public Task AppendAsync(string streamId, IReadOnlyCollection<IDomainEvent> events, long expectedVersion, CancellationToken cancellationToken = default)Parameters
Section titled “Parameters”streamId string
The stable stream identifier.
events IReadOnlyCollection<IDomainEvent>
The events to append.
expectedVersion long
The current stream version expected by the caller. Use -1 to require a brand-new stream.
cancellationToken CancellationToken
The token that cancels the operation.
Returns
Section titled “Returns”A task that completes when the append finishes.
Dispose()
Section titled “ Dispose()”Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
public void Dispose()GetVersionAsync(string, CancellationToken)
Section titled “ GetVersionAsync(string, CancellationToken)”Gets the latest version known for the requested stream.
public Task<long> GetVersionAsync(string streamId, CancellationToken cancellationToken = default)Parameters
Section titled “Parameters”streamId string
The stable stream identifier.
cancellationToken CancellationToken
The token that cancels the operation.
Returns
Section titled “Returns”A task that returns the current stream version, or -1 when the stream does not exist.
ReadStreamAsync(string, long, CancellationToken)
Section titled “ ReadStreamAsync(string, long, CancellationToken)”Reads the requested stream from the supplied version onward.
public IAsyncEnumerable<IDomainEvent> ReadStreamAsync(string streamId, long fromVersion = 0, CancellationToken cancellationToken = default)Parameters
Section titled “Parameters”streamId string
The stable stream identifier.
fromVersion long
The first stream version to include. The default is 0.
cancellationToken CancellationToken
The token that cancels the operation.
Returns
Section titled “Returns”IAsyncEnumerable<IDomainEvent>
An async sequence of domain events in ascending stream-version order.