Skip to content

feat(workers): jeden workerserver (obie kolejki) — zgodne ze spec single-worker#6

Merged
mpasternak merged 1 commit into
mainfrom
worktree-feature+single-workerserver-celery-concurrency
Jun 2, 2026
Merged

feat(workers): jeden workerserver (obie kolejki) — zgodne ze spec single-worker#6
mpasternak merged 1 commit into
mainfrom
worktree-feature+single-workerserver-celery-concurrency

Conversation

@mpasternak

@mpasternak mpasternak commented Jun 2, 2026

Copy link
Copy Markdown
Member

Cel

Konsolidacja dwóch workerów Celery (workerserver-general + workerserver-denorm)
w jeden workerserver obsługujący obie kolejki. Każdy z dwóch workerów forkował
nproc dzieci prefork (każde = pełna kopia Django ~250 MB) → ~2×1.16 GiB.
Jeden worker = jedna baza Django + mniej dzieci.

Zgodność ze specyfikacją obrazu BPP

Realizuje sekcję „Następstwa w bpp-deploy" ze spec single-worker
(~/Programowanie/bpp-single-worker/docs/superpowers/specs/2026-06-02-single-worker-design.md).
Zachowanie przejęte ze spec:

  • Bez ścisłego priorytetu — kombu round-robin po kolejkach (zadania denorm/
    flush_single krótkie, nie blokują interaktywnych na długo).
  • Concurrency = 75% rdzeni (domyślnie, liczone w obrazie w app.conf), nie 100%.
    Knoby: CELERY_WORKER_CONCURRENCY / _CONCURRENCY_PERCENT / _MAX_MEMORY_PER_CHILD
    / _MAX_TASKS_PER_CHILD / _POOL / _PREFETCH_MULTIPLIER.

