Данная краткая статья является больше лайф-хаком или же заметкой в мире IT.
Я постарался сделать cTRL сервис простым и легконастраиваемым.
Параллельно занимаясь разработкой интересного сервера хранения данных, встала задача сделать параллельный исполнитель отложенных задач с ограничением потоков по типам задач, в частности для конвертации видео роликов посредством ffmpeg.
Поняв, что наши программисты на PHP не смогут нормально сделать параллельную очередь, притом continuos очередь, чтобы видео карты не простаивали на серверах, тогда я приступил к разработке на Go и сделал буквально за неделю готовый сервис по приему задач (команд) через HTTP-протокол и их выполнения в параллельном, и не только, режиме с различными опциями.
Сервис в своем роде универсален и подходит для любых типов заданий и выполнения любых команд, поддерживает определение ошибок, повторение задач согласно условиям ошибок, завершение задач при удалении из рабочей очереди.
Сервис содержит три очереди: received, working, completed. Из всех очередей можно удалить любые задания по ключу, типу или полностью очистить очередь. Для каждого виртуального хоста поддерживается своя таблица с данными очередями.
После завершения задач можно получать информацию о завершенных заданиях, получать stdout/stderr, время выполнения и другую информацию.
На каждой машине ставится пакет и запускается данный сервер. Задания вы ставите самостоятельно в каждый сервер из своего приложения по своему алгоритму. Например я поставил его на нескольких серверах с nvidia карточками и отдал разработчикам, они уже ставят задачи в очередь через него, а ctrl ограничивает потоки в соответствии с указанными правилами, и так же повторяет задания без выдачи ошибки, например в случае CUDA_ERROR_OUT_OF_MEMORY.
Очередь более менее постоянная, то есть допустим ограничение для типа задачи установлено в 8 процессов, 8-ой закончился, осталось 7, из очереди ожидания практически сразу свободное место занял следующий процесс данного типа.
Ограничение процессов может регулироваться как жестко через настройки виртуального хоста, так и мягко если клиент сам переназначает от себя ограничение для конкретного типа задач.
Так же доступно указание интервала между запусками определенных типов задач.
Что умеет:
- Многопоточность
- Поддержка HTTPS и Auth/IP авторизации
- Поддерживаемые HTTP-методы: GET, POST
- Прием задач в очередь для отложенного параллельного исполнения команд
- Параллельное исполнение задач в реальном времени
- Ограничение максимального количества потоков на каждый виртуальный хост
- Поддерживает непрерывную очередь исполнения задач
- Автоматическое одновременное исполнение только одной одинаковой задачи
- Поддерживаемые интерпретаторы: /bin/bash, /bin/sh
- Поддерживаемые форматы: JSON
Может быть кому-то пригодится такой простой сервер в такое непростое время для облегчения выполнения рутинных задач.
Полная документация есть здесь: github.com/eltaline/ctrl
Проект лицензирован под Apache 2.0 лицензией.
Mixalych
Статью можно ужать просто до предпоследнего абзаца (аля твитнуть):
Сухая статья — чтобы понять о чем она, нужно ходить по ссылкам. Тогда смысл статьи какой?
sysadmlinux Автор
Да я не часто пишу статьи на хабре, это 3-я, вообще я указал вначале что это больше заметка. Ну хоть какое-то описание надо было сделать наверное для экзекьютора задач. Так то да можно и сразу в документацию отправить.