Необходимо реализовать систему выполнения задач в виде HTTP сервиса. Сервис защищен авторизацией, значит каждый пользователь системы видит и управляет только своими задачами.
Есть несколько долгих (по времени выполнения) функций. Хочется иметь сервис, который будет предоставлять возможность вызова этих функций с предоставлением мета информации о статусе выполнения функции.
Типичный сценарий:
- пользователь через API просит вычислить определенную функцию с заданными параметрами (= появляется зарегистрированная задача в системе со статусом
PENDING) - как только появляется свободный исполнитель - он берет задачу в работу (= фактически начинает выполнение функции, статус
IN_PROGRESS) - по завершении функции:
- если не было ошибок: статус задачи устанавливается в значение
COMPLETED+ запоминается ответ функции - если были ошибки: статус задачи устанавливается в значение
FAILED+ запоминается ошибка
- если не было ошибок: статус задачи устанавливается в значение
Все представленные ниже эндпоинты имеют ознакомительный характер и могут быть кастомизированы и переработаны на свой вкус.
- Сервис должен отдавать список всех задач в системе (с возможностью фильтрации по имени задачи):
GET /tasks?name=some-name
Content-Type: application/json
Authorization: Token some-tokenОтветом является список с элементами вида:
[
{
"uuid": "...",
"name": "...",
"created_at": "..."
},
...
]- Сервис должен принимать запрос на создание задачи вида:
POST /tasks
Content-Type: application/json
Authorization: Token some-token
{
"name": "some_task_name",
"params": {
"param1": "some param",
"param2": "some param",
},
"options": {
"retry": 2,
"delay": 3000
}
}options - настройки задачи - количество перезапусков и время между перезапусками, этих двух настроек будет достаточно.
- Сервис должен отдавать информацию по
idзадачи:
GET /tasks/<uuid>
Content-Type: application/json
Authorization: Token some-tokenНеобходимо возвращать статус выполнения задачи (PENDING, IN_PROGRESS, COMPLETED, FAILED, RETRY_PENDING, CANCELLED), время создания задачи.
Для каждого статуса должна возвращаться соответствующая дополнительная информация:
PENDING- ничегоIN_PROGRESS- ничегоCOMPLETED- результат выполнения задачи + время завершенияFAILED- список ошибок, которые случались во время выполнения здачи. Список, потому что могли быть перезапуски и хочется видеть историю ошибок. + время завершенияRETRY_PENDING- тоже самое, что и приFAILEDCANCELLED- время отмены
- Сервис должен позволять отменять задачи:
DELETE /tasks/<uuid>
Content-Type: application/json
Authorization: Token some-tokenили
POST /tasks/<uuid>/cancel
Content-Type: application/json
Authorization: Token some-tokenСами задачи могут простыми заглушками - sleep на несколько секунд или минут. Интересует реализация именно системы постановки и мониторинга выполнения задач.
Дополниельно: будет здорово, если будет какая-то админ-панель, где администратор сможет зайти и просмотреть задачи от всех пользователей + сможет управлять задачами (например, отменить).
Язык выполнения: python. Других ограничений по фреймворкам/библиотекам/инструментам нет. Если есть на примете готовое решение, которое покрывает весь требуемый функционал, его также можно использовать (тогда задача по сути сводится к настройке).