Zmiany w tym repo (bpp-deploy)

  • docker-compose.workers.yml — usunięty workerserver-denorm; jedyny worker
    to workerserver z CELERY_QUEUE: "celery,denorm" ustawionym jawnie
    (transition-safe, niżej) + CELERY_WORKER_MAX_MEMORY_PER_CHILD=300000 (300 MB).
    denorm-queue/workerserver-status depends_onworkerserver. Jeden nocny
    restart (05:05).
  • Rename workerserver-generalworkerserver i zmiennych WORKER_GENERAL_*
    WORKER_*, z obowiązkową dwuwarstwową ochroną wsteczną (kontrakt CLAUDE.md):
    fallback w compose ${WORKER_MEM_LIMIT:-${WORKER_GENERAL_MEM_LIMIT:-1536m}} +
    migracja w init-configs.sh (zachowuje wartość) + sprzątanie w
    configure-resources.sh. WORKER_DENORM_* usunięte. git pull && make up na
    starym .env działa bez ręcznej edycji.
  • Model zasobów — jeden VARIABLE worker (floor 1.5g, waga 35% = 20+15; CPU waga
    30, CPU_TOTAL_WEIGHT 95).
  • mk/*, restore.sh, upgrade-postgres.sh — usunięty drugi worker, nowa nazwa.
  • Testy — + test konsolidacji/rename. 140 passed, 0 failed.
  • Docsuslugi.md, zadania-ofelia.md, healthchecks-autoheal.md,
    limity-zasobow.md (#concurrency-celery z tabelą CELERY_WORKER_*), CLAUDE.md.

Dlaczego CELERY_QUEUE jawnie (drobne odstępstwo od spec)

Spec sugeruje „bez CELERY_QUEUE". Ustawiam je jawnie na celery,denorm, by
rollout był odporny na kolejność: działa na obecnym opublikowanym obrazie (stary
entrypoint honoruje CELERY_QUEUE) i na nowym — więc kolejka denorm nigdy nie
zostaje bez konsumenta w oknie wdrażania obrazu. Na starym obrazie CELERY_WORKER_*
są ignorowane (concurrency = rdzenie); po make pull dochodzi 75% i recykling.
Jeśli wolisz literalne trzymanie się spec — usunę tę linię.

Weryfikacja

  • bash tests/test_makefile.sh140 passed, 0 failed
  • docker compose config → jedyny worker workerserver; denorm-queueworkerserver;
    WORKER_MEM_LIMIT interpoluje się, fallback do WORKER_GENERAL_MEM_LIMIT (1700m) OK.
  • mkdocs build --strict → OK · bash -n na skryptach → OK.

🤖 Generated with Claude Code

@mpasternak mpasternak force-pushed the worktree-feature+single-workerserver-celery-concurrency branch from ab5779a to 25c9a73 Compare June 2, 2026 09:21
@mpasternak mpasternak changed the title feat(workers): jeden workerserver (obie kolejki) + concurrency Celery 3/4 rdzeni feat(workers): jeden workerserver-general (obie kolejki) — zgodne ze spec single-worker Jun 2, 2026
Scal workerserver-general + workerserver-denorm w jeden `workerserver`
konsumujący obie kolejki. Oszczędza jedną pełną kopię Django i połowę
procesów-dzieci prefork vs poprzednie 2× workery (~2×1.16 GiB → ~1×).

Zachowanie zgodne ze specyfikacją single-worker po stronie obrazu BPP
(~/Programowanie/bpp-single-worker, docs/.../2026-06-02-single-worker-design.md):

- **Bez ścisłego priorytetu** — kombu round-robin po `-Q celery,denorm`
  (świadoma decyzja: zadania denorm/flush_single są krótkie).
- Concurrency (domyślnie 75% rdzeni) + recykling dzieci konfiguruje obraz w
  `app.conf` (`celery_tasks.py`) przez `CELERY_WORKER_*` (CONCURRENCY, _PERCENT,
  _MAX_MEMORY_PER_CHILD, _MAX_TASKS_PER_CHILD, _POOL, _PREFETCH_MULTIPLIER) —
  czytane dopiero przez obraz z czerwca 2026+.
- `CELERY_QUEUE: "celery,denorm"` ustawione JAWNIE (nie polegamy na nowym
  domyślnym entrypoincie), żeby konsolidacja działała płynnie także na OBECNYM
  obrazie — inaczej kolejka denorm zostałaby bez konsumenta do czasu wydania
  obrazu. CELERY_WORKER_MAX_MEMORY_PER_CHILD=300000 (deploy-default 300 MB).

Rename serwisu workerserver-general -> workerserver oraz zmiennych
WORKER_GENERAL_* -> WORKER_* z obowiązkową dwuwarstwową ochroną wsteczną:
fallback w compose ${WORKER_MEM_LIMIT:-${WORKER_GENERAL_MEM_LIMIT:-1536m}} +
migracja w init-configs (zachowuje wartość) + sprzątanie w configure-resources.
WORKER_DENORM_* usunięte. depends_on denorm-queue/workerserver-status przepięte;
jeden nocny restart (05:05). Model zasobów: jeden VARIABLE worker (floor 1.5g,
waga 35% = 20+15; CPU waga 30, total 95).

Zaktualizowane mk/*, restore.sh, upgrade-postgres.sh, testy (+ test konsolidacji,
140 passed) i docs (uslugi, zadania-ofelia, healthchecks-autoheal, limity-zasobow
#concurrency-celery, CLAUDE.md). mkdocs build --strict OK; docker compose config OK.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@mpasternak mpasternak force-pushed the worktree-feature+single-workerserver-celery-concurrency branch from 25c9a73 to a5724ac Compare June 2, 2026 10:29
@mpasternak mpasternak changed the title feat(workers): jeden workerserver-general (obie kolejki) — zgodne ze spec single-worker feat(workers): jeden workerserver (obie kolejki) — zgodne ze spec single-worker Jun 2, 2026
@mpasternak mpasternak merged commit f7314aa into main Jun 2, 2026
4 of 5 checks passed
@mpasternak mpasternak deleted the worktree-feature+single-workerserver-celery-concurrency branch June 2, 2026 12:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant