Emit
The problem worth solving
Your service just processed a pizza order. You saved it to the database and, in the same breath, tried to publish an event to a message broker. The publish failed. Your database says the order exists. The kitchen heard nothing. Somewhere, a hungry customer is waiting.
This is the dual-write problem, and it corrupts systems in ways that are particularly fun to debug at 2am.
How Emit solves it
Emit is a .NET library for reliable, ordered messaging between services. At its core is the transactional outbox pattern: messages are written to a database table inside the same transaction as your business data, then delivered by a background worker that retries until the broker confirms. Your handler commits everything or nothing.
The outbox is one of several tools Emit provides. An in-process mediator, distributed coordination primitives, and deep Kafka integration all share the same layered middleware pipeline, so cross-cutting concerns like transactions, retries, and observability apply uniformly across every subsystem.
Works with
MongoDB
Document-native persistence with atomic outbox writes.
PostgreSQL
EF Core persistence with your own DbContext.
Apache Kafka
Producers, consumer groups, and the full messaging stack.
OpenTelemetry
Distributed tracing, metrics, and structured logging built in.
What’s in the box
Transactional outbox with durable, ordered delivery and automatic retries. Messages never go missing because a broker hiccupped at the wrong moment.
In-process mediator for typed request/response dispatch. Useful for CQRS handlers that also need to publish events.
Kafka integration with typed producers, consumer groups, fan-out, content-based routing, dead-letter queues, circuit breakers, and rate limiting.
Pluggable persistence across MongoDB and PostgreSQL. You bring your own client; Emit handles the rest.
Cluster coordination with leader election for daemon scheduling and distributed locks available to your own code.
Observability through distributed tracing with W3C propagation, per-subsystem metrics, and structured logging throughout.
Next steps
Ready to try it? Head to the installation guide and have a working outbox in minutes.
Emit is released under the Apache 2.0 License.