Skip to content
/ Obelisk Public

Obelisk is a high-performance, fault-tolerant, distributed event log system designed to be the single source of truth for microservices, real-time systems, and event-driven architectures.

License

Notifications You must be signed in to change notification settings

mush1e/Obelisk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

92 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Obelisk

A high-performance, fault-tolerant message broker built in Go that serves as the single source of truth for microservices, real-time systems, and event-driven architectures. Obelisk combines the reliability of Kafka with the simplicity of Redis, delivering enterprise-grade messaging with minimal operational overhead.

πŸš€ Features

Core Messaging

  • Topic-based Architecture: Organize messages into logical topics with independent storage and indexing
  • Binary Protocol: Efficient binary serialization (~38 bytes vs 90 for JSON) for minimal network overhead
  • Dual Interface: TCP for high-performance message ingestion, HTTP for monitoring and administration
  • At-least-once Delivery: Guaranteed message delivery with crash recovery support

Performance & Reliability

  • Batched Disk I/O: Smart batching system (size + time triggers) minimizes disk operations
  • Memory-mapped Indexes: Fast message lookup using offset-to-position mapping
  • Ring Buffer Caching: In-memory buffers for recent messages enable sub-millisecond reads
  • Thread-safe Operations: Concurrent producers and consumers with proper mutex protection
  • File Pooling: Efficient file descriptor management with automatic cleanup

Operational Excellence

  • Zero Configuration: Works out of the box with sensible defaults
  • Graceful Shutdown: Clean resource cleanup with proper signal handling
  • Topic Auto-creation: Topics created automatically on first message
  • File-based Storage: Simple, debuggable storage format with no external dependencies
  • Comprehensive Health Monitoring: Kubernetes-ready health checks with component-level status
  • Prometheus Metrics: Built-in monitoring and observability

Advanced Features

  • Corruption Recovery: Intelligent data corruption detection and recovery
  • Retry Mechanisms: Configurable retry policies for transient failures
  • Error Categorization: Sophisticated error handling with proper error types
  • Connection Management: Active connection tracking and error handling

πŸ—οΈ Architecture

High-Level Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        TCP/Binary      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Producers  β”‚ ──────────────────────▢│  Obelisk Server β”‚
β”‚             β”‚                        β”‚                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                 β”‚
                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                              β–Ό                  β–Ό                   β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚  Ring Buffers   β”‚ β”‚  Batch Manager  β”‚ β”‚ Topic Storage   β”‚
                    β”‚   (Fast Reads)  β”‚ β”‚ (Efficient I/O) β”‚ β”‚ (Persistence)   β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                                     β”‚
                                                           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                                           β–Ό         β–Ό         β–Ό
                                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                                    β”‚      Per-Topic Storage       β”‚
                                                    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                                                    β”‚  β”‚ .log     β”‚β”‚    .idx     β”‚ β”‚
                                                    │  │(messages)││(offset→pos) │ │
                                                    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
                                                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                                    β”‚
                                                                    β–Ό
                                                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                                            β”‚   Consumers     β”‚
                                                            β”‚ (Poll/Commit)   β”‚
                                                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Message Flow Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                OBELISK SERVER                                       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                                     β”‚
β”‚  Producer Message ──▢ β”‚ TCP Handler β”‚ ──▢ β”‚ Ring Buffer β”‚                           β”‚
β”‚                                     β”‚                   β”‚                           β”‚
β”‚                                     └──▢ β”‚ Topic Batcher β”‚ ──▢ β”‚ Disk Storage β”‚     β”‚
β”‚                                                                β”‚                    β”‚
β”‚                                                                β”‚  topic-0.log       β”‚
β”‚                                                                β”‚  topic-0.idx       β”‚
β”‚                                                                β”‚  topic-1.log       β”‚
β”‚                                                                β”‚  topic-1.idx       β”‚
β”‚                                                                                     β”‚
β”‚                                                                                     β”‚
β”‚  Consumer Poll Request ──▢ β”‚ Storage Layer β”‚ ──▢ β”‚ Index Lookup β”‚ ──▢ Response      β”‚
β”‚                                            β”‚                                        β”‚
β”‚                                            └──▢  β”‚ File Seek & Read β”‚               β”‚
β”‚                                                                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Storage Layer Deep Dive

Topic: user-events
β”œβ”€β”€ user-events.log (Binary Messages)
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   β”‚ [Length][Timestamp][Topic][Key][Value] β”‚ ← Message 0
β”‚   β”‚ [Length][Timestamp][Topic][Key][Value] β”‚ ← Message 1  
β”‚   β”‚ [Length][Timestamp][Topic][Key][Value] β”‚ ← Message 2
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
└── user-events.idx (Offset Index)
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ [0] β†’ byte position 0               β”‚
    β”‚ [1] β†’ byte position 156             β”‚ 
    β”‚ [2] β†’ byte position 312             β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Consumer tracks: "I'm at offset 1" β†’ Index lookup β†’ Seek to byte 156 β†’ Read from there

πŸ› οΈ Installation & Setup

Prerequisites

  • Go 1.21 or higher
  • 500MB disk space (for logs and indexes)

Quick Start

# Clone the repository
git clone https://github.com/mush1e/obelisk.git
cd obelisk

# Install dependencies
go mod tidy

# Create data directories
mkdir -p data/topics

# Start the Obelisk server
go run cmd/Obelisk/main.go

Server starts on:

  • TCP Server: :8080 (message ingestion)
  • HTTP Server: :8081 (REST API, health checks, metrics)

πŸ“š Usage Examples

Producer (Sending Messages)

package main

import (
    "bufio"
    "net"
    "time"
    
    "github.com/mush1e/obelisk/internal/message"
    "github.com/mush1e/obelisk/pkg/protocol"
)

func main() {
    // Connect to Obelisk server
    conn, _ := net.Dial("tcp", "localhost:8080")
    defer conn.Close()
    
    writer := bufio.NewWriter(conn)
    
    // Create and send message
    msg := message.Message{
        Timestamp: time.Now(),
        Topic:     "user-events",
        Key:       "user123",
        Value:     "User logged in",
    }
    
    msgBytes, _ := message.Serialize(msg)
    protocol.WriteMessage(writer, msgBytes)
    
    // Read acknowledgment
    response := make([]byte, 3)
    conn.Read(response)
    // Response: "OK\n" for success, "NACK:reason" for failure
}

HTTP API Usage

Health Checks

# Overall system health
curl http://localhost:8081/health

# Kubernetes readiness probe
curl http://localhost:8081/health/ready

# Kubernetes liveness probe
curl http://localhost:8081/health/live

# Prometheus metrics
curl http://localhost:8081/metrics

Health Response Example

{
  "status": "healthy",
  "timestamp": "2024-01-15T10:30:00Z",
  "uptime": "2h15m30s",
  "components": {
    "buffer": {
      "status": "healthy",
      "details": {
        "success_rate": 0.98,
        "threshold": 0.95,
        "operation_count": 15420
      },
      "last_check": "2024-01-15T10:30:00Z"
    },
    "batcher": {
      "status": "healthy",
      "details": {
        "success_rate": 0.99,
        "last_flush": "2024-01-15T10:29:55Z",
        "threshold": 0.95,
        "operation_count": 15420
      },
      "last_check": "2024-01-15T10:30:00Z"
    }
  },
  "summary": {
    "total_components": 4,
    "healthy": 4,
    "degraded": 0,
    "unhealthy": 0
  }
}

Consumer (Reading Messages)

package main

import (
    "fmt"
    "github.com/mush1e/obelisk/internal/consumer"
)

func main() {
    // Create consumer for topic
    consumer := consumer.NewConsumer("data/topics", "user-events")
    
    for {
        // Poll for new messages
        messages, _ := consumer.Poll("user-events")
        
        if len(messages) > 0 {
            // Process messages
            for _, msg := range messages {
                fmt.Printf("Processing: %s -> %s\n", msg.Key, msg.Value)
            }
            
            // Commit progress (enables crash recovery)
            offset, _ := consumer.GetCurrentOffset("user-events")
            consumer.Commit("user-events", offset + uint64(len(messages)))
        }
        
        time.Sleep(1 * time.Second)
    }
}

πŸ§ͺ Testing & Examples

Built-in Test Clients

Producer Test Client:

# Send 150 messages quickly (tests batching)
go run cmd/test-client/main.go -test=size

# Send messages with delays (tests time-based flushing)  
go run cmd/test-client/main.go -test=time

# Realistic workload simulation
go run cmd/test-client/main.go -test=realistic

Consumer Test Client:

# Single poll (get messages once)
go run cmd/test-consumer/main.go -topic=topic-0 -mode=poll

# Continuous polling (keep checking for new messages)
go run cmd/test-consumer/main.go -topic=topic-1 -mode=continuous

# Reset and replay from beginning
go run cmd/test-consumer/main.go -topic=topic-2 -mode=reset

Read All Messages:

# Read all topics
go run cmd/test-reader/main.go

# Read specific directory
go run cmd/test-reader/main.go /path/to/topics

End-to-End Test Flow

# Terminal 1: Start server
go run cmd/Obelisk/main.go

# Terminal 2: Send test messages
go run cmd/test-client/main.go -test=realistic

# Terminal 3: Start consumer
go run cmd/test-consumer/main.go -topic=topic-1 -mode=continuous

# Terminal 2: Send more messages (watch consumer pick them up)
go run cmd/test-client/main.go -test=size

πŸ“Š Monitoring & Observability

Prometheus Metrics

The server exposes comprehensive metrics at /metrics:

  • Message Throughput: obelisk_messages_received_total, obelisk_messages_stored_total
  • Performance: obelisk_batch_size, obelisk_flush_duration_seconds
  • System Health: obelisk_health_status, obelisk_component_health
  • Connection Stats: obelisk_active_connections, obelisk_connections_total
  • Error Tracking: obelisk_connection_errors_total, obelisk_messages_failed_total

Health Monitoring

  • Liveness Probe (/health/live): Basic service availability
  • Readiness Probe (/health/ready): Service ready to accept traffic
  • Health Check (/health): Comprehensive system health status

Component Health Tracking

  • Buffer Health: Success rate and operation count
  • Batcher Health: Flush success rate and timing
  • Storage Health: File system accessibility
  • TCP Server Health: Connection status and listener health

🏒 Production Use Cases

Real-time Event Processing

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Web App       │───▢│  Obelisk    │───▢│  Analytics      β”‚
β”‚ (User Actions)  β”‚    β”‚ Topic:      β”‚    β”‚  Service        β”‚
β”‚                 β”‚    β”‚ "clicks"    β”‚    β”‚                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Microservices Coordination

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Order         │───▢│  Obelisk    │───▢│  Inventory      β”‚
β”‚   Service       β”‚    β”‚ Topic:      β”‚    β”‚  Service        β”‚
β”‚                 β”‚    β”‚ "orders"    β”‚    β”‚                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                      β””β”€β”€β”€β–Άβ”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                           β”‚  Payment        β”‚
                                           β”‚  Service        β”‚
                                           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

IoT Data Collection

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   1000s of      │───▢│  Obelisk    │───▢│  Time Series    β”‚
β”‚   Sensors       β”‚    β”‚ Topic:      β”‚    β”‚  Database       β”‚
β”‚                 β”‚    β”‚ "sensors"   β”‚    β”‚                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ—‚οΈ Project Structure

