- Architecture decision record
- Topic and partition design document
- Working outbox + consumer implementation
- Dead-letter runbook
- Load test results — latency and throughput at target volume
Event-driven microservices that survive contact with production.
Most event-driven rewrites fail quietly — a consumer that isn't idempotent double-processes an order, an outbox that isn't transactional loses an event during a deploy, a retry storm takes down the very topic it was supposed to protect.
We design Spring Boot services on Kafka with the failure modes handled up front: transactional outbox for reliable publishing, idempotent consumers so retries are safe, dead-letter queues so a bad message doesn't block the topic, and backpressure so one slow consumer doesn't cascade.
What this looks like in practice
Kafka topic and partition design around your actual access patterns, not a generic tutorial layout.
Transactional outbox pattern so a DB write and an event publish either both happen or neither does.
Idempotent consumers keyed on business identity, not just message ID.
Dead-letter queues with a replay path your team can actually operate.
Schema Registry (Avro/Protobuf) so producers and consumers don't drift silently.
Load-tested throughput numbers before go-live, not after the first incident.
What you get
Event-driven, in production
Order-processing platform at scale — event-driven Spring Boot services on Kafka, 90% faster processing, in production for 2+ years for the same client. Read the case study →
Event-driven microservices — frequently asked questions
Why do event-driven rewrites fail?
What is the transactional outbox pattern, and why do we need it?
How do you make consumers idempotent?
Do we need a Schema Registry?
Can you work with our existing Kafka setup?
Talk to an architect about your event system.
Tell us where your events are going missing, backing up or being processed twice — we'll map the fix.