Распределенный планировщик
подробнее см. sourcedcode Распределенный планировщик
Это приложение может быть запущено на разных хостах и предлагает
планировать выполнение произвольной команды в определенное время или периодически.
Существует два способа связи с приложением: gRPC и REST. Дистанционный пульт
интерфейсы
указано в dsched.proto
файле
Соответствующий REST API также может быть найден там в виде API
аннотаций. Мы также предоставляем сгенерированные файлы Swagger.
Чтобы указать время выполнения задачи, мы используем нотацию, принятую cron.
Запланированные задания сохраняются в файле и автоматически загружаются при запуске.
Строительство
Install gRPC
Install gRPC gateway
Для разбора операторов crontab и планирования выполнения задач мы используем библиотеку gopkg.in/robfig/cron.v2.
Так что это должно быть установлено также: go get -u gopkg.in/robfig/cron.v2.
Документация может быть найдена здесь
Получить пакет dsched: иди получить
-u gitlab.com/andreynech/dsched
Теперь можно запустить стандартную команду go build в dscheduler и
каталоги шлюза для генерации двоичных файлов для планировщика и REST/JSON
API
шлюз. Также было бы полезно изучить наши
Файл конфигурации CI, чтобы увидеть, как мы
настроить среду здания.
Running
Все функции планирования реализованы исполняемым файлом dscheduler. Так
он может быть запущен при запуске системы или по требованию. Как описано в dscheduler --help,
Есть два параметра командной строки:
-i string - File name to store task list (default "/var/run/dscheduler.db")
-p string - Endpoint to listen (default ":50051")
Если необходимо предложить REST/JSON
API, приложение шлюза находится в
каталог шлюза должен быть запущен. Он может находиться на том же хосте, что и
dscheduler, но обычно это будет другой хост, который доступен через
HTTP
извне и так же может общаться с запущенным в dscheduler
внутренняя сеть. Эта установка была также причиной разделения планировщика и
шлюз в двух исполняемых файлах. шлюз в основном генерируется приложением и
поддерживает несколько параметров command-line
, описанных при запуске gateway --help.
Важным параметром является строка -sched_endpoint
, которая является конечной точкой планировщика
сервис (по умолчанию "localhost: 50051"). Указывает имя хоста и порт
где dscheduler прослушивает запросы.
Планирование задач (тестирование)
Существует три способа управления сервером планировщика:
Использование клиента Go, реализованного в каталоге cli/
Использование клиента Python, реализованного в каталоге py_cli
Использование REST/JSON
API-шлюза и curl
Клиенты Go и Python имеют одинаковый набор параметров командной строки.
$ ./cli --help
Использование cli:
-a string
The command to execute at time specified by -c parameter
-c string
Statement in crontab format describes when to execute the command
-e string
Host:port to connect (default "localhost:50051")
-l List scheduled tasks
-p Purge all scheduled tasks
-r int
Remove the task with specified id from schedule
-s Schedule task. -c and -a arguments are required in this case
They are using gRPC protocol to talk to scheduler server. Here are several
example invocations:
$ ./cli -l list currently scheduled tasks
$ ./cli -s -c "@every 0h00m10s" -a "df" schedule df command for
execution every 10 seconds
$ ./cli -s -c "0 30 * * * *" -a "ls -l" schedule ls -l command to
run every 30 minutes
$ ./cli -r 3 remove task with ID 3
$ ./cli -p remove all scheduled tasks
Также возможно использовать curl для вызова функциональности dscheduler поверх
REST/JSON
API-шлюз. Предполагая, что dscheduler и шлюз приложений
выполняются, вот некоторые вызовы, чтобы перечислить, добавить и удалить планирование
записи с одного хоста (localhost):
curl 'http://localhost:8080/v1/scheduler/list' list currently scheduled tasks
curl -d '{"id":0, "cron":"@every 0h00m10s", "action":"ls"}' -X POST 'http://localhost:8080/v1/scheduler/add' schedule ls command for execution every 10 seconds
curl -d '{"id":0, "cron":"0 30 * * * *", "action":"ls -l"}' -X POST 'http://localhost:8080/v1/scheduler/add' schedule ls -l to run every 30 minutes
curl -d '{"id":2}' -X POST 'http://localhost:8080/v1/scheduler/remove' remove task with ID 2.
curl -X POST 'http://localhost:8080/v1/scheduler/removeall' remove all scheduled tasks
Все изменения автоматически сохраняются в файле.
Мысли об обнаружении службы планировщика
В больших сценариях развертывания (например, сотни хостов) это может быть
сложная задача выяснить все IP-адреса и порты, где находится планировщик
служба запущена. Было бы довольно легко добавить поддержку Zeroconf
(Bonjour / Avahi) технология для упрощения поиска услуг. Как альтернатива, это
может быть возможно реализовать что-то похожее на службу имен CORBA
где запущенные сервисы регистрируются самостоятельно, а местоположение службы именования
хорошо известно. Мы решили собрать отзывы, прежде чем принять решение о конкретных
внедрение службы обнаружения. Так что ваш вклад очень приветствуется!