Skip to content

Latest commit

 

History

History
1152 lines (891 loc) · 35.6 KB

File metadata and controls

1152 lines (891 loc) · 35.6 KB

Bibliotheks-Wechselwirkungen und erweiterte Analyse

Version: 1.1
Datum: Dezember 2025
Autor: ThemisDB Development Team
Status: Extension zur EXTERNAL_LIBRARIES_FEATURES_ANALYSIS.md

Executive Summary

Diese erweiterte Analyse untersucht:

  1. Wechselwirkungen zwischen Bibliotheken und ThemisDB-Modulen
  2. Zusätzliche Bibliotheken, die Vorteile bringen könnten (Stand: Dezember 2025)
  3. Angepasste Implementierungsstrategien basierend auf Modul-Interdependenzen
  4. Neueste Entwicklungen aus dem Open-Source-Ökosystem

1. Bibliotheks-Wechselwirkungen: Kritische Analyse

1.1 RocksDB ↔ Andere Module

1.1.1 RocksDB + TBB (Parallele Compaction)

Aktuelle Situation:

// CMakeLists.txt
options_->max_background_jobs = config_.max_background_jobs;

Wechselwirkung:

  • RocksDB nutzt intern Threading für Background Jobs (Flush, Compaction)
  • TBB wird parallel für Query Processing genutzt
  • Konfliktpotenzial: CPU-Konkurrenz zwischen RocksDB Background Jobs und TBB Tasks

Optimierte Strategie:

// Koordinierte Thread-Allokation
size_t total_threads = std::thread::hardware_concurrency();
size_t rocksdb_threads = total_threads * 0.3; // 30% für RocksDB
size_t tbb_threads = total_threads * 0.6;     // 60% für TBB
size_t system_reserve = total_threads * 0.1;  // 10% Reserve

// RocksDB
options_->max_background_jobs = rocksdb_threads;

// TBB (neu mit v2021.11+)
tbb::global_control tbb_limit(
    tbb::global_control::max_allowed_parallelism, 
    tbb_threads
);

Implementierungsauswirkung:

  • Modul betroffen: src/storage/rocksdb_wrapper.cpp, src/query/query_engine.cpp
  • Neue Config-Option: thread_allocation_strategy in config/config.json
  • Testing: Benchmark mit variablen Thread-Verhältnissen

1.1.2 RocksDB + OpenTelemetry (Integrierte Metriken)

Wechselwirkung:

  • RocksDB Statistics → OpenTelemetry Metrics Export
  • Vermeidung von Duplikaten (RocksDB Stats vs. Custom Metrics)

Optimierte Strategie:

// Wrapper für RocksDB Stats → OpenTelemetry
class RocksDBMetricsExporter {
public:
    void exportToOtel() {
        auto stats = db_->GetOptions().statistics;
        
        // Read Metrics
        auto meter = otel::metrics::Provider::GetMeterProvider()->GetMeter("rocksdb");
        auto read_counter = meter->CreateUInt64Counter("rocksdb.read.count");
        read_counter->Add(stats->getTickerCount(rocksdb::NUMBER_KEYS_READ), 
                         {{"db", db_name_}});
        
        // Cache Hit Rate
        uint64_t cache_hits = stats->getTickerCount(rocksdb::BLOCK_CACHE_HIT);
        uint64_t cache_misses = stats->getTickerCount(rocksdb::BLOCK_CACHE_MISS);
        auto hit_rate_gauge = meter->CreateDoubleGauge("rocksdb.cache.hit_rate");
        hit_rate_gauge->Set(
            static_cast<double>(cache_hits) / (cache_hits + cache_misses),
            {{"db", db_name_}}
        );
    }
};

Implementierungsauswirkung:

  • Neues Modul: src/observability/rocksdb_metrics_bridge.cpp
  • Integration: src/storage/rocksdb_wrapper.cpp ruft Bridge periodisch auf
  • Abhängigkeit: Erfordert OpenTelemetry Metrics API (siehe Abschnitt 6)

1.1.3 RocksDB + Arrow (Zero-Copy Export)

Wechselwirkung:

  • RocksDB Iterator → Arrow RecordBatch (ohne Memcpy)
  • Nutzung von RocksDB's PinnableSlice für Zero-Copy

Optimierte Strategie:

#include <arrow/api.h>
#include <arrow/io/memory.h>

arrow::Status ExportToArrow(rocksdb::Iterator* it) {
    arrow::MemoryPool* pool = arrow::default_memory_pool();
    arrow::StringBuilder key_builder(pool);
    arrow::BinaryBuilder value_builder(pool);
    
    for (it->SeekToFirst(); it->Valid(); it->Next()) {
        // Zero-Copy via PinnableSlice
        rocksdb::PinnableSlice key_slice, value_slice;
        db_->Get(read_options, cf_handle, it->key(), &value_slice);
        
        ARROW_RETURN_NOT_OK(key_builder.Append(it->key().ToString()));
        // Arrow verwaltet Memory, RocksDB Pin bleibt gültig
        ARROW_RETURN_NOT_OK(value_builder.Append(
            reinterpret_cast<const uint8_t*>(value_slice.data()),
            value_slice.size()
        ));
    }
    
    std::shared_ptr<arrow::Array> keys, values;
    ARROW_RETURN_NOT_OK(key_builder.Finish(&keys));
    ARROW_RETURN_NOT_OK(value_builder.Finish(&values));
    
    auto schema = arrow::schema({
        arrow::field("key", arrow::utf8()),
        arrow::field("value", arrow::binary())
    });
    
    return arrow::Table::Make(schema, {keys, values});
}

