Guides
Breakout Sélectif
Breakout Sélectif

Breakout Sélectif par Dictionnaire

Innovation : Développée par Assietou DIAGNE (ANSD, Sénégal) et validée en production lors du RGPH5 Sénégal.

Qu'est-ce que le Breakout Sélectif ?

Le breakout sélectif permet de traiter un seul dictionnaire CSPro au lieu de tous les dictionnaires simultanément.

Approche Sélective vs Globale

Traitement Global (Mode Standard)

  • Traite tous les dictionnaires ensemble dans un seul processus
  • Durée : Heures voire jours selon le volume
  • Traitement séquentiel en cascade
  • Commande : php bin/console csweb:process-cases

Traitement Sélectif (Innovation CSWeb Community)

  • Traite un seul dictionnaire à la fois
  • Durée : Minutes par dictionnaire
  • Isolation complète : Un échec n'affecte que le dictionnaire en cours
  • Indépendance : Les autres dictionnaires sont traités normalement
  • Flexibilité : Choisir quel dictionnaire traiter et quand
  • Commande : php bin/console csweb:process-cases-by-dict NOM_DICT

Validation Production RGPH5 Sénégal

Le breakout sélectif a été validé en production lors du RGPH5 Sénégal, permettant un traitement ciblé par dictionnaire avec une flexibilité accrue pour gérer les opérations de recensement.


Cas d'Usage : Traitement Multi-Dictionnaires

Imaginons 5 dictionnaires :

  • RECENSEMENT (dictionnaire principal, très volumineux)
  • ENQUETE_MENAGES (volume moyen)
  • EVALUATION_AGRICOLE (volume moyen)
  • SONDAGE_SANTE (volume modéré)
  • TEST_PILOTE (petit volume de test)

Avec Traitement Global :

php bin/console csweb:process-cases
 
# Processus séquentiel :
# 1. RECENSEMENT (3M) → démarre
# 2. Erreur à 80% (ex: timeout, problème technique)
# 3. Le processus s'arrête en cascade
# 4. Les dictionnaires suivants ne sont pas traités
# 5. Il faut corriger le problème et tout relancer

Avec Breakout Sélectif :

# 1. Test rapide du pilote
php bin/console csweb:process-cases-by-dict TEST_PILOTE
# ✓ 30 secondes - Succès
 
# 2. Traiter ENQUETE_MENAGES
php bin/console csweb:process-cases-by-dict ENQUETE_MENAGES
# ✓ 45 minutes - Succès
 
# 3. Traiter RECENSEMENT
php bin/console csweb:process-cases-by-dict RECENSEMENT
# ✗ Erreur à 80% (timeout)
# Impact : UNIQUEMENT RECENSEMENT bloqué
# Les autres (TEST_PILOTE, ENQUETE) restent intacts et utilisables
 
# 4. Continuer avec les autres (pas bloqués!)
php bin/console csweb:process-cases-by-dict EVALUATION_AGRICOLE
# ✓ 25 minutes - Succès
 
php bin/console csweb:process-cases-by-dict SONDAGE_SANTE
# ✓ 15 minutes - Succès
 
# Résultat : 4/5 dictionnaires breakés et utilisables
# Flexibilité : Corriger RECENSEMENT sans impacter les autres

Installation

Prérequis

  • CSWeb Community Platform v2.0 installé
  • PostgreSQL 12+ ou MySQL 8+
  • Au moins 1 dictionnaire CSPro uploadé

Configuration .env

# Mode breakout
BREAKOUT_MODE=local  # ou remote
BREAKOUT_DB_TYPE=postgresql  # ou mysql, sqlserver
 
# PostgreSQL (Recommandé)
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_DATABASE=csweb_analytics
POSTGRES_USER=csweb_user
POSTGRES_PASSWORD=SecurePassword123!

Vérification

# Vérifier drivers
php bin/console csweb:check-database-drivers
 
# Lister dictionnaires disponibles
php bin/console csweb:list-dictionaries

Utilisation

Commande de Base

php bin/console csweb:process-cases-by-dict <NOM_DICTIONNAIRE>

Options Utiles

