Koto.Messaging.Wolverine.Postgres
0.4.0
dotnet add package Koto.Messaging.Wolverine.Postgres --version 0.4.0
NuGet\Install-Package Koto.Messaging.Wolverine.Postgres -Version 0.4.0
<PackageReference Include="Koto.Messaging.Wolverine.Postgres" Version="0.4.0" />
<PackageVersion Include="Koto.Messaging.Wolverine.Postgres" Version="0.4.0" />
<PackageReference Include="Koto.Messaging.Wolverine.Postgres" />
paket add Koto.Messaging.Wolverine.Postgres --version 0.4.0
#r "nuget: Koto.Messaging.Wolverine.Postgres, 0.4.0"
#:package Koto.Messaging.Wolverine.Postgres@0.4.0
#addin nuget:?package=Koto.Messaging.Wolverine.Postgres&version=0.4.0
#tool nuget:?package=Koto.Messaging.Wolverine.Postgres&version=0.4.0
Koto.Messaging.Wolverine.Postgres
Durable PostgreSQL-backed IProcessedMessageStore for Koto.Messaging.Wolverine: consumer idempotency that survives service restarts.
Why
IntegrationEventConsumerBase<TEvent> deduplicates events via IProcessedMessageStore. The default in-memory store loses its state on restart — with Kafka's at-least-once delivery that means real duplicate processing in production. This package stores processed message ids in PostgreSQL instead.
Usage
services.AddKotoWolverine();
services.AddPostgresProcessedMessageStore(
builder.Configuration.GetConnectionString("db")!);
Optional configuration:
services.AddPostgresProcessedMessageStore(connectionString, o =>
{
o.Schema = "koto"; // default
o.Table = "processed_messages"; // default
o.AutoCreateSchema = true; // default; disable with external migrations
o.CleanupInterval = TimeSpan.FromHours(1); // default
});
- The deduplication window comes from
KotoWolverineOptions.IdempotencyWindow(default 24 h) — the same option the in-memory store uses. - Schema/table/index are created on first use (
CREATE ... IF NOT EXISTS); setAutoCreateSchema = falseto manage them with your migrations:
CREATE SCHEMA IF NOT EXISTS koto;
CREATE TABLE IF NOT EXISTS koto.processed_messages (
message_id uuid PRIMARY KEY,
processed_at timestamptz NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS ix_processed_messages_processed_at
ON koto.processed_messages (processed_at);
- A background service deletes entries older than the idempotency window every
CleanupInterval. - Call order relative to
AddKotoWolverinedoes not matter.
Semantics
Delivery stays at-least-once: the store marks an event as processed after your ConsumeAsync completes, outside a shared transaction. A crash in between redelivers the event. For strict business-level deduplication use a deterministic operation id with a unique constraint in the consumer's own storage (see the Koto ledger patterns).
License
MIT
Durable outbox defaults
builder.Host.UseWolverine(opts =>
{
opts.UseKotoKafka(kafka, typeof(SomeHandler).Assembly)
.PublishIntegrationEvents(typeof(OrderPlacedV1).Assembly)
.UseKotoDurableOutbox(connectionString); // envelopes in Postgres + EF transactions + domain event scraping
});
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Koto.Domain (>= 0.4.0)
- Koto.Messaging.Wolverine (>= 0.4.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.7)
- Microsoft.Extensions.Hosting.Abstractions (>= 10.0.7)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.7)
- Microsoft.Extensions.Options (>= 10.0.7)
- Npgsql (>= 10.0.3)
- WolverineFx.EntityFrameworkCore (>= 5.39.0)
- WolverineFx.Postgresql (>= 5.39.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.4.0 | 93 | 7/21/2026 |
| 0.3.0-preview.15 | 43 | 7/21/2026 |
| 0.3.0-preview.14 | 51 | 7/21/2026 |
| 0.3.0-preview.13 | 49 | 7/21/2026 |
| 0.3.0-preview.12 | 43 | 7/21/2026 |
| 0.3.0-preview.11 | 48 | 7/21/2026 |
| 0.3.0-preview.10 | 43 | 7/21/2026 |
| 0.3.0-preview.9 | 53 | 7/21/2026 |
| 0.3.0-preview.8 | 56 | 7/21/2026 |
| 0.3.0-preview.7 | 46 | 7/21/2026 |
| 0.3.0-preview.6 | 44 | 7/20/2026 |
| 0.3.0-preview.5 | 50 | 7/19/2026 |