Сервис распределенного выполнения задач.
Сервис получает сообщения из Kafka-топика в виде JSON:
{
"name": "task_name",
"duration": 5000
}где:
name- уникальное имя задачи (выполняет роль ключа идемпотентности);duration- условное время выполнения задачи в мс;
Объект Dto десериализуется в Task-объект и валидируется по правилам:
- имя задачи не может быть пустым;
- время выполнения задача должно быть > 0 и < 10 секунд;
Задача сохраняется в БД со статусом NEW.
Возможные статусы:
NEW- новая созданная задача;PROCESSING- задача обрабатывается одним из worker-ов;DONE- задача успешно обработана;
Приложение запускает TaskPoller-thread, который пробует получить из БД готовую к выполнению задачу.
Poller получает NEW / PROCESSING задачу с сортировкой по created_at.
В случае успеха, задача добавляется в синхронную очередь для ThreadPool, где её обрабатывает один из свободных worker-ов.
Статус задачи меняется на PROCESSING.
Если по какой-то причине задача зависнет в этом статусе, poller сможет её подобрать через 10 секунд (принятое максимальное время выполнения задачи).
Dummy-worker вызывает Thread.sleep и обновляет статус задачи в DONE.
Статус задачи можно получить через REST-интерфейс:
http://localhost:8080/rest/tasks/{taskName}
Ввиду временных ограничений, не получилось полностью автоматизировать настройку всех зависимостей.
- Docker compose
docker compose upБудут подняты контейнеры: Kafka, Kafka-UI и PostgreSQL.
- Для Kafka внести измененениия в файл /etc/hosts
Необходимо добавить в /etc/hosts:
kafka 127.0.0.1
- Создание топика Kafka
Через Kafka UI создать топик tasks (partitions=1, replicationFactor=1).
- Запустить приложение
- Автоматическое создание Kafka топика.
- Отправка невалидных сообщений из Kafka в DLQ (dead letter queue) для последующего ручного разбора.