CDC Performance
0
events/sec sustained

Sustained PostgreSQL to Kafka CDC throughput on a single 4 vCPU instance. Zero data loss across 141M+ events.

75 MB/s sustained · Peak: 98,927 events/sec

Throughput by Sink

Four sinks. One instance.

Sustained throughput from PostgreSQL CDC to each sink on a single c8g.xlarge (4 vCPU, 8 GB RAM).

RabbitMQ70,586/s
File68,825/s
Kafka68,471/s
S352,608/s

Each event is one row change (INSERT, UPDATE, or DELETE), ~1,093 bytes per event (12 columns). Mixed 50/30/20 INSERT/UPDATE/DELETE. Source: RDS db.m5.8xlarge (32 vCPU, 128 GB).

Aggregate Results

550.0M events. Zero data loss.

550.0M
Total events processed
across all sinks
4
Sink targets
independently benchmarked
0
Data loss
zero errors, zero retries
77 MB/s
Peak sustained throughput
70,586 events/sec
Full Results

All the numbers.

Sink
Sustained (events/s)
Total Events
Throughput (MB/s)
RabbitMQ
70,586/s
156.7M
77 MB/s
File
68,825/s
141.8M
75 MB/s
Kafka
68,471/s
141.1M
75 MB/s
S3
52,608/s
110.5M
58 MB/s
1 event = 1 row change (~1,093 bytes per event). Throughput (MB/s) derived from sustained rate.
Methodology

Test environment

Every number on this page was measured on real AWS infrastructure. No synthetic benchmarks, no cherry-picked runs.

Infrastructure
Remac: c8g.xlarge (4 vCPU Graviton 4, 8 GB RAM)Source: PostgreSQL 17 on RDS db.m5.8xlarge (32 vCPU, 128 GB)
Replication
Protocol: pgoutput logical replicationReplica identity: FULL (old + new tuple on UPDATE/DELETE)Slot: Single logical replication slotData integrity: Zero data loss, zero errors across all runs
Workload
Table: bench_standard (12 columns, ~1 KB per row)Operations: 50% INSERT / 30% UPDATE / 20% DELETERate: Unlimited (as fast as possible)Duration: ~30 minutes per sink, 30s warmupGenerator: Zetta
Schema
                     Table "app.bench_standard"
   Column    |        Type        | Nullable
-------------+--------------------+----------
 id          | bigserial          | not null
 name        | varchar(64)        | not null
 email       | varchar(128)       | not null
 tier        | varchar(16)        | not null
 balance     | numeric(12,2)      | not null
 score       | integer            | not null
 is_active   | boolean            | not null
 region      | varchar(32)        | not null
 tags        | varchar(512)       | not null
 notes       | varchar(512)       | not null
 created_at  | timestamptz        | not null
 updated_at  | timestamptz        | not null

Deploy once. Forget the pipeline exists.

Your data arrives where it needs to be, in order, with delivery guarantees and your team never thinks about it again.

Read the docs