Implementierungsauswirkung:

  • Module betroffen: src/analytics/olap.cpp, src/exporters/ (neuer Arrow-Exporter)
  • Performance-Gewinn: 2-3x bei großen Exports (keine Memcpy)

1.2 TBB ↔ Andere Module

1.2.1 TBB + CUDA (CPU-GPU Task Orchestration)

Wechselwirkung:

  • TBB Flow Graph für CPU-Vorverarbeitung
  • CUDA Kernels für GPU-intensive Tasks
  • Vermeidung von CPU-GPU Synchronisations-Overhead

Optimierte Strategie:

#include <tbb/flow_graph.h>
#include <cuda_runtime.h>

// Flow Graph mit CPU+GPU Nodes
tbb::flow::graph g;

// CPU Node: Batch Vorbereitung
tbb::flow::function_node<Query, CudaBatch> cpu_prep(g, tbb::flow::unlimited,
    [](Query q) -> CudaBatch {
        // CPU: Parse, Filter, Batching
        return prepareBatchForGPU(q);
    }
);

// GPU Node: CUDA Kernel Execution
tbb::flow::function_node<CudaBatch, Result> gpu_exec(g, 1, // Serialisiert für GPU
    [stream = cudaStream_t()](CudaBatch batch) -> Result {
        // Async CUDA Kernel Launch
        cudaMemcpyAsync(d_input, batch.data(), size, cudaMemcpyHostToDevice, stream);
        vector_kernel<<<grid, block, 0, stream>>>(d_input, d_output);
        cudaMemcpyAsync(h_output, d_output, size, cudaMemcpyDeviceToHost, stream);
        cudaStreamSynchronize(stream);
        return Result(h_output);
    }
);

// CPU Node: Postprocessing
tbb::flow::function_node<Result, Response> cpu_post(g, tbb::flow::unlimited,
    [](Result r) -> Response {
        return formatResponse(r);
    }
);

tbb::flow::make_edge(cpu_prep, gpu_exec);
tbb::flow::make_edge(gpu_exec, cpu_post);

Implementierungsauswirkung:

  • Module betroffen: src/acceleration/cuda_backend.cpp, src/index/vector_index.cpp
  • Neue Abstraktion: src/acceleration/hybrid_pipeline.hpp (CPU+GPU Flow Graph)
  • Performance: Versteckung der CPU-GPU Latenz durch Pipelining

1.2.2 TBB + OpenTelemetry (Parallele Trace Spans)

Wechselwirkung:

  • TBB parallel_for → Parallele Trace Spans
  • Context Propagation über TBB Tasks

Optimierte Strategie:

#include <tbb/parallel_for.h>
#include <opentelemetry/trace/provider.h>

void processQueriesWithTracing(std::vector<Query>& queries) {
    auto tracer = otel::trace::Provider::GetTracerProvider()->GetTracer("query-engine");
    
    tbb::parallel_for(
        tbb::blocked_range<size_t>(0, queries.size()),
        [&](const tbb::blocked_range<size_t>& r) {
            for (size_t i = r.begin(); i != r.end(); ++i) {
                // Jeder Thread erzeugt eigenen Span
                auto span = tracer->StartSpan("process_query_" + std::to_string(i));
                auto scope = tracer->WithActiveSpan(span);
                
                processQuery(queries[i]);
                
                span->SetAttribute("query.id", i);
                span->End();
            }
        }
    );
}

Implementierungsauswirkung:

  • Module betroffen: src/query/query_engine.cpp, src/utils/tracing.cpp
  • Herausforderung: Thread-local Span Storage (TBB hat keine Task-IDs)
  • Lösung: thread_local Span Stack

1.3 Apache Arrow ↔ Andere Module

1.3.1 Arrow + RocksDB (Columnar Storage Layer)

Wechselwirkung:

  • Arrow Columnar Format für OLAP
  • RocksDB Row-based Storage für OLTP
  • Dual-Format Strategy: Hot Data in RocksDB, Cold Data in Parquet

Optimierte Strategie:

// Tiered Storage: RocksDB (Hot) + Parquet (Cold)
class TieredStorage {
public:
    // Hot Path: RocksDB
    void putHot(const std::string& key, const std::string& value) {
        rocksdb_->Put(write_options_, key, value);
        hot_keys_.insert(key);
    }
    
    // Cold Path: Arrow Parquet
    void archiveToCold() {
        arrow::MemoryPool* pool = arrow::default_memory_pool();
        arrow::StringBuilder key_builder(pool);
        arrow::BinaryBuilder value_builder(pool);
        
        for (const auto& key : hot_keys_) {
            std::string value;
            rocksdb_->Get(read_options_, key, &value);
            
            key_builder.Append(key);
            value_builder.Append(value);
            
            // Delete from Hot Storage
            rocksdb_->Delete(write_options_, key);
        }
        
        std::shared_ptr<arrow::Array> keys, values;
        key_builder.Finish(&keys);
        value_builder.Finish(&values);
        
        auto table = arrow::Table::Make(
            arrow::schema({
                arrow::field("key", arrow::utf8()),
                arrow::field("value", arrow::binary())
            }),
            {keys, values}
        );
        
        // Write Parquet
        parquet::arrow::WriteTable(*table, pool, output_stream, chunk_size);
        
        hot_keys_.clear();
    }
};

