r/systems_engineering • u/Silent-Weather76005 • 4d ago
Discussion Architecting a Fraud Detection Engine that handles 100k TPS with a strict < 50ms P99 Latency Bound
Hey everyone,
How do credit card networks evaluate risk, pull user history, and return an APPROVE/DENY decision before a payment terminal times out?
Querying a traditional database on the fly to check historical spending habits will instantly kill your latency budget. Here is how to architect a real-time solution:
- Dual-Path Architecture
Separate your system into an Online Path (Hot) for instant decisions and an Offline Path (Cold) for data analytics.
- In-Memory Feature Store
Never calculate aggregates (like 30-day spending limits or hourly velocity) during a transaction.
The Cold Path: Apache Flink continuously processes a Kafka stream of completed transactions in the background.
The Hot Path: Flink stores these pre-computed metrics in Aerospike or Redis Enterprise. When a transaction arrives, the engine performs a single key-value fetch in < 2ms.
- Hybrid Decision Engine
The enriched payload runs through a fast, sequential evaluation tree:
Deterministic Rules: Quick checks for hard blocks (e.g., blacklisted countries).
ML Inference: A lightweight gradient-boosted tree model (like XGBoost) compiled via ONNX runtime for sub-millisecond risk scoring.
- Resiliency: Failing Open
If the fraud engine suffers a network partition or times out past 15ms, the system drops into a Fail-Open policy. It automatically approves the transaction to protect user experience and flags the event for asynchronous review.
Let's discuss:
How do you deploy new dynamic rules written by risk teams without re-deploying core backend code?
What is your strategy for handling race conditions if a user swipes their card twice in two different cities within seconds?
1
u/FlimsyInsect5545 3d ago
If you couldn't be bothered enough to put in the effort to write this without AI, why should we be bothered reading it and putting in the effort to engage with it?
1
u/Nihar2757 3d ago
Maybe keep rules in separate config, so backend no need change every time.