0
0
LLDsystem_design~25 mins

Balance calculation algorithm in LLD - System Design Exercise

Choose your learning style9 modes available
Design: Balance Calculation System
Design covers balance calculation logic, transaction processing, concurrency control, and data storage. Out of scope: user authentication, UI design, external payment integrations.
Functional Requirements
FR1: Calculate user account balances based on transactions
FR2: Support deposits, withdrawals, and transfers
FR3: Ensure balance never goes negative
FR4: Provide real-time balance updates
FR5: Handle concurrent transactions safely
FR6: Allow querying balance history
Non-Functional Requirements
NFR1: Support up to 100,000 concurrent users
NFR2: API response time for balance queries under 100ms
NFR3: System availability 99.9%
NFR4: Data consistency must be strong (no lost updates)
NFR5: Handle up to 10,000 transactions per second
Think Before You Design
Questions to Ask
❓ Question 1
❓ Question 2
❓ Question 3
❓ Question 4
❓ Question 5
❓ Question 6
Key Components
Transaction processor
Balance calculator module
Concurrency control mechanism (locks or optimistic concurrency)
Database for storing transactions and balances
Cache for fast balance queries
API layer for client requests
Design Patterns
Event sourcing for transaction history
Command Query Responsibility Segregation (CQRS)
Optimistic concurrency control
Idempotent transaction processing
Snapshotting for balance state
Reference Architecture
Client
  |
  v
API Layer (REST)
  |
  v
Transaction Processor --- Cache (Redis) 
  |                      |
  v                      v
Database (PostgreSQL) <-- Balance Calculator

Components
API Layer
REST API server
Receives client requests for transactions and balance queries
Transaction Processor
Application service
Validates and processes transactions ensuring no negative balance
Balance Calculator
Service module
Calculates current balance from transactions and snapshots
Database
PostgreSQL
Stores transactions, account data, and balance snapshots
Cache
Redis
Stores recent balances for fast read access
Request Flow
1. Client sends transaction request (deposit, withdrawal, transfer) to API Layer
2. API Layer forwards request to Transaction Processor
3. Transaction Processor checks current balance (from cache or DB)
4. If transaction valid (no negative balance), it records transaction in DB
5. Balance Calculator updates balance snapshot and cache
6. API Layer responds with updated balance
7. For balance queries, API Layer reads from cache or calculates from DB if cache miss
Database Schema
Entities: - Account(account_id PK, user_id, current_balance, last_updated) - Transaction(transaction_id PK, account_id FK, type ENUM('deposit', 'withdrawal', 'transfer'), amount, timestamp, status) - BalanceSnapshot(snapshot_id PK, account_id FK, balance, timestamp) Relationships: - One Account has many Transactions - One Account has many BalanceSnapshots Constraints: - Transaction amount > 0 - Account balance >= 0 enforced by application logic
Scaling Discussion
Bottlenecks
Database write throughput limits with high transaction volume
Cache consistency with concurrent updates
Lock contention on accounts with many simultaneous transactions
Latency in balance calculation for large transaction histories
Solutions
Partition database by account_id to distribute load
Use optimistic concurrency control to reduce locking
Implement sharded caches per account range
Use snapshotting and event sourcing to speed up balance calculation
Batch process low priority transactions asynchronously
Interview Tips
Time: 10 minutes to clarify requirements and constraints, 20 minutes to design components and data flow, 10 minutes to discuss scaling and trade-offs, 5 minutes for questions
Emphasize strong consistency to prevent negative balances
Explain concurrency control to handle simultaneous transactions
Discuss caching strategy for fast balance reads
Describe database schema supporting transaction history and snapshots
Address scaling challenges and realistic solutions