Implementierungsauswirkung:

  • Neues Modul: src/storage/tiered_storage.cpp
  • Config: hot_data_ttl_seconds, cold_archive_threshold_mb
  • Use Case: OLAP Queries auf historischen Daten (99% Kompression möglich)

1.3.2 Arrow + TBB (Parallel Parquet Reading)

Wechselwirkung:

  • Parquet Row Groups → TBB parallel_for
  • Arrow Compute Kernels mit TBB Backend

Optimierte Strategie:

#include <parquet/arrow/reader.h>
#include <tbb/parallel_for.h>

arrow::Status ReadParquetParallel(const std::string& path) {
    std::shared_ptr<arrow::io::ReadableFile> infile;
    ARROW_ASSIGN_OR_RAISE(infile, arrow::io::ReadableFile::Open(path));
    
    std::unique_ptr<parquet::arrow::FileReader> reader;
    PARQUET_THROW_NOT_OK(
        parquet::arrow::OpenFile(infile, arrow::default_memory_pool(), &reader)
    );
    
    int num_row_groups = reader->num_row_groups();
    std::vector<std::shared_ptr<arrow::Table>> tables(num_row_groups);
    
    // Paralleles Lesen aller Row Groups
    tbb::parallel_for(0, num_row_groups, [&](int i) {
        reader->RowGroup(i)->ReadTable(&tables[i]);
    });
    
    // Concatenate Tables
    std::shared_ptr<arrow::Table> full_table;
    ARROW_ASSIGN_OR_RAISE(full_table, arrow::ConcatenateTables(tables));
    
    return arrow::Status::OK();
}

Implementierungsauswirkung:

  • Module betroffen: src/analytics/olap.cpp, src/exporters/
  • Performance: 4-8x Speedup bei großen Parquet-Dateien

2. Zusätzliche Bibliotheken (Dezember 2025)

2.1 DuckDB (Embedded OLAP Engine)

Status: ❌ Nicht genutzt
Priorität: 🔥🔥 Sehr Hoch
Aktuelle Version: v1.1.3 (Dezember 2025)

Warum DuckDB?

  • OLAP-native: 100x schneller als RocksDB für Analytical Queries
  • Arrow Integration: Native Arrow IPC Support
  • Parquet Native: Direkte Parquet-Abfragen ohne Load
  • Embedded: Keine separate Server-Infrastruktur

Wechselwirkung mit ThemisDB:

// Hybrid Storage: RocksDB (OLTP) + DuckDB (OLAP)
#include <duckdb.hpp>

class HybridQueryEngine {
private:
    std::unique_ptr<rocksdb::TransactionDB> rocksdb_; // OLTP
    std::unique_ptr<duckdb::DuckDB> duckdb_;          // OLAP
    
public:
    // OLTP Query → RocksDB
    Result executeOLTP(const std::string& query) {
        // Point Lookups, Transactions
        return rocksdb_->Get(...);
    }
    
    // OLAP Query → DuckDB
    Result executeOLAP(const std::string& sql) {
        duckdb::Connection con(*duckdb_);
        
        // DuckDB kann direkt auf Parquet zugreifen
        auto result = con.Query("SELECT * FROM read_parquet('data/*.parquet')");
        return convertToDuckDBResult(result);
    }
    
    // Hybrid Query: Join RocksDB + DuckDB
    Result executeHybrid(const std::string& query) {
        // 1. Export RocksDB Hot Data zu Arrow
        auto arrow_table = exportRocksDBToArrow();
        
        // 2. Register Arrow Table in DuckDB
        duckdb::Connection con(*duckdb_);
        con.RegisterArrowTable("hot_data", arrow_table);
        
        // 3. Join Hot + Cold Data
        auto result = con.Query(R"(
            SELECT h.*, c.* 
            FROM hot_data h 
            JOIN read_parquet('cold/*.parquet') c 
            ON h.id = c.id
        )");
        
        return result;
    }
};

Implementierungsauswirkung:

  • Neue Abhängigkeit: find_package(DuckDB CONFIG REQUIRED) in CMakeLists.txt
  • Neues Modul: src/analytics/duckdb_engine.cpp
  • Ersetzt: Teile von src/analytics/olap.cpp (GROUP BY, Window Functions)
  • Performance: 10-100x bei OLAP Queries
  • ROI: 🔥🔥 Extrem hoch (4 Wochen Implementierung → 100x OLAP Speedup)

Migration Strategy:

Phase 1 (2 Wochen): DuckDB Integration + Parquet Export
Phase 2 (1 Woche):  Arrow Bridge (RocksDB → DuckDB)
Phase 3 (1 Woche):  SQL Planner (AQL → DuckDB SQL Translation)

2.2 Abseil (Google's C++ Library)

Status: ❌ Nicht genutzt
Priorität: 🟡 Mittel
Aktuelle Version: LTS 20240722.0

Warum Abseil?

  • Swiss Tables: 2x schneller als std::unordered_map
  • absl::flat_hash_map: Cache-friendly Hash Map
  • absl::Cord: Effiziente String-Handling für große Strings
  • absl::Time: Bessere Time-Handling als std::chrono

Wechselwirkung mit TBB:

// Abseil flat_hash_map ist thread-safe für Reads
#include <absl/container/flat_hash_map.h>
#include <tbb/spin_mutex.h>

class FastCache {
private:
    absl::flat_hash_map<std::string, CachedValue> cache_;
    tbb::spin_mutex mutex_;
    
public:
    // Read-heavy Workload: Lock-free Reads
    std::optional<CachedValue> get(const std::string& key) const {
        auto it = cache_.find(key); // Lock-free Read
        if (it != cache_.end()) {
            return it->second;
        }
        return std::nullopt;
    }
    
    // Writes: Kurze Lock-Zeit
    void put(const std::string& key, const CachedValue& value) {
        tbb::spin_mutex::scoped_lock lock(mutex_);
        cache_[key] = value;
    }
};

Implementierungsauswirkung:

  • Module betroffen: src/cache/semantic_cache.cpp, src/index/secondary_index.cpp
  • Performance: 2-3x bei Hash-intensive Workloads
  • ROI: 🟡 Mittel (2 Wochen Refactoring → 2x Cache Throughput)

2.3 mimalloc (Microsoft Memory Allocator)

Status: ❌ Nicht genutzt
Priorität: 🔥 Hoch
Aktuelle Version: v2.1.7

Warum mimalloc?

  • Performance: 2x schneller als malloc bei Multi-Threading
  • Security: Hardened gegen Heap Exploits
  • Drop-in Replacement: Einfacher Austausch

Wechselwirkung mit RocksDB + TBB:

// CMakeLists.txt
find_package(mimalloc CONFIG REQUIRED)
target_link_libraries(themis_core PRIVATE mimalloc-static)

// Optional: Global Override
#include <mimalloc-override.h>

Implementierungsauswirkung:

  • Kein Code-Change: Drop-in Replacement
  • Performance: 20-40% bei Memory-intensive Workloads (RocksDB, TBB)
  • ROI: 🔥 Sehr hoch (1 Tag Integration → 20-40% Speedup)

2.4 jemalloc (Alternative zu mimalloc)

Status: ❌ Nicht genutzt
Priorität: 🟡 Mittel
Aktuelle Version: v5.3.0

Vergleich mimalloc vs. jemalloc:

Feature mimalloc jemalloc
Multi-Threading ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
Fragmentierung ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Security ⭐⭐⭐⭐⭐ ⭐⭐⭐
RocksDB Support ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ (empfohlen)

Empfehlung: mimalloc für Multi-Threading, jemalloc für RocksDB-Heavy Workloads


2.5 Folly (Facebook C++ Library)

Status: ❌ Nicht genutzt
Priorität: 🟢 Niedrig (Overlap mit Abseil)
Aktuelle Version: v2024.12.09.00

Relevante Komponenten:

  • folly::F14: Hash Maps (ähnlich Abseil Swiss Tables)
  • folly::FunctionScheduler: Task Scheduling
  • folly::futures: Async/Await für C++

Empfehlung: Nur wenn Facebook-Ecosystem genutzt wird (z.B. mit Proxygen, Thrift)


2.6 RE2 (Google's Regular Expression Engine)

Status: ❌ Nicht genutzt (stattdessen: std::regex)
Priorität: 🔥 Hoch
Aktuelle Version: 2024-12-01

Warum RE2?

  • Performance: 10-100x schneller als std::regex
  • Security: Garantierte lineare Zeit (kein ReDoS)
  • Relevanz für ThemisDB: PII Detection, Text Processing

Wechselwirkung mit ThemisDB:

// src/utils/pii_detector.cpp - Aktuell: std::regex
#include <re2/re2.h>

bool detectEmailPattern(const std::string& text) {
    // RE2 ist thread-safe und kann wiederverwendet werden
    static const RE2 email_pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})");
    
    // 10-100x schneller als std::regex
    return RE2::PartialMatch(text, email_pattern);
}

Implementierungsauswirkung:

  • Module betroffen: src/utils/pii_detector.cpp, src/utils/regex_detection_engine.cpp
  • Performance: 10-100x bei Regex-Heavy Workloads
  • Security: Verhindert ReDoS-Angriffe
  • ROI: 🔥 Hoch (1 Woche Refactoring → 10-100x + Security)

2.7 libcuckoo (Concurrent Hash Table)

Status: ❌ Nicht genutzt
Priorität: 🟡 Mittel (Alternative zu TBB concurrent_hash_map)
Aktuelle Version: v0.3.1

Warum libcuckoo?

  • Performance: 2-4x schneller als TBB concurrent_hash_map
  • Lock-free Reads: Optimal für Read-Heavy Workloads
  • Use Case: Semantic Cache, Index Metadata

Vergleich:

Feature TBB concurrent_hash_map libcuckoo
Read Throughput ⭐⭐⭐ ⭐⭐⭐⭐⭐
Write Throughput ⭐⭐⭐⭐ ⭐⭐⭐⭐
Memory Overhead ⭐⭐⭐⭐ ⭐⭐⭐
API Simplicity ⭐⭐⭐⭐⭐ ⭐⭐⭐

Empfehlung: Für semantic_cache.cpp (90% Reads, 10% Writes)


2.8 libuv (Async I/O Library)

