Transports
A transport is an adapter over one native client. Each transport package depends only on its native client and supports only that client's latest major version.
| Package | Broker | Native client | Status |
|---|---|---|---|
Relayer | In-memory, for tests and samples | Built in | Implemented |
Relayer.Kafka | Apache Kafka | Dekaf, a pure C# Kafka client | In development |
Relayer.AzureServiceBus | Azure Service Bus | Azure.Messaging.ServiceBus | In development |
Relayer.AmazonSqs | Amazon SQS and SNS | AWSSDK.SQS and AWSSDK.SimpleNotificationService | In development |
Relayer.RabbitMQ | RabbitMQ | RabbitMQ.Client | In development |
Every transport, including third-party ones, must pass the transport conformance suite: send, receive, settle, retry, dead-letter, delay, ordering, trace propagation and reconnect.
Why Kafka uses Dekaf
Dekaf has no native dependencies, supports Native AOT and is built for zero-allocation hot paths, which matches Relayer's own goals. Where Dekaf already ships a feature, such as retry topics or OpenTelemetry instrumentation, the Kafka transport reuses it instead of re-implementing it.
Building a transport
The core is designed so a transport contains native code only. Start with:
- Writing a transport: registration, runtime adapters and the send seam.
- Receiving messages: the message binding and settlement.
- Consume pipeline: how a consumer is composed at startup.
- Envelopes and headers: mapping CloudEvents headers to native properties.
- Capabilities: what each endpoint declares.