Фоновый сервис проверки доступности сайтов на FastAPI, Celery и Redis.
- FastAPI принимает список URL и сразу возвращает
task_id. - Redis используется как Celery broker: API кладет сообщение в очередь.
- Redis используется как Celery result backend: результат читается по
task_id. - Celery worker проверяет сайты в фоне, измеряет время ответа и формирует отчет.
- Поддержаны
delay(),apply_async(), задержка запуска, TTL задачи и отдельная очередь. - Задача объявлена с
bind=True, видит свойtask_idи настроена на retry.
docker compose up --buildAPI будет доступен на http://localhost:8000.
Документация FastAPI:
http://localhost:8000/docs
Обычный запуск через .delay():
curl -X POST http://localhost:8000/checks \
-H 'Content-Type: application/json' \
-d '{"urls":["https://example.com","https://google.com","https://not-existing-site.test"]}'Запуск с задержкой через .apply_async(countdown=...):
curl -X POST 'http://localhost:8000/checks/delayed?countdown=30' \
-H 'Content-Type: application/json' \
-d '{"urls":["https://example.com"]}'Запуск с ограничением времени жизни задачи:
curl -X POST 'http://localhost:8000/checks/expiring?expires=60' \
-H 'Content-Type: application/json' \
-d '{"urls":["https://example.com"]}'Запуск в отдельной очереди url_checks:
curl -X POST http://localhost:8000/checks/queued \
-H 'Content-Type: application/json' \
-d '{"urls":["https://example.com"]}'Проверка результата:
curl http://localhost:8000/checks/<task_id>/statusКраткий отчет:
curl http://localhost:8000/checks/<task_id>Сервис возвращает основные статусы Celery:
PENDING: задача еще не взята worker-ом или неизвестна result backend.STARTED: worker начал выполнение.SUCCESS: проверка завершилась успешно, вresultесть отчет.FAILURE: задача завершилась ошибкой.RETRY: Celery запланировал повторную попытку.
Обычный запуск:
celery -A app.celery_app.celery_app worker --loglevel=infoС одним процессом:
celery -A app.celery_app.celery_app worker --loglevel=info --concurrency=1В режиме solo:
celery -A app.celery_app.celery_app worker --loglevel=info --pool=soloДля отдельной очереди:
celery -A app.celery_app.celery_app worker --loglevel=info --queues=url_checksПеременные окружения:
| Переменная | Значение по умолчанию |
|---|---|
REDIS_HOST |
redis |
REDIS_PORT |
6379 |
CELERY_BROKER_DB |
0 |
CELERY_RESULT_DB |
1 |
REQUEST_TIMEOUT_SECONDS |
5 |
MAX_URLS_PER_CHECK |
20 |
TASK_RESULT_EXPIRES_SECONDS |
3600 |
Для локального запуска без Docker укажите REDIS_HOST=localhost.
В Docker Compose Redis доступен контейнерам на redis:6379; наружу Redis не публикуется, чтобы не конфликтовать с локальным Redis на машине.
cp .env.example .env