Status: ❌ Nicht genutzt (aktuell: Boost.Asio)
Priorität: 🟢 Niedrig (Boost.Asio ausreichend)
Aktuelle Version: v1.49.0

Vergleich Boost.Asio vs. libuv:

Feature Boost.Asio libuv
HTTP Server ⭐⭐⭐⭐⭐ (Beast) ⭐⭐⭐
Async I/O ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Cross-Platform ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Learning Curve ⭐⭐⭐ ⭐⭐⭐⭐

Empfehlung: Boost.Asio beibehalten (bereits integriert, ausreichend performant)


2.9 RapidJSON (Alternative zu nlohmann::json)

Status: ❌ Nicht genutzt
Priorität: 🟡 Mittel
Aktuelle Version: v1.1.0

Vergleich:

Feature nlohmann::json RapidJSON simdjson
Parsing Speed ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
API Simplicity ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐
Schema Validation

Empfehlung: simdjson beibehalten (bereits integriert, beste Performance)


2.10 LMDB (Lightning Memory-Mapped Database)

Status: ❌ Nicht genutzt
Priorität: 🟡 Mittel (Alternative zu RocksDB für Read-Heavy Workloads)
Aktuelle Version: LMDB 0.9.32

Warum LMDB?

  • Zero-Copy Reads: Memory-mapped, keine Memcpy
  • Performance: 10x schneller als RocksDB für Read-Heavy Workloads
  • Use Case: Read-only Index Metadata, Configuration Store

Vergleich RocksDB vs. LMDB:

Feature RocksDB LMDB
Write Throughput ⭐⭐⭐⭐⭐ ⭐⭐⭐
Read Throughput ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Transactions ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
Compression

Empfehlung: Hybrid Strategy - RocksDB (Write-Heavy), LMDB (Read-Heavy Metadata)


3. Angepasste Implementierungsstrategien

3.1 Phasen-basierte Integration (Risikominimierung)

Phase 1: Quick Wins (Q1 2026, 4-6 Wochen)

  1. mimalloc Integration (1 Tag) - Drop-in, sofortiger Gewinn
  2. RE2 Integration (1 Woche) - PII Detection Performance + Security
  3. RocksDB TTL (2 Wochen) - Time Series Auto-Cleanup
  4. OpenTelemetry Metrics (2 Wochen) - Observability

Risiko: Minimal (keine Breaking Changes)
ROI: 🔥🔥 Sehr hoch


Phase 2: Strukturelle Optimierungen (Q2 2026, 8-10 Wochen)

  1. DuckDB Integration (4 Wochen) - OLAP Engine
  2. TBB Flow Graph (3 Wochen) - Query Pipeline
  3. Arrow Parquet Export (2 Wochen) - Data Lake Integration
  4. Abseil Swiss Tables (2 Wochen) - Cache Performance

Risiko: Mittel (Architektur-Änderungen)
ROI: 🔥🔥 Sehr hoch (10-100x OLAP, 2-3x Cache)


Phase 3: Advanced Features (Q3-Q4 2026, 10-12 Wochen)

  1. CUDA Streams (2 Wochen) - GPU Throughput
  2. Arrow Compute Kernels (3 Wochen) - SIMD Aggregations
  3. RocksDB + Arrow Zero-Copy (2 Wochen) - Export Performance
  4. TBB + CUDA Hybrid Pipeline (3 Wochen) - CPU-GPU Orchestration
  5. LMDB für Metadata (2 Wochen) - Read-optimized Storage

Risiko: Hoch (Komplexe Wechselwirkungen)
ROI: 🔥 Hoch


3.2 Modularisierungsplan (Testbarkeit)

Problem: Monolithische Integration erhöht Risiko

Lösung: Plugin-Architektur

// src/plugins/storage_backend.hpp
class IStorageBackend {
public:
    virtual ~IStorageBackend() = default;
    virtual void put(const std::string& key, const std::string& value) = 0;
    virtual std::optional<std::string> get(const std::string& key) = 0;
};

// RocksDB Backend (Default)
class RocksDBBackend : public IStorageBackend { /* ... */ };

// LMDB Backend (Read-optimized)
class LMDBBackend : public IStorageBackend { /* ... */ };

// DuckDB Backend (OLAP)
class DuckDBBackend : public IStorageBackend { /* ... */ };

// Factory Pattern
std::unique_ptr<IStorageBackend> createBackend(const std::string& type) {
    if (type == "rocksdb") return std::make_unique<RocksDBBackend>();
    if (type == "lmdb") return std::make_unique<LMDBBackend>();
    if (type == "duckdb") return std::make_unique<DuckDBBackend>();
    throw std::runtime_error("Unknown backend type");
}

Vorteile:

  • A/B Testing (RocksDB vs. LMDB)
  • Inkrementelle Migration
  • Rollback-Fähigkeit

3.3 Dependency-Management-Strategie

Problem: Komplexe Dependency-Kette (21+ Libraries)

Lösung 1: vcpkg Baseline Pinning

// vcpkg.json
{
  "builtin-baseline": "2024-12-14",
  "dependencies": [
    { "name": "rocksdb", "version>=": "9.7.3" },
    { "name": "duckdb", "version>=": "1.1.3" },
    { "name": "mimalloc", "version>=": "2.1.7" },
    { "name": "re2", "version>=": "2024-12-01" }
  ]
}

