feat: harden multi-host runtime coordination

This commit is contained in:
2026-08-02 05:30:11 +02:00
parent b58c9c55cf
commit d6255f9f8f
7 changed files with 92 additions and 7 deletions
+24 -3
View File
@@ -3,9 +3,15 @@ from __future__ import annotations
from datetime import datetime, timedelta, timezone
from importlib.metadata import PackageNotFoundError, version
import logging
import os
from celery import Celery
from celery.signals import heartbeat_sent, worker_ready, worker_shutdown
from celery.signals import (
heartbeat_sent,
worker_process_init,
worker_ready,
worker_shutdown,
)
from govoplan_core.core.campaigns import (
CAPABILITY_CAMPAIGNS_DELIVERY_TASKS,
@@ -196,6 +202,21 @@ def _worker_runtime_identity(sender: object | None = None) -> RuntimeIdentity:
return _worker_identity
def _worker_metadata() -> dict[str, object]:
raw_concurrency = str(os.getenv("CELERY_WORKER_CONCURRENCY") or "").strip()
return {
"process": "celery-worker",
"worker_pool": str(os.getenv("GOVOPLAN_WORKER_POOL") or "default"),
"concurrency": int(raw_concurrency) if raw_concurrency.isdigit() else None,
}
@worker_process_init.connect
def _reset_worker_process_database(**_kwargs) -> None:
# SQLAlchemy pools must not be shared across prefork child processes.
configure_database(settings.database_url, dispose_previous=True)
@worker_ready.connect
def _register_worker_runtime(sender=None, **_kwargs) -> None:
global _worker_consumer
@@ -206,7 +227,7 @@ def _register_worker_runtime(sender=None, **_kwargs) -> None:
node = register_runtime_node(
session,
identity,
metadata={"process": "celery-worker"},
metadata=_worker_metadata(),
)
session.commit()
except Exception:
@@ -227,7 +248,7 @@ def _heartbeat_worker_runtime(sender=None, **_kwargs) -> None:
node = heartbeat_runtime_node(
session,
identity,
metadata={"process": "celery-worker"},
metadata=_worker_metadata(),
)
session.commit()
except Exception: # noqa: BLE001 - uncertain authority must fail closed