Overview
A Wirekite queue target is a first-class destination — alongside file/DB targets — that receives the change-data-capture stream produced by an extractor. A migration may have a file/DB target, a queue target, or both. When a queue is configured, every committed change is published as a message; the queue is the integration point for downstream consumers (your loader, a stream processor, a search index, etc.).Queue targets are used during the replication phase only. Initial
schema and bulk-data loads always go through the file/DB target. A
migration whose only target is a queue is therefore a replication-only
migration — it cannot be run in
data or data-replication modes.Supported backends
All four source databases (MySQL, PostgreSQL, Oracle, SQL Server) can
publish to any of the three backends. The choice is per-queue-target,
not per-deployment — a single Wirekite installation can have Kafka,
Redpanda, and Pub/Sub queue targets in use at the same time.
Configuration parameters
The same parameter set applies whether you create a queue target through the UX wizard, the API, or by hand-writing extractor configs forqa/fulltest. A queue target is identified by queueType; the rest of
the parameters split into shared, kafka-only, and pubsub-only groups.
Shared parameters
string
required
Backend selector. One of
kafka, redpanda, pubsub. Empty value
defaults to kafka for backward compatibility with pre-Pub/Sub configs.string
required
Topic / Pub/Sub topic id. A single topic carries every change record
for the migration — there is one topic per queue target, not one per
source table. Customer pre-creates the topic; Wirekite errors loudly
at startup if it does not exist.
integer
default:"1"
Number of
.ckt change-record lines packed into a single broker
message. 1 means one line per message (highest fidelity, highest
message count). Higher values reduce broker RPC volume but increase
per-message size. See “Message compilation” below for the exact
packing rules.Kafka / Redpanda parameters
string
required
Comma-separated list of broker addresses (e.g.
broker1.example.com:9092,broker2.example.com:9092). The first
broker is dialed at startup as a connectivity check; subsequent
metadata is discovered from the cluster.string
default:""
Wire-format compression codec. One of
"" (no compression), none,
snappy, lz4, zstd. Unknown codecs are rejected at startup.Google Pub/Sub parameters
string
required
GCP project id that owns the topic. Used as the project segment in
projects/<project>/topics/<topic>.string
required
Absolute path to a service-account JSON key on the extractor host.
The plaintext file is encrypted in place by the API at queue-target
creation time, so the unencrypted contents do not need to remain on
disk afterwards. Empty value falls back to Application Default
Credentials.
The
queueCompression field is rejected on Pub/Sub queue targets —
gRPC handles transport compression transparently. Setting it surfaces a
config typo rather than silently ignoring it.Message compilation
The change extractor produces a stream of native Wirekite.ckt change
record lines, each line representing one row event in the form:
OP is one of I (insert), U (update), D (delete). Every line is
self-contained and carries the full row image as required by the
downstream change loader.
Per-line vs batched messages
WhenqueueBatchSize=1, every .ckt line becomes one queue message.
When queueBatchSize=N (N > 1), the publisher accumulates lines in an
internal buffer and emits one message holding N newline-terminated
.ckt records once the buffer is full. The downstream consumer
demultiplexes by splitting the message body on \n.
Batching trade-offs:
For high-volume migrations,
queueBatchSize=100 is a typical sweet spot;
beyond that, broker per-message limits start to bind on wide rows.
Ordering and partitioning
Change records for a given source row must arrive at the consumer in commit order, otherwise CDC semantics break (e.g. anUPDATE arriving
before its preceding INSERT). Wirekite preserves per-table order:
When
batchSize > 1 and the backend is Pub/Sub, lines are accumulated
in per-table batchers — a single Pub/Sub message never mixes rows
from different tables, because every message has exactly one ordering
key. Kafka does not have this constraint; Kafka batches may contain
mixed-table rows because per-partition order is sufficient.
Flush boundaries
FlushAll is called at every source-side commit boundary — a SQL
transaction in MySQL/Postgres/Oracle, a Log Sequence Number group in
SQL Server. This guarantees:
- A message never contains rows from two different transactions.
- Counters never include a partial transaction.
- Downstream consumers see committed state only.
Retries
Wirekite delegates retry policy to the underlying SDK on each backend. The Wirekite layer itself does not retry — it relies on the SDK’s internal retry budget and treats an exhausted-retries error as terminal.
Once the SDK signals a permanent failure, Wirekite’s behavior is
fail-fast:
- Increment the
errorscounter. - Log a
FATALline naming the failure. - Exit with code
1.
enable-exactly-once-delivery subscription flag).
The fail-fast policy is a deliberate design choice. CDC streams are
strongly ordered; silently dropping or reordering a record corrupts the
downstream replica. Loud failure plus replay from the last commit
boundary is the only safe recovery shape.
Stall watchdog (Pub/Sub only)
The Google Pub/Sub publisher has an additional safety net for the case where the SDK’s per-message future never resolves — neither succeeding nor failing. A watchdog ticks every 5 seconds and tracks whether thedelivered counter is advancing. If it has been frozen for 30 seconds
while there are unresolved publishes, the extractor logs a
FATAL: QUEUE stall detected line and exits. The orchestrator then
treats this the same way as any other publish failure (Replication
Failed → Resume from Failed). Kafka does not need an equivalent
watchdog — librdkafka’s message.timeout.ms already covers this
failure mode.
Charts and operational signals
The Replication pane in the Wirekite UX shows a Queue subpane for every migration that has a queue target. It surfaces three series on one chart:
In a healthy migration
Delivered/min tracks Extracted/min closely;
sustained divergence indicates broker back-pressure. Errors > 0 is
always followed by extractor exit (fail-fast), so a non-zero point on
the errors series is the marker for a failure incident.
The publishers run in async mode on the Go side (
Async: true for
Kafka, completion-worker pool for Pub/Sub), so submitted (Extracted)
and delivered are tracked separately. On the SQL Server C extractor
both counters are wired through librdkafka’s delivery-report
callback (Kafka) or google-cloud-cpp’s per-publish future (Pub/Sub),
producing the same semantics. The chart schema is identical across
all four extractors.submitted and delivered should match exactly when a run completes
cleanly. A non-zero errors always co-occurs with a FATAL line
earlier in the log.
Error conditions
For backend-specific setup (broker bring-up, IAM, subscription flags),
continue to the next pages.
