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


Менеджер (manager.py [1]): Центральный . Он висит в цикле, читает задачи из Redis (manager_tasks) и принимает решения. Если есть свободный слот в уже запущенном контейнере — назначает задачу туда. Если слотов нет — через docker_utils.py [3] запускает новый Docker-контейнер с воркером.
Воркер (worker.py [4]): Живет внутри каждого Docker-контейнера. Он получает команду "start" от менеджера через Redis-канал и запускает у себя слот с задачей. Каждые 3 секунды он пишет heartbeat в Redis, сообщая, что он жив и занят.
Монитор (monitor.py [5]): Санитар системы. Каждые 10 секунд он сканирует heartbeat'ы в Redis. Если видит, что какой-то контейнер или слот "молчит" дольше положенного (или находит контейнер-зомби, который есть в Docker, но не зарегистрирован в Redis), он отправляет команду на перезапуск в очередь менеджера.
Это замкнутый цикл, который обеспечивает удивительную живучесть при простоте реализации.
Умные слоты: Внутри одного контейнера можно запустить несколько слотов-воркеров (настраивается через MAX_SLOTS_PER_CONTAINER). Менеджер распределяет задачи по слотам оптимальным образом.
Автомасштабирование: Как только все слоты во всех контейнерах заняты, менеджер автоматически поднимает новый Docker-контейнер.
Автовосстановление (Self-healing): Монитор перезапускает упавшие слоты или целые контейнеры без вашего участия.
Graceful Shutdown: Воркеры умеют корректно завершаться, отписываясь от менеджера, чтобы тот не ждал ответа от мертвого слота.
Мониторинг (HeadBear): Встроенная легкая система метрик. Можно смотреть, какие слоты запущены, как давно они активны.
Конфигурация без YAML: Всё хранится либо в переменных окружения, либо в Redis. Запустил контейнер — он уже знает свою конфигурацию.
Давайте сразу к делу. Попробовать 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-контейнер, а воркер внутри него начнет выполнять задачу. Всё работает!
Мы протестировали RedTailFox на реальных задачах и подтверждаем: на одном среднем сервере можно запустить более 1000 изолированных воркеров. Это открывает широкий спектр применений:
SaaS-платформы: Каждому клиенту — свой изолированный воркер для обработки его данных, интеграций или отчетов.
Парсинг и мониторинг: Сотни парсеров для разных сайтов или API, каждый со своими аккаунтами и прокси.
Торговые боты: Запуск множества стратегий для разных инструментов или счетов.
Фоновые джобы: Любые фоновые задачи, требующие строгой изоляции друг от друга.
RedTailFox — это не замена Kubernetes. Это инструмент для своей, четко очерченной задачи: простая и надежная оркестрация контейнеризированных воркеров на одном сервере.
Проект молодой (первый релиз — буквально вчера!), и мы активно развиваем его. В ближайших планах:
Интеграция с Prometheus для сбора метрик.
Поддержка нескольких нод (кластеризация).
Больше тестов и примеров на разных языках.
Мы ищем единомышленников! Если у вас есть идеи по улучшению, или вы хотите помочь с интеграционными тестами, документацией или новым функционалом — заходите к нам на GitHub, создавайте Issue или пишите в Telegram.
Ссылки:
GitHub [6]
Telegram: @rtf_labs
Сделано с 🦊 и любовью к Python для инженеров, которые ценят своё время.
Автор: Dark_bear
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/445300
Ссылки в тексте:
[1] manager.py: http://manager.py
[2] мозг: http://www.braintools.ru
[3] utils.py: http://utils.py
[4] worker.py: http://worker.py
[5] monitor.py: http://monitor.py
[6] GitHub: https://github.com/Dark-F0X/RedTailFox
[7] Источник: https://habr.com/ru/articles/1002060/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1002060
Нажмите здесь для печати.