Yuclase Software Design
High-Performance Message Queue Architecture & Component Design
System Architecture Overview
High-Level Architecture
Loading diagram...
Core Component Architecture
Storage Engine Components
Append-Only Log
- • Sequential write optimization
- • Message format: [timestamp][size][data]
- • Atomic write operations
- • Configurable sync intervals
Segment Management
- • Log file segmentation
- • Configurable segment size
- • Automatic cleanup & retention
- • Efficient storage utilization
Index Engine
- • Optional message indexing
- • Fast random access
- • Configurable index intervals
- • Memory-efficient design
Queue Management
// Go Component Structure
type QueueManager struct {
topics map[string]*Topic
consumers map[string]*ConsumerCatalog
storage *StorageEngine
config *Config
mu sync.RWMutex
}
type Topic struct {
name string
log *AppendOnlyLog
index *IndexEngine
segments *SegmentManager
stats *TopicStats
}
type ConsumerCatalog struct {
offsets map[string]int64
lastSeen map[string]time.Time
mu sync.RWMutex
}
type StorageEngine struct {
dataDir string
segSize int64
syncInt time.Duration
retention time.Duration
}Network Protocol & Communication
RESP Protocol Implementation
Command Structure
- • Redis-like protocol (RESP)
- • Text-based command format
- • Simple request-response model
- • Error handling & status codes
Connection Management
- • TCP socket server
- • Concurrent client handling
- • Connection pooling
- • Graceful shutdown
Command Processing Flow
Loading diagram...
Storage Engine Design
Append-Only Log Architecture
Log File Format
- • 8-byte timestamp (Unix nanoseconds)
- • 4-byte message size (big-endian)
- • Variable-length message data
- • Sequential write optimization
Segmentation Strategy
- • Configurable segment size (1MB default)
- • Automatic segment rotation
- • Time-based retention policy
- • Efficient cleanup operations
Directory Structure & File Organization
// Storage Directory Structure
data/
└── topics/
└── <topic-name>/
├── 000000000000000000.log # Log segment files
├── 000000000000000001.log # (sequential numbering)
├── 000000000000000002.log
├── index.idx # Index file (optional)
└── consumers.json # Consumer offset catalog
// Message Format in Log Files
type LogEntry struct {
Timestamp int64 // 8 bytes - Unix nanoseconds
Size uint32 // 4 bytes - Message size
Data []byte // Variable - Message payload
}
// Consumer Catalog Format (JSON)
type ConsumerCatalog struct {
Consumers map[string]ConsumerInfo `json:"consumers"`
}
type ConsumerInfo struct {
Offset int64 `json:"offset"`
LastSeen time.Time `json:"last_seen"`
}Performance Optimizations & Design Patterns
Write Performance
Sequential Writes
- • Append-only log design
- • No random access writes
- • OS page cache optimization
- • Minimal disk seeks
Batching & Buffering
- • Configurable sync intervals
- • Write batching for throughput
- • Memory-mapped files
- • Async I/O operations
Concurrency Design
// Concurrency Patterns
type SafeQueue struct {
topics map[string]*Topic
mu sync.RWMutex // Reader-writer lock
}
// Lock-free read operations
func (q *SafeQueue) GetTopic(name string) *Topic {
q.mu.RLock()
defer q.mu.RUnlock()
return q.topics[name]
}
// Write operations with exclusive lock
func (q *SafeQueue) CreateTopic(name string) error {
q.mu.Lock()
defer q.mu.Unlock()
// Topic creation logic
}
// Per-topic locks for fine-grained concurrency
type Topic struct {
log *AppendOnlyLog
mu sync.Mutex // Per-topic synchronization
}
// Atomic operations for consumer offsets
type ConsumerCatalog struct {
offsets sync.Map // Concurrent map for offsets
}Client Architecture & SDK Design
Multi-Language Client Support
Go CLI Client
- • Interactive mode
- • Command-line interface
- • Connection management
- • Error handling
TypeScript Client
- • Promise-based API
- • Type definitions
- • Connection pooling
- • Async/await support
Protocol Abstraction
- • RESP protocol handling
- • Command serialization
- • Response parsing
- • Error code mapping
TypeScript Client Architecture
// TypeScript Client Design
interface YuclaseClient {
connect(): Promise<void>
disconnect(): Promise<void>
ping(message?: string): Promise<string>
createTopic(topic: string): Promise<void>
enqueue(topic: string, message: string): Promise<number>
listen(topic: string, consumerId: string): Promise<string[]>
getOffset(topic: string, consumerId: string): Promise<number>
setOffset(topic: string, consumerId: string, offset: number): Promise<void>
listTopics(): Promise<string[]>
getStats(topic?: string): Promise<QueueStats>
}
class SimpleYuclaseClient implements YuclaseClient {
private socket: net.Socket
private config: ClientConfig
private connected: boolean = false
constructor(config: ClientConfig) {
this.config = config
this.socket = new net.Socket()
}
async connect(): Promise<void> {
return new Promise((resolve, reject) => {
this.socket.connect(this.config.port, this.config.host, () => {
this.connected = true
resolve()
})
this.socket.on('error', reject)
})
}
}Configuration & Deployment Architecture
Configuration Management
// config.yaml structure server: host: "localhost" port: 8080 max_connections: 1000 read_timeout: "30s" write_timeout: "30s" storage: data_directory: "./data" log_segment_size: 1048576 # 1MB index_interval: 1000 sync_interval: "1s" retention_duration: "168h" # 7 days compression: false logging: level: "info" file: "./logs/yuclase.log" max_size: "100MB" max_backups: 5 max_age: 30 performance: buffer_size: 4096 worker_pool_size: 10 gc_interval: "5m"
Deployment Patterns
- Single Instance: Simple deployment for development and small workloads
- Docker Container: Containerized deployment with volume mounts for persistence
- Kubernetes: Scalable deployment with persistent volumes and service discovery
- Load Balanced: Multiple instances behind a load balancer for high availability