Введение: Ниша между Celery и Kubernetes
Привет!
Если вы когда-нибудь сталкивались с задачей запуска сотен изолированных фоновых процессов на одном сервере (будь то парсеры для клиентов, торговые боты или обработчики данных в SaaS), то вы знаете, как быстро всё усложняется.
Можно, конечно, вручную поднимать Docker-контейнеры и писать костыли для мониторинга. Можно развернуть полноценный Kubernetes, но для одной ноды это часто — оверкилл, требующий отдельного администратора. Можно использовать Celery, но он управляет задачами, а не контейнерами, и изоляция на уровне процессов — это не тоже самое, что изоляция на уровне контейнеров.
Мы столкнулись с этой болью и написали инструмент, который закрывает этот пробел. Встречайте: RedTailFox — легковесный оркестратор на Python, который управляет Docker-контейнерами с вашими воркерами на одном сервере. Он сам решает, когда поднять новый контейнер, сам следит за здоровьем слотов и сам себя чинит.
1. Почему RedTailFox?
Проект родился из прагматичных потребностей:
-
Нужно много изолированных воркеров. Например, под каждого клиента свой процесс с его конфигом.
-
Не хочется платить DevOps-инженеру только за то, чтобы следить за этой "фермой" контейнеров.
-
Хочется, чтобы система была самовосстанавливающейся. Упал контейнер? Остановился слот? Система должна перезапустить их без нашего участия.
-
Никакого YAML-программирования. Вся конфигурация — через переменные окружения и Python-словари. Просто и понятно.
RedTailFox — это ровно тот слой оркестрации, который нужен, когда Kubernetes слишком "жирный", а Celery не умеет управлять контейнерами.
2. Как это устроено (Архитектура)
Система состоит из трёх основных компонентов, которые общаются через Redis. Вот как выглядит жизненный цикл задачи:


-
Менеджер (
manager.py): Центральный . Он висит в цикле, читает задачи из Redis (manager_tasks) и принимает решения. Если есть свободный слот в уже запущенном контейнере — назначает задачу туда. Если слотов нет — черезdocker_utils.pyзапускает новый Docker-контейнер с воркером. -
Воркер (
worker.py): Живет внутри каждого Docker-контейнера. Он получает команду "start" от менеджера через Redis-канал и запускает у себя слот с задачей. Каждые 3 секунды он пишет heartbeat в Redis, сообщая, что он жив и занят. -
Монитор (
monitor.py): Санитар системы. Каждые 10 секунд он сканирует heartbeat'ы в Redis. Если видит, что какой-то контейнер или слот "молчит" дольше положенного (или находит контейнер-зомби, который есть в Docker, но не зарегистрирован в Redis), он отправляет команду на перезапуск в очередь менеджера.
Это замкнутый цикл, который обеспечивает удивительную живучесть при простоте реализации.
3. Возможности, которые мы заложили
-
Умные слоты: Внутри одного контейнера можно запустить несколько слотов-воркеров (настраивается через
MAX_SLOTS_PER_CONTAINER). Менеджер распределяет задачи по слотам оптимальным образом. -
Автомасштабирование: Как только все слоты во всех контейнерах заняты, менеджер автоматически поднимает новый Docker-контейнер.
-
Автовосстановление (Self-healing): Монитор перезапускает упавшие слоты или целые контейнеры без вашего участия.
-
Graceful Shutdown: Воркеры умеют корректно завершаться, отписываясь от менеджера, чтобы тот не ждал ответа от мертвого слота.
-
Мониторинг (HeadBear): Встроенная легкая система метрик. Можно смотреть, какие слоты запущены, как давно они активны.
-
Конфигурация без YAML: Всё хранится либо в переменных окружения, либо в Redis. Запустил контейнер — он уже знает свою конфигурацию.
4. Быстрый старт за 5 минут
Давайте сразу к делу. Попробовать RedTailFox очень просто. Всё, что нужно — это Docker, Redis и Python.
-
Клонируем и ставим зависимости:
bash
git clone https://github.com/Dark-F0X/RedTailFox
cd RedTailFox
pip install -r requirements.txt
cp .env.example .env
# Отредактируйте .env, указав ваш Redis
Собираем образ воркера:
bash
docker build -t rtf-worker:latest -f worker/Dockerfile .
Запускаем менеджера и монитор (в двух разных терминалах):
bash
python manager/main.py
# В другом терминале
python monitor/monitor.py
Отправляем первую задачу (например, из Python-скрипта):
python
import redis, json
r = redis.Redis(host='localhost', port=6379)
task = {
"command": "start",
"slot_id": 1,
"config": {
"job": {
"name": "my_first_scraper",
"interval": 300
}
}
}
r.lpush("manager_tasks", json.dumps(task))
print("Задача ушла!")
Через несколько секунд вы увидите, как менеджер запустит Docker-контейнер, а воркер внутри него начнет выполнять задачу. Всё работает!
5. Где это пригодится?
Мы протестировали RedTailFox на реальных задачах и подтверждаем: на одном среднем сервере можно запустить более 1000 изолированных воркеров. Это открывает широкий спектр применений:
-
SaaS-платформы: Каждому клиенту — свой изолированный воркер для обработки его данных, интеграций или отчетов.
-
Парсинг и мониторинг: Сотни парсеров для разных сайтов или API, каждый со своими аккаунтами и прокси.
-
Торговые боты: Запуск множества стратегий для разных инструментов или счетов.
-
Фоновые джобы: Любые фоновые задачи, требующие строгой изоляции друг от друга.
Заключение и планы
RedTailFox — это не замена Kubernetes. Это инструмент для своей, четко очерченной задачи: простая и надежная оркестрация контейнеризированных воркеров на одном сервере.
Проект молодой (первый релиз — буквально вчера!), и мы активно развиваем его. В ближайших планах:
-
Интеграция с Prometheus для сбора метрик.
-
Поддержка нескольких нод (кластеризация).
-
Больше тестов и примеров на разных языках.
Мы ищем единомышленников! Если у вас есть идеи по улучшению, или вы хотите помочь с интеграционными тестами, документацией или новым функционалом — заходите к нам на GitHub, создавайте Issue или пишите в Telegram.
Ссылки:
-
Telegram: @rtf_labs
Сделано с 🦊 и любовью к Python для инженеров, которые ценят своё время.
Автор: Dark_bear
