CDC Review and Design
Sources, tables, volumes, consumers and delivery needs read against the options below, ending in a written recommendation and a plan your DBAs can review.
Change Data Capture
Last reviewed by Tyler Eastridge
Change data capture (CDC) streams every insert, update and delete from a database's transaction log to other systems as it happens, without polling the tables or adding triggers, which is how trigger-based CDC writes changes into extra tables inside the source database. AceMQ designs the pipeline, builds it with Debezium Server into RabbitMQ or with Kafka as the target, tunes the consumers so events stay in order and bad ones do not block the queue, and then supports or runs it on a four-tier ladder.
Is This You?
Nightly batch extracts are the only way other systems learn what changed, and the business wants minutes, not a day
Triggers or a last_updated column feed a sync job that misses deletes and slows the source database
A CDC connector exists, but nobody can say what happens to it when the broker or the database restarts
Change events reach a consumer out of order, and a row ends up in a state it was never in
One malformed event blocks a queue, or loops forever, and downstream data goes stale behind it
A Kafka cluster was built for a CDC pipeline that moves a handful of tables to a few consumers
The transaction log fills the disk, or is purged during an outage, and the pipeline has to start again with a full snapshot
Outcomes
Concrete state changes, not deliverable counts. This is what actually differs about your Infrastructure estate when the engagement closes.
Before
Downstream systems learn about changes from a nightly job.
A log-based CDC pipeline that publishes each committed change as an event, with a stated delivery guarantee and a named owner for each stage.
Before
Events arrive out of order and nobody knows why.
Consumer and queue settings that preserve order where it matters, with prefetch, redelivery and single-consumer behaviour tested rather than assumed.
Before
One poison event stalls the pipeline.
Dead-lettering with a delivery limit, an alert on the dead-letter queue and a documented way to inspect, fix and replay what lands there.
Before
Recovery means a call to the one person who built it.
Runbooks for restart, offset and snapshot handling that your own engineers can follow, then cover from the engineers who wrote them.
Scope
Sources, tables, volumes, consumers and delivery needs read against the options below, ending in a written recommendation and a plan your DBAs can review.
Log settings, retention, replication slots or per-table capture, and the change list your DBAs need to approve, proven in a test environment before production.
Debezium Server into RabbitMQ where Kafka is more than the job needs, Kafka Connect where Kafka already runs, with offsets and schema history on storage that survives a restart.
Exchanges or streams per table, queue types, prefetch, dead-lettering, delivery limits and idempotent consumers, designed together because most CDC faults sit between them.
Lag, slot and log retention alerts, dead-letter queue depth, and a trace identifier that lets you follow one row change from the database to the consumer's log.
Snapshots, schema changes, upgrades and recovery written for the people on the pager, then support or managed operation on the tier you choose.
The Engagement
Every phase has a defined duration and a concrete artifact handed over at the end of it. You always know what stage you're in and what you've received.
We read each source database's log settings and retention, the tables and change rates to capture, the consumers and what each needs from an event. The output is a written recommendation on method, transport and ownership, with the reasoning attached.
You receive
Event shape, exchange or topic layout, queue types, ordering rules, retry and dead-letter policy, and where offsets and schema history will live. The failure modes to rehearse are agreed before anything is built.
You receive
We configure the connectors and the broker with your team, run the initial snapshot without disrupting production, then break it on purpose: broker restart, connector restart, source failover and a poison event.
You receive
Runbooks for snapshots, offsets, schema changes and recovery, a handover session, and the support tier you choose, from on-call escalation to AceMQ running the pipeline.
You receive
There are four ways to find out what changed in a database. Log-based CDC reads the transaction log, so it sees every committed insert, update and delete, including deletes, in commit order, with little load on the tables. The other three each give something up. Most CDC tools, open source or managed, are a packaged form of one of them.
| Approach | How it finds changes | Example tools | Fits when | Watch for |
|---|---|---|---|---|
| Log-based, self-run | Reads the database's transaction log (WAL, binlog, SQL Server change tables) and emits one event per row change. | Debezium on Kafka Connect or Debezium Server | Services and brokers need events in commit order, and you want to own the pipeline. | Log retention and slot growth, snapshots, offsets and schema history. You operate it. |
| Log-based, managed | The same log reading, run as a cloud service or SaaS that loads a target. | AWS DMS, Google Datastream, Fivetran, Striim, Qlik Replicate, Oracle GoldenGate | The consumer is a warehouse or a replica and you want someone else to run capture. | Pricing model, which sources and targets are supported, and how much event shape you control. |
| Trigger-based | Database triggers write each change to a shadow table that a job reads. | Hand-built, or older replication products | A source with no readable log and a small number of tables. | Every write pays for the trigger. Schema changes break it. |
| Query-based | A job selects rows changed since a timestamp or version column. | ELT sync jobs, scheduled SQL | A latency of minutes or hours is fine and deletes are tracked another way. | Misses hard deletes and intermediate states. Needs a reliable change column. |
Native logical replication in PostgreSQL or MySQL replication is a fifth option when the target is another instance of the same database. It is often the right answer for a single source and a single destination, and we say so when the review shows it.
Each database exposes its transaction log differently, and the source database needs a few settings changed before a connector can read it. Those changes usually need a DBA's approval, so we write the change list and prove it in a test environment first.
Log-based capture reads the log instead of querying tables, so its load on the source is usually lower than triggers or polling, but it is not zero. SQL Server writes and cleans change tables inside the database, and a PostgreSQL slot holds disk. We size both before go-live.
The capture side and the transport are separate decisions, and the transport should follow the consumers.
Debezium Server runs exactly one connector per instance, so several sources mean several instances. Its offsets default to a local file, which is lost on a container's ephemeral disk, so where they live is a design decision made before the first snapshot.
Most CDC incidents are not in the capture. They are in the queue and consumer behind it. These are the settings we check first on a RabbitMQ-based pipeline.
A change event is only safe to apply if the events before it for the same row have been applied. RabbitMQ round-robins messages across consumers on a queue unless the queue is declared as single active consumer, and a consumer that holds a batch of unacknowledged messages and then fails hands that whole batch back for redelivery. In our field experience a prefetch of 1 on the queue of an ordered CDC consumer kept events in order where a larger prefetch did not. Pair it with one active consumer per queue, or with a routing key that sends one table's events to one consumer. This is our practice rather than a RabbitMQ rule: a prefetch of 1 trades throughput for a smaller in-flight window, so test it against your own load.
A poison event is one that a consumer can never process, such as a payload it cannot parse. Without a limit it is redelivered forever and everything behind it waits. On quorum queues the delivery limit defaults to 20 from RabbitMQ 4.0, and a message that reaches it is dropped, or dead-lettered if a dead-letter exchange is configured. Set the exchange, and use the at-least-once dead-letter strategy, which requires the reject-publish overflow setting and can produce duplicates at the target. Alert on the dead-letter queue and write down how someone inspects, fixes and replays what lands there.
A change in RabbitMQ 4.3
From RabbitMQ 4.3 the delivery limit counts delivery-count, so a consumer that negatively acknowledges an event with requeue no longer moves it towards the limit, while a reject does. A consumer that nacks a poison event in a loop can spin indefinitely. Reject it so it dead-letters, or route it explicitly.
When the broker or the database goes away, a connector can stop. The pipeline survives if the process is restarted by its supervisor, such as Kubernetes, and if its offsets sit on storage that persists, because the connector resumes from the last committed offset. Offsets are committed periodically, so after an outage some events can arrive twice. Delivery is at least once, not exactly once, and consumers must be idempotent on the primary key. On PostgreSQL the same holds inside the database: a slot's position is persisted at checkpoint, so after a crash recent changes can be sent again.
A connector that is down needs the database to keep its log. If the log is purged during an outage there is no position to resume from and the answer is a new snapshot. Set retention longer than the longest outage you must survive, and alert before it runs out. On PostgreSQL an unconsumed replication slot does the opposite and keeps WAL until the disk fills, so slot lag needs an alert as well.
Stamp each event with an identifier that travels in a message header and appears in the consumer's logs. When a row is wrong downstream, a trace identifier turns a search across three systems into one query. Time-ordered identifiers such as UUID version 7 also sort by creation, which helps when reading logs.
American National Insurance needed CDC for SQL Server on Kubernetes and evaluated Kafka. Running Kafka and Kafka Connect was out of proportion to the volume and routing the pipeline needed, so Kafka was judged too complex for the job. AceMQ assessed the requirement and designed a standalone Debezium deployment that publishes change events straight to RabbitMQ exchanges, keeping SQL Server change capture and adding more flexible routing.
| Tier | What it is | The question it answers |
|---|---|---|
| Tier 1: Reactive support | Senior engineers on call for incidents under a contracted SLA, with a 15-minute emergency response. | Change events have stopped. Who joins the call? |
| Tier 2: Proactive support | Tier 1 plus monitoring of lag, log retention, slot growth and dead-letter queues. | Who notices the lag before the business does? |
| Tier 3: Managed on your infrastructure | AceMQ operates the pipeline inside your cloud account or data center. | The data must stay inside our boundary and we do not want the pager. |
| Tier 4: Managed on AceMQ's infrastructure | AceMQ hosts and operates the broker and the capture. | We want it run for us, and our policy allows a hosted service. |
Customer Success
See how enterprises trust AceMQ for their most critical Infrastructure workloads.
American National Insurance
American National Insurance chose a standalone Debezium + RabbitMQ architecture for SQL Server change data capture after judging Kafka too complex to run for the job, keeping operations lean and routing flexible.
Regional Insurer
What a platform review covers when several teams want streaming and nobody has decided which broker, processor and operating model the company will run.
Digital Banking Platform
Ongoing support for a cluster where an abandoned logical replication slot repeatedly filled the WAL volume and threatened to halt the primary.
Subscription Software Provider
Stopping an Airbyte connection that kept dropping out of incremental mode and re-running full refreshes against a large table every night.
Regional Retail Bank
Bringing an Oracle change data capture pipeline back inside its batch window after nightly jobs left the Debezium connector hours behind the source.
Online Travel Platform
Ongoing support for a MySQL change data capture pipeline that needed a full re-snapshot after a planned outage outlasted binlog retention and a trimmed schema history topic.
SaaS Platform Team
Stopping out-of-order change events and stalled queues in a Debezium to RabbitMQ pipeline by designing the consumers, queues and dead-letter path together.
FAQ
Change data capture is a way of finding out what changed in a database and sending each change to other systems as it happens. Log-based CDC does this by reading the database's transaction log, so it captures inserts, updates and deletes in commit order without polling the tables or adding triggers.
ETL and ELT move data in scheduled batches, usually into a warehouse. CDC moves each change as it is committed, so services and queues can react in near real time. Many teams use both: CDC to capture changes, and a loader to land them in a warehouse.
It depends on the consumer. Services and brokers fit log-based tools such as Debezium. Warehouses fit managed services such as AWS DMS, Google Datastream or Fivetran. A single PostgreSQL or MySQL copy can use native replication. We compare them for your sources in the review.
No. Debezium usually runs on Kafka Connect, but Debezium Server runs the same connectors as a standalone application and can publish to RabbitMQ, RabbitMQ Streams and other destinations. Kafka is the better fit when many consumers need to replay history from an offset.
Log-based CDC reads the transaction log rather than querying tables, so its load is usually lower than triggers or polling, but not zero. SQL Server maintains change tables inside the database, and a PostgreSQL replication slot holds WAL on disk. Delivery is at least once, so consumers must also handle duplicates.
Let's talk
Tell us which databases you capture from, where the changes go and what has gone wrong. We will scope a CDC review and reply to your quote request within 1 hour.
Send us a message and we'll follow up within 1 hour — or book a free 30-min consultation directly.
305-204-2607info@acemq.comPrefer to talk now? Call us directly or use the consultation tab to find a time that works.