OptionDescriptionExemple
--limit=NLimiter à N cases (test)--limit=100
--dict-id=IDUtiliser l'ID au lieu du nom--dict-id=3
--verboseLogs détaillés-vvv

Exemples

Breakout Simple

docker compose exec csweb php bin/console \
  csweb:process-cases-by-dict EVAL_PRODUCTEURS
 
# Sortie:
# [1/6] Nettoyage schéma... (2s)
# [2/6] Création tables... (5s)
# [3/6] Extraction cases... (125 trouvées)
# [4/6] Transformation... (18s)
# [5/6] Insertion PostgreSQL... (125 lignes)
# [6/6] Création index... (3s)
# ✓ Breakout terminé : 29 secondes

Test avec Limite

# Tester avec 10 cases seulement
php bin/console csweb:process-cases-by-dict RGPH5_MENAGES --limit=10

Breakout Automatique (Cron)

# Crontab : breakout quotidien à 2h
0 2 * * * docker compose exec -T csweb \
  php bin/console csweb:process-cases-by-dict EVAL_PROD \
  --no-interaction >> /var/log/breakout.log 2>&1

Architecture

Nomenclature des Tables

Pattern : {label_dictionnaire}_{nom_table}

Exemple : Dictionnaire EVAL_PRODUCTEURS_USAID

Label généré: eval_producteurs

Tables créées:
- eval_producteurs_cases
- eval_producteurs_notes
- eval_producteurs_producteurs (Level 1)
- eval_producteurs_observations (Level 2)
- eval_producteurs_photos (Level 3)

Schéma PostgreSQL

Database: csweb_analytics
 
-- Dictionnaire 1
eval_producteurs_cases
eval_producteurs_producteurs
...
 
-- Dictionnaire 2
rgph5_menages_cases
rgph5_menages_individus
...

Cas d'Usage Réels

RGPH5 Sénégal (ANSD)

Contexte

  • Plusieurs milliers de questionnaires
  • SQL Server 2022

Configuration

BREAKOUT_MODE=remote
BREAKOUT_DB_TYPE=sqlserver

Résultat

  • Traitement flexible et ciblé par dictionnaire
  • Intégration Power BI pour analyses temps réel

Institut National de Statistique

Workflow

# 1. Test pilote (petit volume)
php bin/console csweb:process-cases-by-dict PILOTE_2026
 
# 2. Enquête (volume moyen)
php bin/console csweb:process-cases-by-dict ENQUETE_MENAGES
 
# 3. Recensement (gros volume)
php bin/console csweb:process-cases-by-dict RECENSEMENT_POP

Avantages

  • Test rapide sans attendre
  • Flexibilité totale
  • Isolation des échecs

Performance

Caractéristiques de Performance

Le breakout sélectif offre un traitement ciblé avec plusieurs avantages :

Avantages principaux :

  • Temps de traitement proportionnel au dictionnaire ciblé
  • Charge mémoire réduite (traitement d'un seul dictionnaire)
  • Isolation des échecs (chaque dictionnaire est indépendant)
  • Possibilité de paralléliser sur plusieurs dictionnaires
  • Optimisation I/O par dictionnaire

Optimisations

-- Créer indexes après breakout
CREATE INDEX idx_cases_key
  ON eval_producteurs_cases(key);
 
CREATE INDEX idx_cases_verified
  ON eval_producteurs_cases(verified);

Dépannage

Dictionary Not Found

# Lister tous les dictionnaires
php bin/console csweb:list-dictionaries
 
# Utiliser le nom EXACT
php bin/console csweb:process-cases-by-dict EVAL_PRODUCTEURS_USAID

Connection Failed

# Vérifier services
docker compose ps
 
# Tester connexions
php bin/console csweb:check-database-drivers --test-connections
 
# Redémarrer si nécessaire
docker compose restart postgres

Performance Lente

# Optimiser PostgreSQL
vim /etc/postgresql/16/main/postgresql.conf
 
# Augmenter buffers
shared_buffers = 4GB
work_mem = 50MB
maintenance_work_mem = 1GB
 
# Redémarrer
sudo systemctl restart postgresql

Crédits


Prochaines Étapes