Skip to content

exception-e/taskSevice

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TaskService

Сервис распределенного выполнения задач.

Принцип работы

Получение задачи

Сервис получает сообщения из Kafka-топика в виде JSON:

{
  "name": "task_name",
  "duration": 5000
}

где:

  • name - уникальное имя задачи (выполняет роль ключа идемпотентности);
  • duration - условное время выполнения задачи в мс;

Объект Dto десериализуется в Task-объект и валидируется по правилам:

  • имя задачи не может быть пустым;
  • время выполнения задача должно быть > 0 и < 10 секунд;

Сохранение в базу данных

Задача сохраняется в БД со статусом NEW. Возможные статусы:

  • NEW - новая созданная задача;
  • PROCESSING - задача обрабатывается одним из worker-ов;
  • DONE - задача успешно обработана;

Передача задачи в worker pool

Приложение запускает TaskPoller-thread, который пробует получить из БД готовую к выполнению задачу. Poller получает NEW / PROCESSING задачу с сортировкой по created_at. В случае успеха, задача добавляется в синхронную очередь для ThreadPool, где её обрабатывает один из свободных worker-ов.

Статус задачи меняется на PROCESSING. Если по какой-то причине задача зависнет в этом статусе, poller сможет её подобрать через 10 секунд (принятое максимальное время выполнения задачи).

Обработка задачи worker-ом

Dummy-worker вызывает Thread.sleep и обновляет статус задачи в DONE.

Получение статуса асинхронного выполнения задачи

Статус задачи можно получить через REST-интерфейс:

http://localhost:8080/rest/tasks/{taskName}

Как запустить

Ввиду временных ограничений, не получилось полностью автоматизировать настройку всех зависимостей.

  1. Docker compose
docker compose up

Будут подняты контейнеры: Kafka, Kafka-UI и PostgreSQL.

  1. Для Kafka внести измененениия в файл /etc/hosts

Необходимо добавить в /etc/hosts: kafka 127.0.0.1

  1. Создание топика Kafka

Через Kafka UI создать топик tasks (partitions=1, replicationFactor=1).

  1. Запустить приложение

Технологии

TODO

  1. Автоматическое создание Kafka топика.
  2. Отправка невалидных сообщений из Kafka в DLQ (dead letter queue) для последующего ручного разбора.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors