Amanhecer.Dekaf
2.0.0
dotnet add package Amanhecer.Dekaf --version 2.0.0
NuGet\Install-Package Amanhecer.Dekaf -Version 2.0.0
<PackageReference Include="Amanhecer.Dekaf" Version="2.0.0" />
<PackageVersion Include="Amanhecer.Dekaf" Version="2.0.0" />
<PackageReference Include="Amanhecer.Dekaf" />
paket add Amanhecer.Dekaf --version 2.0.0
#r "nuget: Amanhecer.Dekaf, 2.0.0"
#:package Amanhecer.Dekaf@2.0.0
#addin nuget:?package=Amanhecer.Dekaf&version=2.0.0
#tool nuget:?package=Amanhecer.Dekaf&version=2.0.0
Amanhecer.Dekaf
Kafka transport for Amanhecer, a lightweight request dispatcher (mediator) for .NET, built on Dekaf, a pure C# Kafka client with no native dependencies. Bind the messaging gateway to an Apache Kafka cluster, so Post/PostAsync can publish messages to topics and consume them through a consumer group.
Broker requirements: Dekaf's consumer uses the KIP-848 consumer group protocol, so this transport requires a Kafka 4.0+ broker — it cannot consume from Redpanda (which does not implement KIP-848). For other Kafka-compatible brokers, use the
Amanhecer.ConfluentKafkatransport. For local development, the repository'sdocker-compose-kafka.yamlstarts an Apache Kafka 4 broker (port9092).
Configuring the gateway
Configure the connection, publications and subscriptions through UsingDekaf:
using Amanhecer.Configurator;
using Amanhecer.Extensions;
services.AddAmanhecer(a => a
.AddRequestHandler<GreetingHandler>()
.UsingMessagingGateway(messaging => messaging.UsingDekaf(kafka => kafka
.BootstrapServers("localhost:9092")
.Publications(publications => publications.AddPublication(publication => publication
.RoutingKey("greeting") // the key PostAsync resolves the publication with
.Topic("greetings") // defaults to the routing key when not set
.CreateIfNotExists(create => create.NumPartitions(6))))
.Subscriptions(subscriptions => subscriptions.AddSubscription(subscription => subscription
.ToRoutingKey("greeting") // consumed messages are dispatched with this routing key
.Topic("greetings") // defaults to the routing key when not set
.GroupId("greeting-consumers") // defaults to the routing key when not set
.CreateIfNotExists())))));
The client configuration can be customized before each client is created, through ConfigureProducer / ConfigureConsumer / ConfigureAdmin callbacks over Dekaf's fluent builders.
Publishing
The Message.PartitionKey becomes the Kafka record key, the payload the record value, and the message headers the record headers. In CloudEvents binary content mode (the default) the event attributes are carried as ce_* record headers.
Publishing is fire and forget by default. Set WaitForConfirmation() on the publication to await the broker's delivery report instead — broker errors then surface as publish exceptions.
Consuming
Kafka has no per-message acknowledgement: settling a message moves the consumer group's offset. The transport follows the store-then-commit strategy — acked and nacked offsets are committed in batches (CommitBatchSize, default 10) or by a sweeper (SweepUncommittedOffsetsInterval, default 30 seconds), and deferred messages seek the consumer back to the record. Processing is at-least-once. When a group has no committed offset, consumption starts at AutoOffsetReset (default Earliest).
Topic provisioning
AssumeExists()— no provisioning.ValidateIfExists()— fail fast when the topic is missing on the cluster.CreateIfNotExists(...)— create the topic when missing, withNumPartitions(...),ReplicationFactor(...)andConfig(...).
Provisioning never runs while services are registered: each gateway provisions once, the first time it is used, and a failed attempt is retried on the next use.
Documentation
Full documentation lives in the repository docs.
Licence
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. 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. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
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 |
|---|---|---|
| 2.0.0 | 45 | 9/30/2026 |