Stream Processor
High-performance, production-ready stream processing library for LLM Auto-Optimizer.
Features
- Windowing: Tumbling, Sliding, and Session windows
- Aggregations: Count, Sum, Average, Min, Max, Percentiles, Standard Deviation
- Time Semantics: Event-time processing with watermark support
- Late Events: Configurable handling for out-of-order events
- Performance: Sub-100ms latency, 100K+ events/sec throughput
- Statistics: Online variance, EMA, sliding window stats, anomaly detection
Quick Start
use ;
use Duration;
async
Window Types
Tumbling Windows
Fixed-size, non-overlapping windows for periodic aggregations:
let processor = new
.build_tumbling;
Sliding Windows
Overlapping windows for moving averages and smoothed metrics:
let processor = new
.build_sliding;
Session Windows
Gap-based windows for activity clustering:
let processor = new
.build_session;
Aggregations
Composite Aggregator
Run multiple aggregations efficiently:
let mut agg = new;
agg.add_count
.add_avg
.add_min
.add_max
.add_p50
.add_p95
.add_p99
.add_stddev;
Simple Aggregators
Use individual aggregators for specific metrics:
use ;
let avg = new;
let p95 = new;
let stddev = new;
Configuration
use StreamProcessorConfig;
use Duration;
let config = StreamProcessorConfig ;
let processor = new
.with_config
.build_tumbling;
Advanced Statistics
The library includes advanced statistical utilities:
Online Variance
Numerically stable variance calculation:
use OnlineVariance;
let mut variance = new;
for value in values
let std_dev = variance.std_dev;
Exponential Moving Average
Smoothed metrics over time:
use ExponentialMovingAverage;
let mut ema = with_span?;
ema.update;
let smoothed = ema.value;
Sliding Window Statistics
Fixed-size window with percentiles:
use SlidingWindowStats;
let mut stats = new?;
for value in values
let p95 = stats.percentile?;
let median = stats.median;
Anomaly Detection
Z-score based anomaly detection:
use ZScoreAnomalyDetector;
let mut detector = new; // 3-sigma threshold
let is_anomaly = detector.check;
Event Deduplication
Prevent duplicate events from being processed multiple times:
use ;
use Arc;
use Duration;
// Create Redis backend for deduplication
let redis_config = builder
.url
.key_prefix
.default_ttl
.build?;
let backend = new;
// Check for duplicates
let event_id = "event_123";
let key = format!;
if backend.get.await?.is_none else
Features
- Multiple Backends: Redis (distributed), Sled (local), In-memory
- Configurable TTL: Automatic cleanup of old deduplication records
- High Performance: 100K+ events/sec with Redis, 200K+ with Sled
- Bloom Filters: Probabilistic deduplication for ultra-high throughput
- Multi-Key Strategies: Event ID, transaction ID, idempotency keys, content hash
Configuration Options
// Basic configuration with in-memory backend
let backend = new;
// Production configuration with Redis
let redis_config = builder
.url
.key_prefix
.default_ttl // 24 hours
.pool_size // min 10, max 50 connections
.build?;
// High-performance local storage with Sled
let sled_backend = new?;
Use Cases
- Kafka Message Deduplication: Handle at-least-once delivery semantics
- API Idempotency: Prevent duplicate requests using idempotency keys
- Multi-Source Aggregation: Deduplicate events from multiple sources
- Retry Safety: Ensure safe retries without duplicate processing
- Exactly-Once Processing: Maintain exactly-once semantics across restarts
See deduplication/README.md for complete documentation.
Time-Series Normalization
Transform irregularly sampled time-series data into uniform intervals for analysis and processing:
use ;
use Duration;
// Configure normalization with 1-second intervals
let config = builder
.interval
.fill_strategy
.max_gap_duration
.out_of_order_threshold
.build?;
let mut normalizer = new;
// Process irregular events
normalizer.process_event.await?;
normalizer.process_event.await?;
// Get normalized time-series with uniform intervals
let normalized = normalizer.normalize.await?;
Visual Example
Original (irregular sampling):
t=0.0s: 10.0
t=0.3s: 12.0
t=1.7s: 18.0
t=4.9s: 35.0
Normalized (1-second intervals, linear interpolation):
t=0s: 10.0
t=1s: 14.4 (interpolated)
t=2s: 18.0
t=3s: 24.3 (interpolated)
t=4s: 30.7 (interpolated)
t=5s: 35.0
Fill Strategies
- Linear: Interpolate between known points (best for continuous metrics)
- Forward Fill: Carry last value forward (best for discrete states)
- Backward Fill: Carry next value backward (batch processing)
- Zero Fill: Fill with zero (best for event counts)
- Mean Fill: Fill with average (best for noisy data)
- Polynomial: Higher-order interpolation (scientific data)
- Spline: Smooth curves without oscillation (high-quality visualization)
Features
- Irregular Sampling: Handle variable-rate data collection
- Out-of-Order Events: Automatic buffering and reordering
- Gap Filling: Intelligent interpolation for missing data
- Timestamp Alignment: Floor, ceil, or round to intervals
- Resampling: Upsample or downsample to target frequencies
- Multi-Metric: Normalize multiple metrics with different strategies
- Outlier Detection: Z-score based anomaly filtering
- High Performance: 500K+ events/sec with linear interpolation
Configuration Options
let config = NormalizationConfig ;
Use Cases
- IoT Sensor Data: Normalize irregular sensor readings for analysis
- Financial Data: Align OHLC data to uniform intervals
- System Metrics: Standardize monitoring data from multiple sources
- ML Feature Engineering: Create uniform input for time-series models
- Visualization: Generate smooth, consistent time-series plots
- Aggregation Preparation: Align data before windowing operations
Performance Characteristics
| Strategy | Throughput | Latency (avg) | Use Case |
|---|---|---|---|
| Linear | 500K events/sec | 2.0 μs | Continuous metrics |
| Forward Fill | 800K events/sec | 1.25 μs | Discrete states |
| Zero Fill | 1M events/sec | 1.0 μs | Event counts |
| Spline | 50K events/sec | 20 μs | Visualization |
See normalization/README.md for complete documentation.
Examples
Run the examples to see the stream processor in action:
# Basic stream processor demo
# Multi-key sliding window
# Event deduplication
# Time-series normalization
# Other examples
Performance
Typical performance characteristics:
- Latency: 1-5ms processing time per event
- Throughput: 100,000+ events/sec (single key)
- Throughput: 1,000,000+ events/sec (multiple keys with parallelization)
- Memory: ~1KB per window + aggregation data
Monitoring
Get processor statistics:
let stats = processor.stats.await;
println!;
println!;
println!;
println!;
Architecture
See STREAM_PROCESSOR.md for detailed implementation documentation including:
- Architecture overview
- Implementation details
- Performance characteristics
- Tuning guidelines
- Best practices
Testing
# Run all tests
# Run with output
# Run benchmarks
Integration
The stream processor integrates with:
- Kafka: Source and sink for event streaming
- State Backends: Redis, PostgreSQL, Sled for state management
- Watermark Generators: For event-time progress tracking
- Pipeline Framework: For complex stream processing workflows
License
Apache-2.0
Contributing
See CONTRIBUTING.md for contribution guidelines.