Spine build · Engineer

CDC head-to-head: Debezium, Airbyte, OLake

Three change-data-capture tools, one source, one workload, one harness: a decision record built before the answer is known.

Status
Harness ready · not yet measured
Lead demand
Engineer · Solutionist posture
Spine plane
L1 Evidence · L7 Execution & Feedback
Method stage
Compare · Consolidate
Availability
Harness ready

· What it gives you

If you want to choose a change-data-capture tool on evidence rather than habit,

A reproducible head-to-head on your own source, with a decision recorded per leg of the architecture and every figure traceable to a run.

I The problem

Change data capture is where the lakebase's truth becomes everyone else's events. Tools are usually chosen on a vendor page or a colleague's habit, and the choice then shapes the broker, the lakehouse and the cost of every replay for years.

II Approach

  1. Point all three tools at the same Postgres lakebase, with logical replication on and synthetic data only.
  2. Seed the same rows, then apply the same seeded workload of inserts, updates and deletes, each change carrying a unique sequence number so arrival can be checked exactly.
  3. Measure snapshot time, change-to-arrival latency (p50 and p95), burst throughput, ordering per key, delete and tombstone handling, a column added mid-run, kill-and-restart recovery (duplicates and gaps) and resource footprint.
  4. Write every number to a results file from the harness only; a value nobody measured prints as "not yet measured", never as an estimate.
  5. Decide per leg, not overall: the event leg and the lakehouse leg ask different things of change capture.

III Structure

  1. SourcePostgres lakebase, logical replication, synthetic rows
  2. WorkloadSeeded inserts, updates, deletes, one schema change
  3. ToolsDebezium Server → NATS JetStream (default) · Debezium → Kafka · OLake → Iceberg · Airbyte → Kafka
  4. HarnessLatency, ordering, deletes, schema, restart, footprint
  5. RecordResults table rendered only from measured files

· Results

Not yet measured. This table is rendered from the harness's result files; no number here is written by hand.

MeasureDebeziumOLakeAirbyte
Initial snapshotnot yet measurednot yet measurednot yet measured
Change-to-arrival latency, p50 / p95not yet measurednot yet measurednot yet measured
Burst throughputnot yet measurednot yet measurednot yet measured
Ordering violations per keynot yet measurednot yet measurednot yet measured
Deletes and tombstonesnot yet measurednot yet measurednot yet measured
Column added mid-runnot yet measurednot yet measurednot yet measured
Kill and restart: duplicates, gapsnot yet measurednot yet measurednot yet measured
CPU and memory footprintnot yet measurednot yet measurednot yet measured

· Design fit, from the documentation

What each tool is built to do, read from its own documentation. This is not a measurement, and it is where the measurement will either agree or embarrass it.

Debezium

Log-based streaming of row changes into Kafka, which is the shape the event leg already has. A delete arrives as a delete plus a tombstone. Delivery is exactly-once in normal running and at-least-once after a crash, which is why the projector deduplicates by event id. Costs: row changes rather than decision events. The reference stack now runs it as Debezium Server, a single process that writes into NATS JetStream with no Kafka Connect cluster to operate; the Kafka Connect form remains for the comparison.

OLake

Built for Postgres to Apache Iceberg, with full refresh plus change capture through pgoutput and an upsert mode that deduplicates. It fits the analytical leg, history in the lakehouse, rather than the event bus: it runs as sync-and-exit batches, so its latency is a batch property.

Airbyte

An ELT platform with a UI, the broadest connector catalogue and scheduled syncs. It is the heaviest to run, and its Kafka destination appends without deduplicating, so the consumer must dedupe (the projector already does). It needs care with replication-slot retention, or a sync fails until the slot is recreated.

· Position, provisional

Decided per leg, pending the run. Debezium for the event leg, where order, deletes and replay matter most. OLake for the lakehouse leg, where volume into Iceberg matters more than milliseconds. Airbyte where the source is one of the many systems the other two don't reach. If the measurements disagree, the measurements win and this paragraph changes, with the reason recorded.

The reference stack and harness →   The event-sourced search →

IV Craft and next

Debezium Server · NATS JetStream · OLake · Airbyte · Kafka · Postgres · Docker Compose

The harness, connector configs and compose stack are in the reference stack, validated but not yet run. The table fills when the stack runs on the in-house workstation; until then the position below is provisional and says so.

← All work   The architecture →

Nkosinathi Mbambo

Want this working in your organisation?

Bring the decision that keeps coming back. I will tell you plainly whether this instrument fits, what it would take, and what it would not do.

Start a conversation →or book a time →