Koto.Messaging.Wolverine 0.4.0

dotnet add package Koto.Messaging.Wolverine --version 0.4.0
                    
NuGet\Install-Package Koto.Messaging.Wolverine -Version 0.4.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Koto.Messaging.Wolverine" Version="0.4.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Koto.Messaging.Wolverine" Version="0.4.0" />
                    
Directory.Packages.props
<PackageReference Include="Koto.Messaging.Wolverine" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Koto.Messaging.Wolverine --version 0.4.0
                    
#r "nuget: Koto.Messaging.Wolverine, 0.4.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Koto.Messaging.Wolverine@0.4.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Koto.Messaging.Wolverine&version=0.4.0
                    
Install as a Cake Addin
#tool nuget:?package=Koto.Messaging.Wolverine&version=0.4.0
                    
Install as a Cake Tool

Koto.Messaging.Wolverine

Wolverine + Kafka implementation of Koto messaging abstractions.

What's included

Type Purpose
WolverineIntegrationEventPublisher IIntegrationEventPublisherIMessageBus.PublishAsync
WolverineIntegrationCommandDispatcher IIntegrationCommandDispatcher → fire-and-forget + request/reply
IntegrationEventConsumerBase<TEvent> Idempotent Kafka consumer base with DLQ routing
IntegrationCommandConsumerBase<TCommand> Kafka command consumer base with structured logging
CorrelationIdMiddleware Propagates Wolverine Envelope.CorrelationId via CorrelationContext
IdempotencyMiddleware Policy-level deduplication (alternative to the consumer base check)
IProcessedMessageStore Idempotency store abstraction (in-memory default; install Koto.Messaging.Wolverine.Postgres for a durable PostgreSQL store in production)

Setup

// Program.cs
builder.Services.AddKotoWolverine(opts =>
{
    opts.RequestReplyTimeout = TimeSpan.FromSeconds(10);
    opts.IdempotencyWindow = TimeSpan.FromHours(24);
});

builder.Host.UseWolverine(opts =>
{
    opts.UseKafka("localhost:9092").AutoProvision();

    // Route outbound events to topics
    opts.PublishMessage<OrderPlacedEvent>().ToKafkaTopic("orders.order-placed");

    // Listen for inbound events
    opts.ListenToKafkaTopic("payments.payment-processed").ProcessInline();

    // Propagate correlation IDs on every handler
    opts.Policies.AddMiddleware<CorrelationIdMiddleware>();

    // Auto-dispatch domain events from EF Core aggregates to the outbox
    opts.PublishDomainEventsFromEntityFrameworkCore<IHasDomainEvents, IDomainEvent>(
        e => e.DomainEvents);
});

Kafka topic naming convention

  • Event topics: {service}.{event-type}orders.order-placed
  • Consumer groups: {consuming-service}.{event-type}-consumer

Implementing a consumer

public sealed class PaymentProcessedConsumer
    : IntegrationEventConsumerBase<PaymentProcessedEvent>
{
    public PaymentProcessedConsumer(
        IProcessedMessageStore store,
        ILogger<IntegrationEventConsumerBase<PaymentProcessedEvent>> logger)
        : base(store, logger) { }

    protected override async Task ConsumeAsync(PaymentProcessedEvent @event, CancellationToken ct)
    {
        // domain logic here
    }
}

Production idempotency store

Replace InMemoryProcessedMessageStore with the durable PostgreSQL store from Koto.Messaging.Wolverine.Postgres:

builder.Services.AddPostgresProcessedMessageStore(connectionString);

Convention bootstrap

builder.Host.UseWolverine(opts =>
{
    // transport + AutoProvision + explicit consumer group + correlation + discovery + retry policy
    opts.UseKotoKafka(kafkaConnectionString, "my-service", typeof(SomeHandler).Assembly)
        .PublishIntegrationEvents(typeof(OrderPlacedV1).Assembly);          // route by `public const string Topic`
    // + opts.UseKotoDurableOutbox(pgConnectionString) из Koto.Messaging.Wolverine.Postgres
});

Каждый IIntegrationEvent контрактной сборки обязан объявлять public const string Topic = "service.event-name"; — тип без константы валит старт (fail fast вместо молчаливо потерянных событий).

Default consumer retry policy

UseKotoKafka устанавливает дефолтную политику ошибок консюмеров (без неё Wolverine уводит сообщение в dead letter после первого же исключения):

  1. inline-повторы с паузами 200мс → 1с → 3с — гасят короткие гонки топиков («событие-предпосылка ещё не обработано» — штатная ситуация при подписке на несколько топиков; консюмер в этом случае просто бросает исключение);
  2. отложенные повторы через 10с → 30с → 60с (при durable inbox переживают рестарт);
  3. только затем — dead letter queue.

Более специфичные политики сервиса (opts.Policies.OnException<MyException>()...) имеют приоритет над этим дефолтом. Паттерн консюмера: если обязательные предпосылки события ещё не готовы — бросайте исключение, чтобы сработал повтор; молчаливый return теряет данные навсегда.

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Koto.Messaging.Wolverine:

Package Downloads
Koto.Messaging.Wolverine.Postgres

PostgreSQL pieces of Koto messaging: durable IProcessedMessageStore for consumer idempotency (survives restarts, auto schema, background cleanup) and UseKotoDurableOutbox — one-line durable outbox defaults (envelope storage, EF Core transactions, domain event scraping).

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.4.0 98 7/21/2026
0.3.0-preview.15 56 7/21/2026
0.3.0-preview.14 54 7/21/2026
0.3.0-preview.13 46 7/21/2026
0.3.0-preview.12 46 7/21/2026
0.3.0-preview.11 52 7/21/2026
0.3.0-preview.10 49 7/21/2026
0.3.0-preview.9 53 7/21/2026
0.3.0-preview.8 50 7/21/2026
0.3.0-preview.7 52 7/21/2026
0.3.0-preview.6 47 7/20/2026
0.3.0-preview.5 46 7/19/2026
0.3.0-preview.4 51 7/19/2026
0.3.0-preview.3 52 7/11/2026
0.3.0-preview.2 49 7/11/2026
0.3.0-preview.1 58 7/3/2026
0.2.0-preview.1 68 6/28/2026
0.1.0-preview.5 71 5/13/2026
0.1.0-preview.4 62 5/13/2026
0.1.0-preview.3 65 5/13/2026