Lösung 2: Feature Flags für neue Libraries

# CMakeLists.txt
option(THEMIS_USE_DUCKDB "Use DuckDB for OLAP" OFF)
option(THEMIS_USE_MIMALLOC "Use mimalloc allocator" OFF)
option(THEMIS_USE_RE2 "Use RE2 instead of std::regex" OFF)

if(THEMIS_USE_DUCKDB)
    find_package(DuckDB CONFIG REQUIRED)
    target_compile_definitions(themis_core PRIVATE THEMIS_HAS_DUCKDB)
endif()

Vorteile:

  • Graduelle Adoption
  • Keine Breaking Changes
  • Backward Compatibility

4. Performance-Modellierung: Gesamtsystem

4.1 Simulierte Workload-Analyse

Annahme: Typische Multi-Model DB Workload

  • 60% OLTP (RocksDB)
  • 30% OLAP (Arrow/DuckDB)
  • 10% Vector Search (CUDA/HNSW)

Baseline Performance (aktuell):

OLTP:   10,000 QPS (RocksDB Point Lookups)
OLAP:   100 QPS (Custom Aggregation)
Vector: 500 QPS (HNSW Search)

Projected Performance (nach Integration):

Komponente Optimierung Before After Speedup
OLTP (RocksDB) mimalloc + TTL 10k QPS 14k QPS 1.4x
OLAP (DuckDB) Native Engine 100 QPS 10k QPS 100x
Vector (CUDA) Streams + cuBLAS 500 QPS 2k QPS 4x
Regex (RE2) PII Detection 1k QPS 50k QPS 50x
Cache (Abseil) Swiss Tables 50k QPS 150k QPS 3x

Gesamtsystem (gewichtet):

  • OLTP: 60% × 1.4x = 0.84x Beitrag
  • OLAP: 30% × 100x = 30x Beitrag
  • Vector: 10% × 4x = 0.4x Beitrag
  • Gesamt: ~5-10x System-wide Throughput

4.2 Resource-Profiling

CPU-Allokation (64-Core System):

RocksDB Background:  20 Threads (30%)
TBB Query Engine:    40 Threads (60%)
CUDA GPU Tasks:      4 Streams (Async)
System Reserve:      4 Threads (10%)

Memory-Profiling:

RocksDB Block Cache:  8 GB
TBB Task Queue:       2 GB
Arrow RecordBatch:    4 GB
DuckDB Query Cache:   2 GB
System Reserve:       2 GB
Total:                18 GB (64 GB System)

5. Risikobewertung: Erweiterte Matrix

Risiko Wahrscheinlichkeit Impact Mitigation
Dependency-Konflikt (DuckDB vs. Arrow) Mittel Hoch Feature Flags, separate Builds
Thread-Kontention (RocksDB vs. TBB) Hoch Mittel Thread-Pool Koordination
Memory-Overhead (5+ neue Libs) Mittel Mittel Profiling, Lazy Loading
API-Breaking Changes (Abseil/Folly) Niedrig Hoch Version Pinning (vcpkg)
Performance-Regression (mimalloc) Niedrig Niedrig Benchmarks, A/B Testing
Security (neue Attack Surface) Mittel Hoch Fuzzing, CodeQL, OSS-Fuzz

6. Priorisierung: Must-Have bis Nice-to-Have

6.1 TIER 1: Must-Have (Essenziell für Production)

Kritische Features für Produktions-Readiness und Stabilität

Rang Library/Feature Kategorie ROI Effort Begründung
1 mimalloc Drop-in Performance 20-40% Speedup 1 Tag Drop-in Replacement, sofortiger Gewinn, kein Risiko
2 OpenTelemetry Metrics Observability Critical 2 Wochen Production ohne Metrics nicht betreibbar
3 RocksDB TTL Operations Critical 2 Wochen Verhindert Disk-Full in Production
4 RE2 Regex Engine Security 10-100x + Security 1 Woche Verhindert ReDoS-Angriffe (CVE-Risiko)
5 RocksDB Incremental Backup Disaster Recovery Critical 2 Wochen DSGVO/ISO27001 Requirement

Total Effort: 7-8 Wochen
Impact: Produktions-fähig, sicher, wartbar


6.2 TIER 2: Should-Have (Hohe Business-Priorität)

Features für Wettbewerbsfähigkeit und Performance

Rang Library/Feature Kategorie ROI Effort Begründung
6 DuckDB Integration OLAP 🔥🔥🔥 100x 4 Wochen Killer-Feature für Analytics Use Cases
7 TBB Flow Graph Performance 🔥 2-3x Query 3 Wochen Query Throughput kritisch für SLA
8 Arrow Parquet Export Integration 🔥 Data Lake 2 Wochen Ecosystem-Integration (Spark, Snowflake)
9 RocksDB + OpenTelemetry Bridge Observability 🔥 Debugging 1 Woche Essentiell für Root-Cause-Analysis
10 TBB + CUDA Coordination GPU 🔥 Resource Mgmt 2 Wochen Verhindert CPU-GPU Thrashing

Total Effort: 12 Wochen
Impact: Wettbewerbsfähige Performance, Ecosystem-Integration


6.3 TIER 3: Could-Have (Wichtige Optimierungen)

Features für Performance-Optimierung und Developer Experience

Rang Library/Feature Kategorie ROI Effort Begründung
11 Abseil Swiss Tables Performance 🟡 2x Cache 2 Wochen Significant aber nicht kritisch
12 RocksDB Merge Operators Performance 🟡 Atomic Ops 1 Woche Vereinfacht Counter-Implementierung
13 Arrow Compute Kernels OLAP 🔥 5-10x 3 Wochen Nur relevant wenn OLAP-Heavy
14 RocksDB + Arrow Zero-Copy Performance 🟡 2-3x Export 2 Wochen Nur bei Large Exports relevant
15 TBB Concurrent Containers Performance 🟡 Scalability 2 Wochen Alternative zu Locks

Total Effort: 10 Wochen
Impact: Performance-Verbesserungen, Code-Qualität


6.4 TIER 4: Nice-to-Have (Enterprise Features)

Features für Enterprise-Edition und spezielle Use Cases

Rang Library/Feature Kategorie ROI Effort Begründung
16 CUDA Streams GPU 🟡 2x GPU 2 Wochen Nur für GPU-intensive Deployments
17 cuBLAS Integration AI/ML 🟡 GNN Performance 2 Wochen Nur für GNN/ML Features
18 LMDB Metadata Store Performance 🟡 10x Read 2 Wochen Micro-Optimization
19 Arrow Flight RPC Sharding 🟢 High-Perf RPC 4 Wochen Nur für Multi-Shard Deployments
20 libcuckoo Hash Map Performance 🟢 2-4x 2 Wochen Alternative zu TBB (Niche)

Total Effort: 12 Wochen
Impact: Spezielle Use Cases, Enterprise-Differenzierung


6.5 TIER 5: Won't-Have (Nicht empfohlen)

Features mit negativem ROI oder hohem Risiko

Library/Feature Kategorie Begründung
Folly (Facebook C++) Utility Overlap mit Abseil, Facebook-Dependency
libuv Async I/O Boost.Asio ausreichend, Migration zu teuer
RapidJSON JSON simdjson bereits integriert, beste Performance
jemalloc Memory mimalloc besser für Multi-Threading
Thrust Library CUDA CUDA Streams + cuBLAS ausreichend

6.6 Priorisierte Roadmap nach Business-Value

Phase 1: Must-Have - Production Readiness (Q1 2026, 6-7 Wochen)

Woche 1:   mimalloc Integration (1 Tag)
           RE2 Integration Start (6 Tage)
Woche 2:   RE2 Fertigstellung + Testing
           RocksDB TTL Start
Woche 3-4: RocksDB TTL + Incremental Backup
Woche 5-6: OpenTelemetry Metrics API
Woche 7:   Testing, Documentation, Rollout

Deliverables:

  • ✅ Produktions-fähige Observability
  • ✅ Automatische Retention (TTL)
  • ✅ Disaster Recovery (Backups)
  • ✅ Security (ReDoS Prevention)
  • ✅ 20-40% Performance Boost (mimalloc)

Erfolgsmetriken:

  • Zero ReDoS vulnerabilities
  • < 5 min Backup/Restore Time
  • 100% Metrics Coverage
  • 20%+ Memory Throughput

Phase 2: Should-Have - Competitive Advantage (Q2 2026, 12 Wochen)

Woche 1-4: DuckDB Integration
           - Week 1: Setup + Basic Queries
           - Week 2: Arrow Bridge
           - Week 3: AQL → SQL Translation
           - Week 4: Testing + Benchmarks
           
Woche 5-7: TBB Flow Graph
           - Week 5-6: Query Pipeline Refactoring
           - Week 7: Performance Testing
           
Woche 8-9: Arrow Parquet Export
Woche 10:  RocksDB + OpenTelemetry Bridge
Woche 11-12: TBB + CUDA Coordination

Deliverables:

  • ✅ 100x OLAP Performance (DuckDB)
  • ✅ 2-3x Query Throughput (Flow Graph)
  • ✅ Data Lake Integration (Parquet)
  • ✅ End-to-End Distributed Tracing

Erfolgsmetriken:

  • OLAP Queries < 100ms (vs. 10s today)
  • Query Throughput > 30k QPS
  • Parquet Export > 1 GB/s

Phase 3: Could-Have - Performance Tuning (Q3 2026, 10 Wochen)

Woche 1-2: Abseil Swiss Tables
Woche 3:   RocksDB Merge Operators
Woche 4-6: Arrow Compute Kernels
Woche 7-8: RocksDB + Arrow Zero-Copy
Woche 9-10: TBB Concurrent Containers

Deliverables:

  • ✅ 2x Cache Performance
  • ✅ Atomic Counters
  • ✅ 5-10x SIMD Aggregations

Phase 4: Nice-to-Have - Enterprise (Q4 2026, 12 Wochen)

Woche 1-2:  CUDA Streams
Woche 3-4:  cuBLAS Integration
Woche 5-6:  LMDB Metadata Store
Woche 7-10: Arrow Flight RPC
Woche 11-12: libcuckoo (Optional)

Deliverables:

  • ✅ 2x GPU Throughput
  • ✅ GNN Performance
  • ✅ High-Performance Sharding RPC

6.7 Kosten-Nutzen-Matrix (Visualisierung)

