Back to writing

January 15, 2026

Notes on Building Event-Driven Systems with Kafka

This is a placeholder post — replace it with your own write-up.

When a system needs to fan work out to multiple consumers without them stepping on each other, an event-driven architecture built on Kafka is a natural fit. A few things matter more than they first appear to:

Partitioning is the whole game

Ordering guarantees in Kafka only hold within a partition, not across a topic. Picking a partition key that matches your actual ordering requirement (e.g. a customer ID or entity ID) is the single most important design decision — get it wrong and you'll see subtle bugs where events for the same entity arrive out of order.

Idempotency is not optional

Consumers will see duplicate messages eventually — that's the trade-off for at-least-once delivery. Designing handlers to be idempotent from day one is much cheaper than retrofitting it after a duplicate-processing incident.

Replacing a system that can't scale

Migrating from a request/response system to an event-driven pipeline usually isn't a rewrite — it's a gradual strangler-fig migration: introduce the event bus alongside the old system, dual-write, verify parity, then cut over consumers one at a time.

old system --> (dual write) --> event bus --> new consumers
                              \-> old consumers (until cutover)

More to come as I write this up properly.