Files
ripe-cidr-collector/docs/summary-process-split.md
T

24 lines
3.1 KiB
Markdown
Raw Normal View History

2026-09-21 07:29:38 +03:00
# Итоги: разделение сборщика и API на два процесса
План: `docs/plan-process-split.md`. Часть B (управление ASN/FQDN через API) не реализована, план: `docs/plan-asn-fqdn-api.md`.
## Сделано
- **`collector_daemon.py` (новый)**: отдельный процесс с `BlockingScheduler`. Расписание берёт из `config.json`, раз в 30 с сверяет его и перепланирует задания без перезапуска (невалидный cron игнорируется). Пишет `status.json` (состояние заданий и heartbeat). Один экземпляр гарантируется блокировкой `collector.daemon.lock`. По `SIGTERM` завершается штатно после текущего сбора.
- **`api_server.py`**: планировщик, `lifespan` и состояние заданий удалены. `POST /schedule` только валидирует cron и пишет конфиг (в ответе `applied_within_seconds`). `GET /health` читает `status.json`: `collector_alive` (heartbeat моложе 120 с), задания, счётчики; без демона `status = degraded`.
- **`storage.py`**: `try_lock` (неблокирующая блокировка для singleton). **`cidr_collector.py`**: `STATUS_FILE`, `SYNC_INTERVAL`, `STATUS_STALE_AFTER`.
- **README**: два сервиса (systemd и OpenRC), примечание об обновлении, переписаны «Scheduler Logic» и описание `/health`; cron оставлен как альтернатива демону. `status.json` добавлен в `.gitignore` и `.dockerignore`.
- **Тесты**: `tests/test_daemon.py` (2 теста: перепланирование и heartbeat в `/health`). Всего 11, в контейнере: 11 passed.
## Проверка (два реальных процесса на копии данных)
- Сбор идёт демоном без участия API; `/health`: `ok`, `collector_alive: true`.
- Второй запуск демона завершается с ошибкой singleton (exit 1).
- `POST /schedule` (`*/1` -> `*/2`): демон перепланировал задание через 19 с, `/health` показал новый cron.
- Перезапуск API не повлиял на демон.
- `SIGTERM`: демон остановился штатно.
- Через ~130 с после остановки: `status = degraded`, `collector_alive = false`.
## Замечания
- **Обязательное действие при обновлении:** нужно запустить сервис `ripe-collector`, одного `ripe-api` больше недостаточно.
- Изменение расписания применяется с задержкой до 30 с.
- Демон пишет `status.json` каждые 30 с (маленький файл, атомарная запись).
- Реальные `data.json`, `fqdn_data.json`, `config.json` не менялись.