High ROI
    │
    │  [1] mimalloc      [6] DuckDB
    │      (1 Tag)           (4 Wochen)
    │
    │  [4] RE2           [7] TBB Flow
    │      (1 Woche)         (3 Wochen)
    │
    │  [2] OTel Metrics  [8] Arrow Parquet
    │      (2 Wochen)        (2 Wochen)
    │
    │  [3] RocksDB TTL   [11] Abseil
    │      (2 Wochen)         (2 Wochen)
    │
    │  [5] Backup        [13] Arrow Compute
    │      (2 Wochen)         (3 Wochen)
────┼─────────────────────────────────────────► Effort
    │
    │  [16] CUDA Streams [19] Arrow Flight
    │       (2 Wochen)       (4 Wochen)
    │
Low │  [18] LMDB        [20] libcuckoo
ROI │      (2 Wochen)       (2 Wochen)

6.8 Entscheidungsbaum: Welches Feature zuerst?

START
  │
  ├─ Läuft ThemisDB in Production?
  │   NO → TIER 1 (Must-Have) komplett implementieren
  │   YES ↓
  │
  ├─ Sind OLAP Queries > 50% der Workload?
  │   YES → DuckDB (Rang 6) priorisieren
  │   NO ↓
  │
  ├─ Ist GPU-Acceleration aktiviert?
  │   YES → CUDA Streams (Rang 16)
  │   NO ↓
  │
  ├─ Sind > 10k QPS Query-Throughput erforderlich?
  │   YES → TBB Flow Graph (Rang 7)
  │   NO ↓
  │
  ├─ Ist Data Lake Integration erforderlich?
  │   YES → Arrow Parquet (Rang 8)
  │   NO → Phase 3/4 Features evaluieren

6.9 Risiko-Adjusted Priority

Formel: Adjusted Priority = (ROI × Business Impact) / (Effort × Risk)

Feature ROI Impact Effort Risk Score Final Rank
mimalloc 9 10 1 1 90.0 1
OTel Metrics 8 10 2 2 20.0 2
RocksDB TTL 7 9 2 2 15.8 3
RE2 9 8 1 1 72.0 4 (wegen Security)
Backup 6 10 2 2 15.0 5
DuckDB 10 9 4 3 7.5 6
TBB Flow 7 8 3 3 6.2 7
Arrow Parquet 6 7 2 2 10.5 8
... ... ... ... ... ... ...

6.10 Executive Summary: Top-Empfehlungen

🔥 TIER 1 (Must-Have): Sofort umsetzen (Q1 2026)

  1. mimalloc - 1 Tag, 20-40% Boost, kein Risiko
  2. OpenTelemetry Metrics - 2 Wochen, Production-Requirement
  3. RocksDB TTL - 2 Wochen, verhindert Disk-Full
  4. RE2 - 1 Woche, Security + 10-100x Performance
  5. Incremental Backup - 2 Wochen, Compliance

🔥 TIER 2 (Should-Have): Nach Must-Have (Q2 2026) 6. DuckDB - 4 Wochen, 100x OLAP (Killer-Feature) 7. TBB Flow Graph - 3 Wochen, 2-3x Query Throughput 8. Arrow Parquet - 2 Wochen, Data Lake Integration

🟡 TIER 3 (Could-Have): Performance Tuning (Q3 2026) 11. Abseil Swiss Tables - 2x Cache 13. Arrow Compute - 5-10x SIMD

🟢 TIER 4 (Nice-to-Have): Enterprise (Q4 2026) 16. CUDA Streams - GPU-intensive Deployments 19. Arrow Flight - Multi-Shard RPC

❌ TIER 5 (Won't-Have): Nicht empfohlen

  • Folly, libuv, RapidJSON, jemalloc, Thrust

Langfristige Roadmap (2026-2027)

Q1 2026: Foundation

  • mimalloc, RE2, RocksDB TTL, OpenTelemetry Metrics

Q2 2026: OLAP Revolution

  • DuckDB, Arrow Parquet, TBB Flow Graph, Abseil

Q3 2026: GPU Optimization

  • CUDA Streams, cuBLAS, TBB+CUDA Hybrid

Q4 2026: Advanced Features

  • LMDB, Arrow Compute, RocksDB+Arrow Zero-Copy

2027: Emerging Technologies

  • WebAssembly Plugins (WASM)
  • eBPF Observability
  • Rust FFI Bridges
  • DataFusion (Arrow SQL Engine)

7. Nächste Schritte

  1. Stakeholder-Review: Priorisierung der Top 10 Libraries
  2. Spike-Tests: DuckDB, mimalloc, RE2 (je 2-3 Tage)
  3. Architecture Decision Records (ADRs): Dokumentation der Entscheidungen
  4. CI/CD Integration: Automated Benchmarking für neue Libraries
  5. Security Audit: SBOM Update, CVE Monitoring für neue Dependencies

Feedback-Loop:

  • Monatlich: Performance Benchmarks
  • Quartalsweise: Library Version Updates
  • Jährlich: Dependency-Audit (veraltete Libraries ersetzen)

Anhänge:

  • A: DuckDB Integration Guide (Code-Beispiele)
  • B: mimalloc Benchmark Results
  • C: RE2 vs. std::regex Performance Comparison
  • D: Thread-Pool Coordination Cookbook
  • E: Dependency Graph Visualization (21+ Libraries)

Version: 1.1 (Erweitert um Module-Wechselwirkungen und zusätzliche Libraries)