Skip to main content

Posts

Showing posts with the label Apache Kafka

Production CDC Architecture: Debezium Scaling Lessons

Production CDC architecture breaks under load long before most teams expect it. With Debezium, Kafka Connect, and Postgres, the failure patterns are consistent: WAL pressure builds up, connector lag drifts unnoticed, and snapshot phases exhaust memory under bursty traffic. This is based on running these pipelines across high throughput systems, including workloads above 10k TPS. The difference between a system that works and one that holds under pressure comes down to observability, WAL discipline, and how connector scaling is handled. Production Debezium CDC Architecture Operational reality vs. tutorial defaults under real load (10k+ TPS) The Default "Tutorial" Setup Assumes low throughput and stable networks. Fails under pressure. Source: Postgres Single WAL Slot Shared slot coupling multiple connectors Default WAL retention settin...

Agent Observability for Multi-Agent Systems: How to Trace Agent Workflows in Production

Agent observability breaks down when teams try to force long-lived, stateful workflows into dashboards built for stateless microservices. In production, the real challenge is not collecting more logs. It is reconstructing what the agent saw, what state changed, which tool response altered the workflow, and why the system kept going. This article explains why replayable event streams are a better foundation for multi-agent tracing, how a Kafka-first design makes session replay practical, and where conventional tracing still helps but falls short on its own. The production failure that changed how we instrument agents I still remember the first time one of our production agent systems failed without actually crashing. An invoice-processing agent entered a recursive reasoning loop and burned through hundreds of dollars in API credits over a weekend because it kept insisting a validation error existed when it did not. We had logs. We had metrics. We had distributed traces. None of...

Why We Built Our Multi-Agent System on Kafka (And What We Learned)

The 3:47am Incident That Changed Our Architecture At 3:47am on a Tuesday, our monitoring dashboard lit up. Three different teams had just published the same article about agent observability. Marketing wrote it for the corporate blog. Sales adapted it for a prospect deck. Content produced it for our technical newsletter. All three versions were good. All three were complete. All three appeared within 20 minutes of each other. The problem? Nobody knew the other teams were working on it. This wasn’t a coordination failure. It was an architecture failure. Our multi-agent system had no shared truth. Each department’s agent operated independently, pulling from the same source material, generating similar content, with zero awareness of parallel work. That morning, we rebuilt our agent communication architecture on Kafka. Here’s why, what we learned, and the patterns that emerged from six months in production. The Architecture That Failed Our original multi-agent system looked clean...

SQL on Streaming Data Does Not Require a Streaming Engine

Most teams do not need continuous stream processing for day to day Kafka questions. Kafka data is already written as immutable log segments, and those segments can live in object storage. For bounded queries like tailing recent events, time window inspection, and key based debugging, a SQL interface that plans against segment boundaries can replace an Apache Flink or ksqlDB cluster, with clearer costs and less operational overhead. Stream processing engines solved a real problem: continuous computation over unbounded data. Flink, ksqlDB, and Apache Kafka Streams gave teams a way to run SQL-like queries against event streams without writing custom consumers. The operational cost of that solution is widely acknowledged even by vendors and practitioners: you are adopting a distributed runtime with state, checkpoints, and cluster operations. For a large share of the questions teams ask their Kafka data, a simpler architecture exists: SQL on immutable segments in object storage...

Data Processing Does Not Belong in the Message Broker

Apache Kafka made event streaming practical at scale. Pushing data processing into the streaming platform creates recovery, scaling, and isolation problems in production. Vendor documentation, Kafka improvement proposals, and migration case studies point to the same architectural boundary: streaming platforms handle durable transport, processing engines handle state and checkpoints. Separating them leads to systems that scale and recover cleanly. Kafka changed the industry by making event streaming practical at scale. Durable logs, ordering, fan-out, and backpressure turned event-driven systems from fragile prototypes into mainstream infrastructure. Where things get messy is when teams push data processing into the streaming platform itself: Kafka Streams, ksqlDB, broker-side transforms. It starts as convenience and ends as operational coupling. Not because engineers are doing it wrong, but because the streaming layer and the processing layer solve different problems. T...