Zum Hauptinhalt springen

Technische Vertiefung

EOS Core folgt einer geschichteten Architektur, die auf Modularität, Erweiterbarkeit und nachvollziehbare Umweltauswirkungsberechnungen ausgelegt ist.

Systemüberblick

6ddc869a5c8b63be63c141b1a6687226

Architekturschichten

API-Schicht

Die API-Schicht bietet zwei Schnittstellen:

REST API v2 (/v2/* auf Port 8040)

  • FastAPI-basierte moderne REST-API
  • JWT-Token-Authentifizierung mit Zugriffsgruppen
  • Batch-Berechnungsunterstützung
  • Strukturierte Anfragenprotokollierung
  • Graceful Shutdown mit Drain-File-Erkennung

Legacy API v1 (/api/* auf Port 8050)

  • Abwärtskompatible Endpunkte
  • Umhüllt v2-API-Funktionalität
  • Unterstützt ältere Authentifizierungsmethoden

Core-Schicht

CalcGraph - Die zentrale Berechnungsstruktur:

# CalcGraph verwaltet die gesamte Berechnung als gerichteten Graphen
class CalcGraph:
root_node_uid: str # Einstiegspunkt für Berechnung
nodes: dict[str, Node] # Alle Knoten im Graphen
mutations: list[Mutation] # Nachvollziehbares Änderungsprotokoll

def add_graph_observer(observer) # GFM-Auslösung
def apply_mutation(mutation) # Transparente Änderungen

Orchestrator - Koordiniert die GFM-Ausführung:

class Orchestrator(AbstractGraphObserver):
async def run():
# 1. Knoten vom Root oder verknüpften Unterknoten initialisieren
# 2. GFM-Worker auf initialen Knoten starten
# 3. Scheduler-Schleife:
while gfms_pending:
for gfm in scheduled_gfms:
if gfm.should_be_scheduled():
status = gfm.can_run_now()
if status == ready:
await gfm.run(calc_graph)
elif status == reschedule:
reschedule(gfm)

Service Provider - Dependency Injection Container:

class ServiceProvider:
postgres_db: PostgresDb
glossary_service: GlossaryService
matching_service: MatchingService
node_service: NodeService
calc_service: CalcService
gap_filling_module_loader: GapFillingModuleLoader
# ... weitere Dienste

Modulschicht

Module folgen dem Factory/Worker-Muster:

897d37ba5ac560220cd0cab5317490c8

Factory (Singleton pro Service):

  • Einmal beim Service-Start initialisiert
  • Hält Datenbankverbindungen und Caches
  • Erzeugt Worker für einzelne Knoten

Worker (Pro Knoten):

  • should_be_scheduled() - Ist dieses GFM für diesen Knoten relevant?
  • can_run_now() - Sind Abhängigkeiten erfüllt?
  • run() - Führt die Gap-Filling-Logik aus

Datenschicht

PostgreSQL mit asyncpg:

  • Connection Pooling für asynchrone Operationen
  • JSONB-Felder für flexible Knoteneigenschaftsspeicherung
  • Schema in database/postgres/schema.sql

Manager-Klassen (DAO-Muster):

  • PostgresGraphMgr - Knoten-/Kantenpersistenz
  • PgTermMgr - Glossar-Operationen
  • PgMatchingMgr - Zutaten-Matching-Daten
  • PostgresAccessMgr - Benutzer-/Gruppenzugriffskontrolle

Knotentypen

EOS verwendet ein reichhaltiges Typsystem für Graphknoten:

2464c9bed53db3ab3ca58b37b386a4a6

KnotentypZweck
FoodProductFlowNodeLebensmittelprodukt mit Zusammensetzung
AggregationFoodProductFlowNodeTägliche Aggregations-Caches zur Leistungsoptimierung
PracticeFlowNodeLandwirtschaftliche oder Verarbeitungspraktiken
ElementaryResourceEmissionNodeUmweltemissionen
FoodProcessingActivityNodeVerarbeitungsoperationen
TransportActivityNodeTransport
ModeledActivityNodeBrightway LCA-Inventar
LinkingActivityNodeVerbindet Flussknoten mit Aktivitätsknoten
SupplySheetActivityNodeLieferdaten aus externen Quellen
AggregationFoodProcessingActivityNodeAggregierte Verarbeitungsaktivitäten

Eigenschaftssystem

Knoten speichern Daten durch typisierte Eigenschaften:

EigenschaftstypBeschreibung
QuantityPropMessungen mit Einheiten
LocationPropGeografische Daten
GlossaryTermPropVerknüpfungen zur Terminologie
EnvironmentalFlowsPropAuswirkungsergebnisse
NamesPropMehrsprachige Benennung
GfmStatePropGFM-Ausführungsstatus

Datenfluss

6572d0741746ddf6f470c550f1aa268b

Mandantenfähigkeit

EOS unterstützt mandantenisolierte Umgebungen:

7b9402e6475d8799ac89c631086d39b0

  • Namespace - Organisations-/Ökosystem-Isolation
  • Zugriffsgruppe - Team/Abteilung innerhalb des Namespace
  • Benutzer - Einzelperson mit OAuth2/E-Mail-Authentifizierung
  • Berechtigungen - Knotenbasierte Zugriffskontrolle

Messaging-Architektur

RabbitMQ ermöglicht verteilte Verarbeitung:

82d27ee6cb47ad50f79643b9585a4120

  • Hochprioritäts-Queue - Interaktive Anfragen
  • Niedrigprioritäts-Queue - Batch-Verarbeitung
  • Prefetch-Verwaltung - Ressourcenbewusste Planung

Fehlerbehandlung

Strukturiertes Fehlermodell für Domänenfehler:

@dataclass
class DataError:
node_uid: str
gfm_name: str
message: str
classification: ErrorClassification # missing_matching, missing_lca_inventory usw.
log_level: LogLevel # INFO, WARNING, ERROR

Graph-Mutationen

Alle Graphänderungen sind transparent und nachvollziehbar:

MutationstypZweck
AddNodeMutationNeuen Knoten einfügen
PropMutationEinzelne Eigenschaft aktualisieren
AddEdgeMutationKnotenbeziehung erstellen
RemoveEdgeMutationBeziehung löschen
DuplicateNodeMutationKnoten klonen

Vorteile:

  • Nachvollziehbarkeit - Vollständiges Mutationsprotokoll
  • Determinismus - Reproduzierbare Berechnungen
  • Transparenz - Nicht-technische Überprüfung möglich

Leistungsarchitektur

EOS ist für Echtzeit-Umweltauswirkungsberechnungen optimiert, mit dem Ziel von Antwortzeiten unter 2 Sekunden für interaktive Restaurantanwendungen.

Leistungsoptimierungen

OptimierungAuswirkung
Matrix-BerechnungenBeschleunigt von 5s auf 1s pro Berechnung (80% Verbesserung)
Parallele VerarbeitungParallelbetrieb über mehrere Pods mit intelligenter Anfragen-Warteschlange
GADM-ServiceRust-Implementierung mit 3x Speicherreduktion und 10x Geschwindigkeitssteigerung
Mehrstufiges CachingIn-Memory-Callbacks auf jeder LCA-Ebene innerhalb derselben Instanz
LastverteilungRabbitMQ-basierte Anfrageverteilung über Worker-Pods

Skalierbarkeit

Das System verwendet Elastic Kubernetes Service (EKS) mit automatischer Skalierung:

  • Dynamische Skalierung: Bis zu 1024 Pods basierend auf Arbeitslast
  • Karpenter: Automatische Knotenbereitstellung und -skalierung
  • Ressourcenoptimierung: Getrennte Legacy- und Core-Bereitstellungen für effiziente RAM-Nutzung
  • Microservice-Architektur: Optimierte In-Memory-Verarbeitung zur Minimierung der Messaging-Komplexität

Caching-Strategie

Mehrstufiges Caching reduziert die Berechnungslast:

┌─────────────────────────────────────────────────┐
│ Anfrageebene │ Gecachte Berechnungsergebnisse │
├─────────────────────────────────────────────────┤
│ GFM-Ebene │ Factory-Caches (Emissionen, │
│ │ Aktivitäten, Glossarbegriffe) │
├─────────────────────────────────────────────────┤
│ Datenbankebene │ Connection Pooling, │
│ │ Abfrageergebnis-Caching │
└─────────────────────────────────────────────────┘
  • Intelligente Cache-Invalidierung basierend auf Datenänderungen
  • Selektive Invalidierung zur Minimierung von Neuberechnungen
  • Verteiltes Caching für Cloud-Bereitstellungen

Sicherheitsarchitektur

EOS implementiert einen mehrschichtigen Sicherheitsansatz:

Authentifizierung

41887a535e117ff34db3e4718ea41266

Token-Typen:

  • Staff-Tokens - Administrativer Zugriff mit erhöhten Rechten
  • Namespace-Tokens - Zugriff auf Organisationsebene
  • Benutzer-Tokens - Individueller Benutzerzugriff mit begrenzter Gültigkeitsdauer

Netzwerksicherheit

  • Private Subnetze: Worker-Knoten operieren in privaten Subnetzen
  • Bastion Host: SSH-Zugang zum VPC über Bastion
  • Zugriffsgruppen: IAM-Rollen für feingranulare Zugriffskontrolle

Monitoring

  • CloudWatch: Kontinuierliche Systemüberwachung und Protokollierung
  • Strukturierte Protokollierung: Anfragenverfolgung und Leistungsmetriken
  • Health Checks: Automatisierte Systemzustandsüberwachung

Brightway-Integration

EOS nutzt Brightway, ein Open-Source-LCA-Framework:

Warum Brightway?

FähigkeitVorteil
FlexibilitätMaßgeschneiderte LCA-Berechnungen für diverse Lebensmittelprodukte
DatenbankintegrationEinfache Integration mit ecoinvent, Agribalyse über Import-Routinen
UnsicherheitsanalyseRobuste Methoden für Sensitivitätsanalysen
SkalierbarkeitBewältigt komplexe Berechnungen für detaillierte Bewertungen
CommunityOpen-Source mit kontinuierlichen Methodik-Updates

Matrix-Transformation

Die Matrix-Transformation ist der Berechnungskern für LCA-Berechnungen:

  1. Graph zu Matrix: Lieferkettennetzwerke in mathematische Matrizen konvertieren
  2. Input-Output-Modellierung: Beziehungen zwischen Prozessen darstellen
  3. Matrixalgebra: Kumulative Umweltauswirkungen berechnen
  4. Auswirkungsbewertung: LCIA-Methoden anwenden (z.B. IPCC GWP100)
# Konzeptionelle Matrixberechnung
# A = Technologiematrix (Prozessin-/outputs)
# B = Interventionsmatrix (Umweltaustausche)
# f = Endnachfragevektor
# s = Skalierungsvektor = A^(-1) * f
# g = Inventarergebnis = B * s

Infrastruktur

Container-Orchestrierung

  • Kubernetes: Docker-Container-Orchestrierung und -Bereitstellung
  • Karpenter: Automatische Knotenbereitstellung basierend auf Bedarf
  • Helm Charts: Standardisierte Bereitstellungskonfigurationen

Datenspeicherung

KomponenteTechnologieZweck
PrimärdatenbankPostgreSQLStrukturierte Daten (Produkte, Rezepte, Benutzer)
Async-TreiberasyncpgHochleistungs-Async-Datenbankzugriff
Message QueueRabbitMQAnfrageverteilung und Lastausgleich

Externes ID-System (Xid)

Das Xid-System gewährleistet Datenintegrität mit externen Systemen:

  • Eindeutige Identifier: Jede Entität hat eine namespace-bezogene externe ID
  • UUID-Mapping: 1-1-Beziehung zwischen Xid und interner UUID
  • Querverweise: Einfache Suche über Namespaces hinweg
  • Versionierung: Änderungsverfolgung über die Zeit

Mutationsprotokoll (Rewind/Replay)

Alle Graphänderungen werden für Nachvollziehbarkeit und Debugging protokolliert:

# Jede Mutation wird aufgezeichnet
mutation = PropMutation(
node_uid="abc123",
property_type="OriginProp",
old_value=None,
new_value=origin_data,
gfm_name="origin_gfm",
timestamp=datetime.now()
)
calc_graph.apply_mutation(mutation)

Fähigkeiten:

  • Rewind: Mutationen rückgängig machen, um vorherigen Zustand wiederherzustellen
  • Replay: Systemzustand rekonstruieren oder Änderungen auf andere Umgebungen anwenden
  • Debugging: Berechnungsschritte zur Fehleruntersuchung nachverfolgen
  • Transparenz: Vollständiger Audit-Trail für alle Berechnungen

Nächste Schritte