EventMesh is a broker-agnostic distributed messaging platform for .NET. Write your application once against a unified API and deploy against RabbitMQ, Kafka, Redis Streams, Azure Service Bus, AWS SQS, Google Pub/Sub, or NATS JetStream without changing business logic.
EventMesh combines the developer experience of MassTransit and NServiceBus with the interoperability of CloudEvents, the observability of OpenTelemetry, and a capability-driven emulation engine that bridges broker differences transparently.
- Unified messaging API —
PublishAsync,ScheduleAsync,RequestAsync,ReplayAsync, andSubscribeAsyncon a singleIMessageBusabstraction - Seven production transports — RabbitMQ, Kafka, Redis Streams, Azure Service Bus, AWS SQS, Google Pub/Sub, NATS JetStream, plus InMemory for tests and benchmarks
- Capability model — Each broker declares supported features; the runtime emulates missing capabilities where safe
- Reliability patterns — Transactional outbox, idempotent inbox, retry policies, dead-letter queues, and saga support
- CloudEvents envelope — Canonical wire format with pluggable serializers (JSON, MessagePack, Protobuf, Avro)
- Observability-first — OpenTelemetry traces, Prometheus metrics, structured logs with correlation and causation IDs
- Control plane — Optional management API, React dashboard, and
eventmeshCLI for operations and visibility - Plugin architecture — Extend serialization, compression, encryption, authentication, and exporters via versioned plugins
- .NET 10 SDK
- Docker (for local brokers and integration tests)
dotnet add package EventMesh.Core
dotnet add package EventMesh.Transport.RabbitMQdocker compose -f docker/docker-compose.yml up -dusing EventMesh.Core;
using EventMesh.Transport.RabbitMQ;
var builder = WebApplication.CreateBuilder(args);
builder.Services
.AddEventMesh(options =>
{
options.UseRabbitMq(rabbit =>
{
rabbit.Host = "localhost";
rabbit.Port = 5672;
rabbit.Username = "eventmesh";
rabbit.Password = "eventmesh";
});
})
.AddMessageHandler<OrderCreatedHandler>();
var app = builder.Build();
await app.RunAsync();
// In your application code:
await bus.PublishAsync(new OrderCreated(orderId, customerId));
await bus.ScheduleAsync(new PaymentReminder(orderId), TimeSpan.FromMinutes(5));
var response = await bus.RequestAsync<CreateOrder, OrderResponse>(new CreateOrder(items));
await bus.ReplayAsync("orders.created", from: DateTimeOffset.UtcNow.AddHours(-1));dotnet restore EventMesh.slnx
dotnet build EventMesh.slnx --configuration Release
dotnet test EventMesh.slnx --configuration Releasedotnet run --project benchmarks/EventMesh.Benchmarks -c Release| Broker | Package | Native strengths |
|---|---|---|
| RabbitMQ | EventMesh.Transport.RabbitMQ |
Routing keys, priority, TTL, delayed exchange |
| Apache Kafka | EventMesh.Transport.Kafka |
Partitions, consumer groups, offset replay |
| Redis Streams | EventMesh.Transport.RedisStreams |
Consumer groups, pending/claim recovery |
| Azure Service Bus | EventMesh.Transport.AzureServiceBus |
Sessions, transactions, native scheduling |
| AWS SQS | EventMesh.Transport.AmazonSqs |
FIFO queues, delay queues, redrive DLQ |
| Google Pub/Sub | EventMesh.Transport.GooglePubSub |
Ordering keys, seek-based replay |
| NATS JetStream | EventMesh.Transport.Nats |
Durable consumers, sequence/time replay |
See the Broker Capability Matrix for the full feature comparison and emulation behavior.
EventMesh/
├── src/ # Core libraries and transport adapters
├── tests/ # Unit, integration, and compatibility tests
├── benchmarks/ # BenchmarkDotNet performance suite
├── cli/ # eventmesh CLI tool
├── sdk/ # Plugin SDK
├── dashboard/ # React management UI (Milestone 10)
├── docker/ # Local development infrastructure
├── docs/ # Architecture docs and ADRs
└── .github/workflows/ # CI and benchmark automation
| Document | Description |
|---|---|
| ARCHITECTURE.md | System design, layering, data/control plane |
| ROADMAP.md | Milestone plan and delivery status |
| CONTRIBUTING.md | Contribution guidelines and PR process |
| SECURITY.md | Security policy and vulnerability reporting |
| SUPPORT.md | Community and commercial support channels |
| CHANGELOG.md | Release history |
| docs/adr/ | Architecture Decision Records |
| Metric | Target |
|---|---|
| Throughput (InMemory) | 100,000+ messages/sec |
| P95 latency (InMemory) | < 5 ms |
| Test coverage | > 90% at GA |
Benchmark results are published on every release via the benchmark workflow.
EventMesh is released under the MIT License.
We welcome contributions. Please read CONTRIBUTING.md and our Code of Conduct before opening a pull request.