Real-time transaction enrichment on Kafka and Scala
A card issuer's fraud team moved from overnight batch to sub-second stream enrichment using Scala, Akka Streams and Kafka.
< 400ms
p95 latency
12k events/sec
Throughput
6
Overnight jobs replaced
The challenge
A UK card issuer's fraud team was working from overnight batches. Alerts fired hours after a fraudulent pattern had run its course, and reconciliation across three source systems relied on scheduled jobs that regularly slipped their SLAs. The team needed sub-second enrichment without abandoning their existing Kafka backbone.
What we did
- Designed a streaming architecture on Kafka with enrichment services in Scala using Akka Streams and Alpakka connectors.
- Built type-safe schemas with Avro and the Confluent Schema Registry, breaking-change checks enforced in CI so producers can't silently break consumers.
- Ran the services on Kubernetes (AKS) with backpressure, dead-letter queues and idempotent consumers for at-least-once semantics.
- Instrumented end-to-end with OpenTelemetry, Prometheus and Grafana, including per-tenant SLOs the fraud team can see and challenge us on.
Results
- End-to-end enrichment latency: overnight batch → p95 under 400ms.
- Fraud rule engine now receives enriched events in-flight, not after the fact.
- Zero schema-related production incidents in the six months since go-live.
- Handover documentation and a runbook the on-call rota actually follows.
“They understood Scala, they understood Kafka, and, importantly, they understood our controls environment. That combination is rarer than it should be.”
Ready to build?
Tell us what you need built. We'll reply within one working day with an honest answer.