Skip to content

Instantly share code, notes, and snippets.

@artrey
Last active April 23, 2023 19:48
Show Gist options
  • Save artrey/f7e68fbca4ba36cd902896145d0b34f1 to your computer and use it in GitHub Desktop.
Save artrey/f7e68fbca4ba36cd902896145d0b34f1 to your computer and use it in GitHub Desktop.

Тестовое задание

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment