Skip to content

Daniel217D/python-async-with-redis-demo

Repository files navigation

Python async Redis demo

Минимальная демка общения нескольких Python-приложений через Redis в Docker:

  • api — FastAPI-приложение, которое принимает задачи и отдает результаты.
  • alloy — собирает логи Docker-контейнеров и отправляет их в Loki.
  • frontend — легкая HTML-страница для запуска задач из браузера.
  • grafana — UI для просмотра логов.
  • loki — хранилище логов.
  • worker_double — отдельный worker для задачи x * 2.
  • worker_square_plus_one — отдельный worker для задачи x^2 + 1.
  • redis — очередь и хранилище результатов.

Запуск

docker compose up --build

API будет доступен на порту из .env:

API_PORT=8000
FRONTEND_PORT=8080
GRAFANA_ADMIN_PASSWORD=admin
GRAFANA_ADMIN_USER=admin
GRAFANA_PORT=3000
LOKI_PORT=3100
REDIS_PORT=6379

Демо-страница будет доступна по адресу:

http://localhost:8080

Grafana будет доступна по адресу:

http://localhost:3000

Логин по умолчанию:

admin / admin

Эти значения вынесены в .env:

GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=admin

Пример создания задачи для worker_double

curl -X POST http://localhost:8000/tasks/double \
  -H "Content-Type: application/json" \
  -d '{"x": 21}'

Пример ответа:

{"task_id":"8d393ca5-4f9f-48e7-b5d1-cbe32ce6e0d3","status":"queued"}

Пример создания задачи для worker_square_plus_one

curl -X POST http://localhost:8000/tasks/square-plus-one \
  -H "Content-Type: application/json" \
  -d '{"x": 5}'

Пример ответа:

{"task_id":"9ec6293d-5628-47fd-8d45-e9e80a9801f4","status":"queued"}

Пример проверки результата

curl http://localhost:8000/tasks/<task_id>

Пример ответа во время обработки:

{"task_id":"8d393ca5-4f9f-48e7-b5d1-cbe32ce6e0d3","status":"processing"}

Пример ответа после обработки:

{"task_id":"8d393ca5-4f9f-48e7-b5d1-cbe32ce6e0d3","status":"done","result":42}

Пример ошибки в payload

Если отправить запрос без поля x, API вернет 422:

curl -X POST http://localhost:8000/tasks/double \
  -H "Content-Type: application/json" \
  -d '{}'

Демо-страница

На странице есть:

  • поле ввода числа
  • кнопка Run x * 2
  • кнопка Run x² + 1
  • автоматический опрос статуса задачи до получения результата

Просмотр логов

После запуска:

  1. Открой http://localhost:3000
  2. Войди как admin / admin
  3. Перейди в Explore
  4. Выбери источник данных Loki
  5. Пример запроса:
{job="docker"}

Пример для логов API:

{container=~".*api.*"}

Пример для логов worker'а:

{container=~".*worker_double.*"}

Структура

.
├── .env
├── README.md
├── alloy-config.alloy
├── api
│   ├── app.py
│   ├── Dockerfile
│   └── requirements.txt
├── docker-compose.yml
├── frontend
│   ├── Dockerfile
│   └── index.html
├── grafana
│   └── provisioning
├── worker_double
│   ├── Dockerfile
│   ├── requirements.txt
│   └── worker.py
└── worker_square_plus_one
    ├── Dockerfile
    ├── requirements.txt
    └── worker.py

About

Python process interaction demo via Redis

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors