Zum Inhalt

Circuit Breaker Konfigurierbarkeit - Implementiert ✅

Zusammenfassung

Die Circuit Breaker Thresholds für Connector-Importe sind jetzt über Firestore konfigurierbar, ohne dass ein Deployment notwendig ist.

Implementierte Änderungen

1. Neues Config-Modul

📁 core/functions/src/shared/circuit_breaker_config.js - Lädt globale Settings aus system_settings/circuitBreakerSettings - 5-minütiger Cache zur Performance-Optimierung - Automatische Validierung der Werte - Fallback auf Default-Werte bei Fehlern

2. Angepasster Circuit Breaker

📁 core/functions/src/connectors/circuit_breaker.js - Alle Funktionen verwenden jetzt dynamische Settings - checkCircuitBreaker() ist jetzt async - recordSuccess() und recordFailure() berücksichtigen Settings - Connector-spezifische Settings überschreiben globale Settings

3. Angepasster Generic Import

📁 core/functions/src/connectors/generic_import.js - Beide Endpunkte (executeConnectorImport und executeConnectorImportHttp) verwenden await checkCircuitBreaker()

4. Aktualisierte Tests

📁 core/functions/test/unit/connectors/circuit-breaker.test.js - Alle 41 Circuit Breaker Tests bestehen ✅ - Config-Stub für circuit_breaker_config implementiert - Alle async/await Calls korrekt

5. Dokumentation

📁 core/functions/src/connectors/CIRCUIT_BREAKER_CONFIG.md - Vollständige Anleitung für Admin-UI Implementierung - Firestore-Struktur und Beispiele - Validierungsregeln und Best Practices - Monitoring und Debugging Tipps

Firestore-Struktur

Globale Settings

// Collection: system_settings
// Document ID: circuitBreakerSettings
{
  failureThreshold: 5,        // 1-100, Default: 5
  resetTimeoutMs: 60000,      // 1000-3600000ms, Default: 60000
  enableLogging: true,        // Boolean, Default: true

  // Audit (optional)
  _updatedAt: Timestamp,
  _updatedBy: "user-uid"
}

Connector-spezifische Settings (optional)

// Collection: connectors
// Document ID: {connectorId}
{
  settings: {
    circuitBreaker: {
      failureThreshold: 3,   // Überschreibt global
      resetTimeoutMs: 120000 // Überschreibt global
    }
  }
}

Prioritäts-Reihenfolge

  1. Connector-spezifische Settings (höchste Priorität)
  2. Globale Settings aus Firestore (system_settings/circuitBreakerSettings)
  3. Default-Settings (Hardcoded Fallback)

Migration

Keine Breaking Changes - Bestehende Systeme funktionieren ohne Änderungen weiter - Wenn kein Firestore-Dokument existiert, werden Default-Werte verwendet - Connector-spezifische Settings in connector.settings.circuitBreaker haben weiterhin Vorrang

Nächste Schritte für Admin-UI

  1. Settings lesen

    const settingsDoc = await getDoc(
      doc(db, 'system_settings', 'circuitBreakerSettings')
    );
    

  2. Settings aktualisieren

    await setDoc(
      doc(db, 'system_settings', 'circuitBreakerSettings'),
      {
        failureThreshold: 5,
        resetTimeoutMs: 60000,
        enableLogging: true,
        _updatedAt: Timestamp.now(),
        _updatedBy: auth.currentUser?.uid
      }
    );
    

  3. Firestore Security Rules

    match /system_settings/{document=**} {
      allow read: if request.auth != null;
      allow write: if request.auth != null && 
        get(/databases/$(database)/documents/users/$(request.auth.uid))
          .data.role == 'admin';
    }
    

Vorteile

✅ Konfigurierbar ohne Deployment
✅ Per Admin-UI verwaltbar (sobald implementiert)
✅ Globale + Connector-spezifische Settings
✅ Automatische Validierung
✅ Performance durch Caching (5 Minuten TTL)
✅ Fehlertoleranz durch Fallback auf Defaults
✅ Vollständig getestet (41 Unit-Tests)

Performance

  • Cache-TTL: 5 Minuten
  • Firestore-Reads: Max. 1 Read pro 5 Minuten (alle Connectors teilen sich den Cache)
  • Fehlerfall: 1 Minute Cache bei Firestore-Fehlern

Beispiel-Szenarien

Aggressivere Fehlertoleranz

{ failureThreshold: 2, resetTimeoutMs: 30000 }

Entspanntere Fehlertoleranz

{ failureThreshold: 10, resetTimeoutMs: 300000 }

Produktion (wenig Logs)

{ failureThreshold: 5, resetTimeoutMs: 60000, enableLogging: false }