Real-Time Transaction Event Backbone for a Payments Processor
Challenge
Delivering exactly-once semantics across legacy databases that lacked clean primary keys, and keeping PCI scope tight while still sharing data broadly. We tokenised card data at the CDC edge and enforced field-level schema rules before any event reached shared topics.
Approach
We designed a multi-cluster Apache Kafka deployment with Schema Registry (Avro) and topic naming and retention conventions per domain. Change Data Capture (Debezium) streamed events from the existing Oracle and PostgreSQL databases, so the source applications needed almost no changes. Apache Flink jobs handled enrichment (merchant, currency, risk tier) and wrote curated streams to a lakehouse (Iceberg on object storage) and to an operational analytics store. We added an outbox pattern for new services, consumer-lag dashboards in Grafana, and a self-service topic provisioning workflow tied to Git.
Outcome
Reporting freshness moved from T+1 to near real time (seconds to low minutes) Illustratively ~40–60% fewer point-to-point integrations as teams subscribed to shared topics Reconciliation breaks surfaced the same day rather than the next morning A governed schema contract reduced breaking changes between teams A reusable pattern for onboarding new payment rails