┌─────────────────────────────────────────────────────────────────────────────┐
│ Frontend Layer │
├─────────────────────────────────────────────────────────────────────────────┤
│ Next.js App (SSR/SSG) │ Real-time Dashboard │ Mobile PWA │
│ - Client Components │ - SSE Connections │ - Offline Support │
│ - Server Components │ - Dynamic UI Updates │ - Push Notifications │
└─────────────────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────────────────────┐
│ API Gateway Layer │
├─────────────────────────────────────────────────────────────────────────────┤
│ Nginx + Easegress API Gateway │
│ - Load Balancing │ - Rate Limiting │ - SSL Termination │
│ - Authentication │ - Request Routing │ - API Versioning │
└─────────────────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────────────────────┐
│ Microservices Layer │
├─────────────────────────────────────────────────────────────────────────────┤
│ Account Service │ Transaction Service │ Payment Service │ Rule Engine Service│
│ Card Service │ Balance Service │ Fee Service │ Notification Service│
│ Customer Service│ Audit Service │ Report Service │ Alert Service │
└─────────────────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────────────────────┐
│ Message & Streaming Layer │
├─────────────────────────────────────────────────────────────────────────────┤
│ NATS (JetStream) Message Queue System │
│ - Event Streaming │ - Message Persistence │ - Dead Letter Queue │
│ - Transaction Events │ - Payment Events │ - Balance Updates │
└─────────────────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────────────────────┐
│ Data Layer │
├─────────────────────────────────────────────────────────────────────────────┤
│ PostgreSQL (OLTP) │ ClickHouse (OLAP) │ Redis (Cache) │
│ - Transactional Data │ - Analytics Data │ - Session Storage │
│ - ACID Compliance │ - Time Series Data │ - Real-time Balances │
│ - Materialized Views │ - Audit Logs │ - Rule Cache │
└─────────────────────────────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────────────────────────────┐
│ Configuration & Service Discovery │
├─────────────────────────────────────────────────────────────────────────────┤
│ etcd Cluster │
│ - Service Discovery │ - Configuration Mgmt │ - Leader Election │
│ - Feature Flags │ - Circuit Breaker │ - Health Monitoring │
└─────────────────────────────────────────────────────────────────────────────┘customers:
- customer_id (UUID, PK)
- customer_number (VARCHAR, UNIQUE)
- first_name (VARCHAR)
- last_name (VARCHAR)
- email (VARCHAR, UNIQUE)
- phone (VARCHAR)
- date_of_birth (DATE)
- status (ENUM: active, suspended, closed)
- kyc_status (ENUM: pending, verified, rejected)
- created_at (TIMESTAMP)
- updated_at (TIMESTAMP)
- created_by (UUID)
- updated_by (UUID)accounts:
- account_id (UUID, PK)
- customer_id (UUID, FK -> customers.customer_id)
- account_number (VARCHAR, UNIQUE)
- account_type (ENUM: checking, savings, credit, wallet)
- currency (VARCHAR(3))
- status (ENUM: active, frozen, closed)
- available_balance (DECIMAL(20,4))
- pending_balance (DECIMAL(20,4))
- credit_limit (DECIMAL(20,4))
- created_at (TIMESTAMP)
- updated_at (TIMESTAMP)
- last_transaction_at (TIMESTAMP)cards:
- card_id (UUID, PK)
- account_id (UUID, FK -> accounts.account_id)
- card_number_hash (VARCHAR)
- card_type (ENUM: debit, credit, prepaid)
- card_status (ENUM: active, blocked, expired)
- expiry_date (DATE)
- daily_limit (DECIMAL(20,4))
- monthly_limit (DECIMAL(20,4))
- pin_attempts (INTEGER)
- created_at (TIMESTAMP)
- last_used_at (TIMESTAMP)transactions:
- transaction_id (UUID, PK)
- account_id (UUID, FK -> accounts.account_id)
- related_transaction_id (UUID, FK -> transactions.transaction_id)
- transaction_type (ENUM: debit, credit, fee, reversal)
- amount (DECIMAL(20,4))
- currency (VARCHAR(3))
- status (ENUM: pending, posted, archived, failed)
- description (TEXT)
- reference_number (VARCHAR, UNIQUE)
- merchant_info (JSONB)
- posting_date (DATE)
- transaction_date (TIMESTAMP)
- created_at (TIMESTAMP)
- posted_at (TIMESTAMP)
- archived_at (TIMESTAMP)payments:
- payment_id (UUID, PK)
- from_account_id (UUID, FK -> accounts.account_id)
- to_account_id (UUID, FK -> accounts.account_id)
- payment_type (ENUM: transfer, payment, topup)
- amount (DECIMAL(20,4))
- currency (VARCHAR(3))
- status (ENUM: initiated, processing, completed, failed, reversed)
- payment_method (ENUM: card, bank_transfer, wallet)
- reference_number (VARCHAR, UNIQUE)
- external_reference (VARCHAR)
- scheduled_at (TIMESTAMP)
- processed_at (TIMESTAMP)
- created_at (TIMESTAMP)rules:
- rule_id (UUID, PK)
- rule_name (VARCHAR)
- rule_type (ENUM: fee, limit, validation, alert)
- rule_category (VARCHAR)
- conditions (JSONB)
- actions (JSONB)
- priority (INTEGER)
- effective_from (TIMESTAMP)
- effective_till (TIMESTAMP)
- status (ENUM: active, inactive, draft)
- created_at (TIMESTAMP)
- updated_at (TIMESTAMP)
rule_executions:
- execution_id (UUID, PK)
- rule_id (UUID, FK -> rules.rule_id)
- entity_type (VARCHAR)
- entity_id (UUID)
- input_data (JSONB)
- output_data (JSONB)
- execution_time_ms (INTEGER)
- executed_at (TIMESTAMP)fee_tiers:
- tier_id (UUID, PK)
- tier_name (VARCHAR)
- tier_type (ENUM: customer, account, transaction)
- effective_from (TIMESTAMP)
- effective_till (TIMESTAMP)
- created_at (TIMESTAMP)
fee_structures:
- fee_structure_id (UUID, PK)
- tier_id (UUID, FK -> fee_tiers.tier_id)
- transaction_type (VARCHAR)
- fee_type (ENUM: flat, percentage, tiered)
- flat_amount (DECIMAL(20,4))
- percentage_rate (DECIMAL(10,6))
- minimum_fee (DECIMAL(20,4))
- maximum_fee (DECIMAL(20,4))
- currency (VARCHAR(3))transaction_analytics:
- transaction_id (String)
- account_id (String)
- customer_id (String)
- transaction_type (String)
- amount (Decimal64(4))
- currency (String)
- merchant_category (String)
- location (String)
- timestamp (DateTime64)
- processing_time_ms (UInt32)
- status (String)
- date (Date)
- hour (UInt8)balance_history:
- account_id (String)
- balance_date (Date)
- balance_timestamp (DateTime64)
- available_balance (Decimal64(4))
- pending_balance (Decimal64(4))
- currency (String)
- change_amount (Decimal64(4))
- change_reason (String)Key: "balance:{account_id}"
Type: Hash
Fields:
- available: "1000.50"
- pending: "150.25"
- last_updated: "1640995200"
- currency: "USD"Key: "rules:{rule_type}:{entity_id}"
Type: String (JSON)
TTL: 3600 seconds (1 hour)Key: "session:{session_id}"
Type: Hash
TTL: 1800 seconds (30 minutes)Responsibilities:
Key Features:
Responsibilities:
Key Features:
Responsibilities:
Key Features:
Responsibilities:
Key Features:
Responsibilities:
Key Features:
// Account Service
service AccountService {
rpc GetAccount(GetAccountRequest) returns (Account);
rpc UpdateBalance(UpdateBalanceRequest) returns (BalanceResponse);
rpc GetRealTimeBalance(GetBalanceRequest) returns (stream BalanceUpdate);
}
// Transaction Service
service TransactionService {
rpc CreateTransaction(CreateTransactionRequest) returns (Transaction);
rpc PostTransaction(PostTransactionRequest) returns (TransactionResponse);
rpc GetTransactionHistory(GetHistoryRequest) returns (stream Transaction);
}
// Rule Engine Service
service RuleEngineService {
rpc EvaluateRules(EvaluateRulesRequest) returns (RuleEvaluationResponse);
rpc CreateRule(CreateRuleRequest) returns (Rule);
rpc GetActiveRules(GetActiveRulesRequest) returns (stream Rule);
}// Transaction Events
transactions.created.{account_id}
transactions.posted.{account_id}
transactions.failed.{account_id}
// Balance Events
balances.updated.{account_id}
balances.insufficient.{account_id}
// Payment Events
payments.initiated.{payment_id}
payments.completed.{payment_id}
payments.failed.{payment_id}
// Rule Events
rules.evaluated.{rule_id}
rules.triggered.{entity_type}.{entity_id}
// System Events
alerts.generated.{severity}
system.health.{service_name}// Real-time balance updates
/api/sse/balance/{accountId}
// Transaction status updates
/api/sse/transactions/{transactionId}
// System alerts
/api/sse/alerts/{userId}JetStream Configuration:
- Retention: WorkQueue for transactions
- Retention: Interest for notifications
- Max Age: 7 days for audit events
- Replicas: 3 for high availability// Transaction Event
{
"event_type": "transaction.created",
"timestamp": "2024-01-01T12:00:00Z",
"account_id": "uuid",
"transaction_id": "uuid",
"amount": "100.50",
"currency": "USD",
"metadata": {}
}
// Balance Update Event
{
"event_type": "balance.updated",
"timestamp": "2024-01-01T12:00:00Z",
"account_id": "uuid",
"previous_balance": "1000.00",
"new_balance": "900.50",
"change_reason": "transaction"
}// Hierarchical key structure
fintech:accounts:{account_id}:balance
fintech:customers:{customer_id}:profile
fintech:rules:{rule_type}:active
fintech:fees:{tier_id}:structure
fintech:sessions:{session_id}:dataTransaction → NATS Event → Balance Service → Redis Update → SSE Push → UI Update{
"rule_id": "uuid",
"name": "Daily Transaction Limit",
"type": "validation",
"conditions": {
"account_type": "checking",
"daily_amount": {"$lte": 5000},
"transaction_count": {"$lte": 50}
},
"actions": {
"reject": true,
"message": "Daily limit exceeded"
},
"effective_from": "2024-01-01T00:00:00Z",
"effective_till": "2024-12-31T23:59:59Z"
}Metabase Dashboard → PostgreSQL/ClickHouse → Real-time Data SyncPostgreSQL → CDC → Kafka/NATS → ETL Service → ClickHouse → MetabaseThis architecture provides a robust, scalable, and maintainable fintech platform that handles real-time transactions, complex rule processing, and comprehensive reporting while maintaining high availability and data consistency.