- Dynamic miller column sizing with flexbox layout - Root column (160px), middle slices (48px), active column (flex) - Auto-scroll browser to rightmost column on navigation - Offline indicator UI and IndexedDB cache integration - /api/documents endpoint for client-side document caching - Breadcrumb navigation in document content area - FTS5 search with SQLite virtual table - Client-side Mermaid and KaTeX rendering via CDN - Deep sample content (advanced-topics/raft-deep-dive) - Border removal (only search button keeps radius) - Full viewport layout with proper borders between sidebar/content
1.1 KiB
1.1 KiB
Raft Performance Tuning
Optimizing Raft for high-throughput workloads.
Batch Processing
Batch multiple client requests into a single AppendEntries RPC:
// Example: batch size of 100 entries
batchSize := 100
for i := 0; i < len(requests); i += batchSize {
end := min(i+batchSize, len(requests))
batch := requests[i:end]
leader.AppendEntries(batch)
}
Pipeline Optimization
Allow the leader to pipeline log entries without waiting for each Ack:
- Set
max_inflight_entriesto 100-1000 - Use a sliding window for acknowledgments
- Retry only unacknowledged entries
Read Index Optimization
For read-heavy workloads, use read index instead of log replication:
- Client sends read request to leader
- Leader commits a heartbeat (no-op) entry
- Once committed, leader serves read from state machine
- Followers can serve stale reads directly
Benchmarks
Typical throughput on a 5-node cluster:
| Workload | Throughput | Latency (p99) |
|---|---|---|
| Writes only | 50K ops/sec | 5ms |
| Mixed (80/20) | 100K ops/sec | 3ms |
| Reads only | 500K ops/sec | 0.5ms |