Aller au contenu principal

Approfondissement technique

Le EOS Core suit une architecture en couches concue pour la modularite, l'extensibilite et des calculs d'incidence environnementale auditables.

Vue d'ensemble du systeme

4542e58b0bc7e64b0896e93cca973963

Couches architecturales

Couche API

La couche API fournit deux interfaces :

API REST v2 (/v2/* sur le port 8040)

  • API REST moderne basee sur FastAPI
  • Authentification par jeton JWT avec groupes d'acces
  • Prise en charge du calcul par lots
  • Journalisation structuree des requetes
  • Arret gracieux avec detection du fichier de drainage

API heritee v1 (/api/* sur le port 8050)

  • Points de terminaison retrocompatibles
  • Encapsule les fonctionnalites de l'API v2
  • Prend en charge les methodes d'authentification heritees

Couche centrale

CalcGraph - La structure de calcul centrale :

# CalcGraph gere l'ensemble du calcul sous forme de graphe oriente
class CalcGraph:
root_node_uid: str # Point d'entree du calcul
nodes: dict[str, Node] # Tous les noeuds du graphe
mutations: list[Mutation] # Journal des modifications auditable

def add_graph_observer(observer) # Declenchement des GFM
def apply_mutation(mutation) # Modifications transparentes

Orchestrateur - Coordonne l'execution des GFM :

class Orchestrator(AbstractGraphObserver):
async def run():
# 1. Initialiser les noeuds depuis la racine ou les sous-noeuds lies
# 2. Creer des workers GFM sur les noeuds initiaux
# 3. Boucle de planification :
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)

Fournisseur de services - Conteneur d'injection de dependances :

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

Couche de modules

Les modules suivent le patron Factory/Worker :

1eaa696629ecb0294e7b34c3a4ea8c78

Factory (Singleton par service) :

  • Initialise une fois au demarrage du service
  • Detient les connexions a la base de donnees et les caches
  • Cree des workers pour les noeuds individuels

Worker (Par noeud) :

  • should_be_scheduled() - Ce GFM est-il pertinent pour ce noeud ?
  • can_run_now() - Les dependances sont-elles satisfaites ?
  • run() - Execute la logique de comblement des lacunes

Couche de donnees

PostgreSQL avec asyncpg :

  • Pool de connexions pour les operations asynchrones
  • Champs JSONB pour le stockage flexible des proprietes de noeuds
  • Schema dans database/postgres/schema.sql

Classes Manager (patron DAO) :

  • PostgresGraphMgr - Persistance des noeuds/aretes
  • PgTermMgr - Operations sur le glossaire
  • PgMatchingMgr - Donnees de correspondance des ingredients
  • PostgresAccessMgr - Controle d'acces utilisateurs/groupes

Types de noeuds

EOS utilise un systeme de types riche pour les noeuds du graphe :

2464c9bed53db3ab3ca58b37b386a4a6

Type de noeudObjectif
FoodProductFlowNodeProduit alimentaire avec composition
AggregationFoodProductFlowNodeCaches d'agregation quotidienne pour l'optimisation des performances
PracticeFlowNodePratiques agricoles ou de transformation
ElementaryResourceEmissionNodeEmissions environnementales
FoodProcessingActivityNodeOperations de transformation
TransportActivityNodeTransport
ModeledActivityNodeInventaire ACV Brightway
LinkingActivityNodeLie les noeuds de flux aux noeuds d'activite
SupplySheetActivityNodeDonnees de fiche d'approvisionnement provenant de sources externes
AggregationFoodProcessingActivityNodeActivites de transformation agregees

Systeme de proprietes

Les noeuds stockent les donnees via des proprietes typees :

Type de proprieteDescription
QuantityPropMesures avec unites
LocationPropDonnees geographiques
GlossaryTermPropLiens vers la terminologie
EnvironmentalFlowsPropResultats d'incidence
NamesPropDenomination multilingue
GfmStatePropEtat d'execution du GFM

Flux de donnees

2b87741eba641d454cea4eb7e16fa3cf

Multi-location

EOS prend en charge l'isolation multi-locataire :

5214ba90b87dd7e9dadcf6514df260fd

  • Espace de noms - Isolation organisation/ecosysteme
  • Groupe d'acces - Equipe/departement au sein de l'espace de noms
  • Utilisateur - Individu avec authentification OAuth2/courriel
  • Permissions - Controle d'acces par noeud

Architecture de messagerie

RabbitMQ permet le traitement distribue :

60bf29beb01cb6a4f6ed41ff230acdb8

  • File haute priorite - Requetes interactives
  • File basse priorite - Traitement par lots
  • Gestion du prefetch - Planification tenant compte des ressources

Gestion des erreurs

Modele d'erreur structure pour les erreurs de domaine :

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

Mutations du graphe

Toutes les modifications du graphe sont transparentes et auditables :

Type de mutationObjectif
AddNodeMutationInserer un nouveau noeud
PropMutationMettre a jour une seule propriete
AddEdgeMutationCreer une relation entre noeuds
RemoveEdgeMutationSupprimer une relation
DuplicateNodeMutationCloner un noeud

Avantages :

  • Auditabilite - Journal complet des mutations
  • Determinisme - Calculs reproductibles
  • Transparence - Revue non technique possible

Architecture de performance

EOS est optimise pour les calculs d'incidence environnementale en temps reel, visant des temps de reponse inferieurs a 2 secondes pour les applications de restauration interactives.

Optimisations de performance

OptimisationIncidence
Calculs matricielsAcceleration de 5s a 1s par calcul (amelioration de 80%)
Traitement concurrentOperation parallele sur plusieurs pods avec mise en file d'attente intelligente des requetes
Service GADMImplementation Rust atteignant une reduction de memoire de 3x et une amelioration de vitesse de 10x
Mise en cache multi-niveauRappels en memoire a chaque niveau ACV au sein de la meme instance
Equilibrage de chargeDistribution des requetes basee sur RabbitMQ entre les pods workers

Evolutivite

Le systeme utilise Elastic Kubernetes Service (EKS) avec mise a l'echelle automatique :

  • Mise a l'echelle dynamique : Jusqu'a 1024 pods selon la charge de travail
  • Karpenter : Provisionnement et mise a l'echelle automatiques des noeuds
  • Optimisation des ressources : Deployements heritage et core separes pour une utilisation efficace de la RAM
  • Architecture de microservices : Traitement en memoire rationalise pour minimiser la complexite de la messagerie

Strategie de mise en cache

La mise en cache multi-niveau reduit la charge de calcul :

┌─────────────────────────────────────────────────┐
│ Niveau requete │ Resultats de calcul caches │
├─────────────────────────────────────────────────┤
│ Niveau GFM │ Caches Factory (emissions, │
│ │ activites, termes glossaire)│
├─────────────────────────────────────────────────┤
│ Niveau base │ Pool de connexions, │
│ de donnees │ cache des resultats requete │
└─────────────────────────────────────────────────┘
  • Invalidation intelligente du cache basee sur les changements de donnees
  • Invalidation selective pour minimiser le recalcul
  • Mise en cache distribuee pour les deployements cloud

Architecture de securite

EOS implemente une approche de securite multicouche :

Authentification

8bcc55d342da185749519955318e5e19

Types de jetons :

  • Jetons personnel - Acces administratif avec privileges eleves
  • Jetons espace de noms - Acces au niveau de l'organisation
  • Jetons utilisateur - Acces utilisateur individuel avec periodes de validite limitees

Securite reseau

  • Sous-reseaux prives : Les noeuds workers operent dans des sous-reseaux prives
  • Hote bastion : Acces SSH au VPC via bastion
  • Groupes d'acces : Roles IAM pour un controle d'acces granulaire

Surveillance

  • CloudWatch : Surveillance et journalisation continues du systeme
  • Journalisation structuree : Suivi des requetes et metriques de performance
  • Verification de l'etat : Surveillance automatisee de l'etat du systeme

Integration Brightway

EOS exploite Brightway, un cadre ACV open source :

Pourquoi Brightway ?

CapaciteAvantage
FlexibiliteCalculs ACV personnalises pour divers produits alimentaires
Integration de bases de donneesIntegration facile avec ecoinvent, Agribalyse via routines d'importation
Analyse d'incertitudeMethodes robustes pour l'analyse de sensibilite
EvolutiviteGere des calculs complexes pour des evaluations detaillees
CommunauteOpen source avec mises a jour methodologiques continues

Transformation matricielle

La transformation matricielle est le coeur computationnel des calculs ACV :

  1. Graphe vers matrice : Convertir les reseaux de chaine d'approvisionnement en matrices mathematiques
  2. Modelisation entree-sortie : Representer les relations entre processus
  3. Algebre matricielle : Calculer les incidences environnementales cumulees
  4. Evaluation de l'incidence : Appliquer les methodes EICV (par exemple, GIEC GWP100)
# Calcul matriciel conceptuel
# A = matrice technologique (entrees/sorties de processus)
# B = matrice d'intervention (echanges environnementaux)
# f = vecteur de demande finale
# s = vecteur de mise a l'echelle = A^(-1) * f
# g = resultat de l'inventaire = B * s

Infrastructure

Orchestration de conteneurs

  • Kubernetes : Orchestration et deploiement de conteneurs Docker
  • Karpenter : Provisionnement automatique des noeuds selon la demande
  • Charts Helm : Configurations de deploiement standardisees

Stockage de donnees

ComposantTechnologieObjectif
Base de donnees principalePostgreSQLDonnees structurees (produits, recettes, utilisateurs)
Pilote asynchroneasyncpgAcces asynchrone haute performance a la base de donnees
File de messagesRabbitMQDistribution des requetes et equilibrage de charge

Systeme d'identifiant externe (Xid)

Le systeme Xid assure l'integrite des donnees avec les systemes externes :

  • Identifiants uniques : Chaque entite a un identifiant externe a portee d'espace de noms
  • Correspondance UUID : Relation 1-1 entre Xid et UUID interne
  • Reference croisee : Recherche facile entre les espaces de noms
  • Versionnage : Suivi des changements dans le temps

Journal des mutations (Retour arriere/Rejouer)

Toutes les modifications du graphe sont journalisees pour l'auditabilite et le debogage :

# Chaque mutation est enregistree
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)

Capacites :

  • Retour arriere : Inverser les mutations pour restaurer l'etat precedent
  • Rejouer : Reconstruire l'etat du systeme ou appliquer des changements a differents environnements
  • Debogage : Tracer les etapes de calcul pour l'investigation des erreurs
  • Transparence : Piste d'audit complete pour tous les calculs

Prochaines etapes

  • Fonctionnement - Flux de calcul etape par etape
  • Gap Filling Modules - Details du systeme de modules
  • SDK GFM (bientot disponible) - Construire des modules personnalises