obelisk/
β”œβ”€β”€ cmd/
β”‚   β”œβ”€β”€ Obelisk/main.go         # Server entry point
β”‚   β”œβ”€β”€ test-client/main.go     # Producer test client
β”‚   β”œβ”€β”€ test-consumer/main.go   # Consumer test client
β”‚   └── test-reader/main.go     # Debug message reader
β”œβ”€β”€ internal/
β”‚   β”œβ”€β”€ batch/                  # Batched disk writes
β”‚   β”‚   └── batcher.go         # TopicBatcher with per-topic batching
β”‚   β”œβ”€β”€ buffer/                 # Ring buffer for fast reads
β”‚   β”‚   β”œβ”€β”€ buffer.go          # TopicBuffers + Buffer implementation
β”‚   β”‚   └── buffer_test.go     # Unit tests
β”‚   β”œβ”€β”€ consumer/               # Consumer API
β”‚   β”‚   └── consumer.go        # Poll/Commit/Reset functionality
β”‚   β”œβ”€β”€ errors/                 # Error handling and categorization
β”‚   β”‚   └── errors.go          # Error types and retry logic
β”‚   β”œβ”€β”€ handlers/               # HTTP request handlers
β”‚   β”‚   β”œβ”€β”€ health.go          # Health check endpoints
β”‚   β”‚   β”œβ”€β”€ messages.go        # Message REST API
β”‚   β”‚   β”œβ”€β”€ stats.go           # Statistics endpoints
β”‚   β”‚   └── middleware.go      # HTTP middleware
β”‚   β”œβ”€β”€ health/                 # Health tracking system
β”‚   β”‚   β”œβ”€β”€ tracker.go         # Health status tracking
β”‚   β”‚   └── ring.go            # Health history ring buffer
β”‚   β”œβ”€β”€ message/                # Message format
β”‚   β”‚   β”œβ”€β”€ message.go         # Binary serialization
β”‚   β”‚   └── message_test.go    # Serialization tests
β”‚   β”œβ”€β”€ metrics/                # Prometheus metrics
β”‚   β”‚   └── metrics.go         # Metric definitions
β”‚   β”œβ”€β”€ retry/                  # Retry mechanisms
β”‚   β”‚   └── retry.go           # Configurable retry policies
β”‚   β”œβ”€β”€ server/                 # Server infrastructure
β”‚   β”‚   β”œβ”€β”€ server.go          # Main server orchestration
β”‚   β”‚   β”œβ”€β”€ tcp_server.go      # TCP message handling
β”‚   β”‚   └── http_server.go     # HTTP REST API
β”‚   β”œβ”€β”€ services/               # Business logic services
β”‚   β”‚   └── broker_service.go  # Core broker functionality
β”‚   └── storage/                # Persistent storage
β”‚       β”œβ”€β”€ storage.go         # Main storage interface
β”‚       β”œβ”€β”€ filepool.go        # File descriptor pooling
β”‚       └── corruption_test.go # Corruption recovery tests
β”œβ”€β”€ pkg/
β”‚   └── protocol/              # Wire protocol
β”‚       └── protocol.go        # Length-prefixed binary protocol
β”œβ”€β”€ data/topics/               # Topic storage (created at runtime)
β”‚   β”œβ”€β”€ topic-0.log           # Message data
β”‚   β”œβ”€β”€ topic-0.idx           # Offset index
β”‚   β”œβ”€β”€ topic-1.log
β”‚   └── topic-1.idx
β”œβ”€β”€ go.mod
β”œβ”€β”€ LICENSE
└── README.md

πŸ›£οΈ Roadmap

Phase 2: Core Features (Current) βœ…

  • Topic-based messaging
  • Consumer offset tracking
  • Indexed storage for fast seeks
  • Batched disk I/O
  • Ring buffer caching
  • Binary protocol optimization
  • HTTP REST API
  • Comprehensive health monitoring
  • Prometheus metrics
  • Error categorization and retry logic
  • File pooling and corruption recovery

Phase 3: Enhanced APIs (Next)

  • gRPC support for high-performance clients
  • Consumer groups (multiple consumers sharing work)
  • Message retention policies
  • Topic compaction
  • Advanced filtering and routing

Phase 4: Distributed Systems (Future)

  • Multi-node clustering
  • Leader election and consensus
  • Cross-datacenter replication
  • Automatic partitioning
  • Load balancing

Phase 5: Enterprise Features (Future)

  • Authentication and authorization
  • TLS encryption
  • Schema registry
  • Dead letter queues
  • Message tracing
  • Backup and restore

🀝 Contributing

We welcome contributions! Here's how to get started:

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Make your changes with tests
  4. Run the test suite: go test ./...
  5. Commit your changes: git commit -m 'Add amazing feature'
  6. Push to the branch: git push origin feature/amazing-feature
  7. Open a Pull Request

Development Setup

# Install development dependencies
go mod tidy

# Run tests
go test ./...

# Run specific test suites
go test ./internal/storage -v
go test ./internal/buffer -v

# Start development server
go run cmd/Obelisk/main.go

πŸ“œ License

This project is licensed under the MIT License - see the LICENSE file for details.

πŸ™ Acknowledgments

  • Inspired by Apache Kafka's distributed log architecture
  • Binary protocol design influenced by Redis and MessagePack
  • Batching strategy adapted from RocksDB and LevelDB
  • Health monitoring patterns from Kubernetes and modern microservices

πŸ“ž Support


Obelisk: Standing tall as your distributed system's source of truth. πŸ—Ώ

About

Obelisk is a high-performance, fault-tolerant, distributed event log system designed to be the single source of truth for microservices, real-time systems, and event-driven architectures.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published