Необходимо реализовать систему выполнения задач в виде 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
- тоже самое, что и приFAILED
CANCELLED
- время отмены
- Сервис должен позволять отменять задачи:
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. Других ограничений по фреймворкам/библиотекам/инструментам нет. Если есть на примете готовое решение, которое покрывает весь требуемый функционал, его также можно использовать (тогда задача по сути сводится к настройке).