fix: workers supervisés + tiles régénérées après ingestion et au démarrage
This commit is contained in:
@@ -9,7 +9,9 @@ use App\Service\Forecast\ImpactScoreService;
|
|||||||
use App\Service\Ingestion\IngestionService;
|
use App\Service\Ingestion\IngestionService;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
use Symfony\Component\DependencyInjection\Attribute\Autowire;
|
||||||
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
|
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
|
||||||
|
use Symfony\Component\Process\Process;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Exécute le pipeline complet à chaque tick du scheduler :
|
* Exécute le pipeline complet à chaque tick du scheduler :
|
||||||
@@ -35,6 +37,7 @@ final class IngestionScheduleHandler
|
|||||||
private ImpactScoreService $scores,
|
private ImpactScoreService $scores,
|
||||||
private EntityManagerInterface $em,
|
private EntityManagerInterface $em,
|
||||||
private LoggerInterface $logger,
|
private LoggerInterface $logger,
|
||||||
|
#[Autowire('%kernel.project_dir%')] private string $projectDir,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public function __invoke(IngestionScheduleMessage $message): void
|
public function __invoke(IngestionScheduleMessage $message): void
|
||||||
@@ -94,5 +97,24 @@ final class IngestionScheduleHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->logger->info('Scheduled ingestion completed');
|
$this->logger->info('Scheduled ingestion completed');
|
||||||
|
|
||||||
|
// Étape 4 : régénération des vector tiles depuis les données fraîches
|
||||||
|
$this->regenerateTiles();
|
||||||
|
}
|
||||||
|
|
||||||
|
private function regenerateTiles(): void
|
||||||
|
{
|
||||||
|
$process = new Process(
|
||||||
|
['php', 'bin/console', 'app:generate-tiles', '--env=prod', '--no-debug'],
|
||||||
|
$this->projectDir
|
||||||
|
);
|
||||||
|
$process->setTimeout(300);
|
||||||
|
$process->run();
|
||||||
|
|
||||||
|
if ($process->isSuccessful()) {
|
||||||
|
$this->logger->info('Vector tiles regenerated');
|
||||||
|
} else {
|
||||||
|
$this->logger->error('Tile generation failed', ['output' => $process->getErrorOutput()]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,16 +4,33 @@ set -e
|
|||||||
# Warmup du cache Symfony au démarrage (les vars d'env sont disponibles ici)
|
# Warmup du cache Symfony au démarrage (les vars d'env sont disponibles ici)
|
||||||
php bin/console cache:warmup --env=prod --no-debug 2>&1 || true
|
php bin/console cache:warmup --env=prod --no-debug 2>&1 || true
|
||||||
|
|
||||||
|
# Génère les tiles au démarrage depuis les données existantes en DB.
|
||||||
|
# Indispensable si le container redémarre sans que les tiles aient été régénérées
|
||||||
|
# par le pipeline d'ingestion (premier démarrage, redémarrage inattendu, etc.).
|
||||||
|
php bin/console app:generate-tiles --env=prod --no-debug 2>&1 | tee -a var/log/tiles.log || true
|
||||||
|
|
||||||
|
# Boucle de supervision : relance le worker automatiquement après --time-limit ou crash.
|
||||||
|
# Sans cette boucle, les workers s'arrêtent définitivement après 3600s (--time-limit)
|
||||||
|
# et plus aucune ingestion ni traitement de message n'a lieu.
|
||||||
|
_supervise() {
|
||||||
|
name="$1"; shift
|
||||||
|
while true; do
|
||||||
|
printf '[%s] Starting worker: %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$name" >> "var/log/${name}.log"
|
||||||
|
"$@" >> "var/log/${name}.log" 2>&1 || true
|
||||||
|
printf '[%s] Worker %s stopped — restart in 5s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$name" >> "var/log/${name}.log"
|
||||||
|
sleep 5
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
# Worker scheduler — réveille le pipeline toutes les 6h
|
# Worker scheduler — réveille le pipeline toutes les 6h
|
||||||
# --time-limit=3600 : redémarre le process toutes les heures (rotation naturelle + libération mémoire)
|
_supervise scheduler \
|
||||||
php bin/console messenger:consume scheduler_main \
|
php bin/console messenger:consume scheduler_main \
|
||||||
--env=prod --no-debug --memory-limit=64M --time-limit=3600 \
|
--env=prod --no-debug --memory-limit=64M --time-limit=3600 &
|
||||||
2>&1 | tee -a var/log/scheduler.log &
|
|
||||||
|
|
||||||
# Worker async — exécute les messages d'ingestion déclenchés par le scheduler
|
# Worker async — exécute les messages d'ingestion déclenchés par le scheduler
|
||||||
php bin/console messenger:consume async \
|
_supervise async \
|
||||||
--env=prod --no-debug --memory-limit=256M --time-limit=3600 \
|
php bin/console messenger:consume async \
|
||||||
2>&1 | tee -a var/log/worker.log &
|
--env=prod --no-debug --memory-limit=256M --time-limit=3600 &
|
||||||
|
|
||||||
# Lance FrankenPHP (comportement par défaut de l'image de base)
|
# Lance FrankenPHP (comportement par défaut de l'image de base)
|
||||||
exec frankenphp run --config /etc/caddy/Caddyfile "$@"
|
exec frankenphp run --config /etc/caddy/Caddyfile "$@"
|
||||||
|
|||||||
Reference in New Issue
Block a user