Scalability: Handle millions of requests per minute
Performance: Sub-second query response time for recent data
Availability: 99.9%+ uptime with fault tolerance
Flexibility: Support various time window configurations
Consistency: Provide accurate counts with minimal error rates
Cost-efficiency: Optimize storage and compute resources
Traffic volume: 10M requests/minute (167K requests/second)
Data size: ~200 bytes per request record
Storage requirements:
Define what APIs are expected from the system...
GET /api/v1/topk
Parameters:
- k: integer (default: 10)
- start_time: timestamp
- end_time: timestamp
- granularity: [minute|hour|day]
- filters: JSON object of attribute filters
Two-tier storage approach:
request_counters:<window> → {request_hash: count}Table: request_metrics
- timestamp (partition key)
- request_hash
- request_path
- client_ip (hashed)
- count
- other metadata
[Web Servers] → [Load Balancers] → [Data Collectors]
↓
[Kafka] ← [Stream Processors] → [Redis] ← [Query Service] ← [API Gateway] ← [Clients]
↓ ↓
[HDFS/S3] ← [Batch Processors] → [TimescaleDB]
// Pseudocode for Flink stream processor
DataStream<RequestEvent> requests = environment
.addSource(kafkaConsumer)
.keyBy(RequestEvent::getRequestPath)
.window(SlidingProcessingTimeWindows.of(Time.minutes(5), Time.seconds(10)))
.aggregate(new CountAggregator())
.process(new TopKProcessor(100));
Machine learning integration:
Enhanced visualization capabilities:
Advanced analytics: