Skip to content

Latest commit

 

History

History
65 lines (54 loc) · 5.02 KB

File metadata and controls

65 lines (54 loc) · 5.02 KB

tasks-queue

Динамическая очередь асинхронных задач.

Продуктовая постановка:

Сейчас запрос к ИИ всегда идет по одному сценарию и отрабатывает неточно, нужно чтобы в рамках одного запроса мы:

  • парсили промпт от пользователя
  • определяли, насколько понятен запрос
  • если не понятен - задавали уточняющие вопросы
  • если запрос очень простой - сразу обрабатывли его без лишних запросов к ИИ
  • иначе подгружали проект для контекста и обрабатывали запрос
  • в итоге возвщали пользователю результат в виде фронтенд экшенов

После некоторых обсуждений решили, что будем использовать очередь задач для такого процесса.

Требования к очереди:

  • Задачи выполняются последовательно
  • Каждая задача может быть асинхронной
  • Задачи могут добавлять новые задачи в очередь во время выполнения
  • Поддерживается таймаут выполнения
  • Задачи должны логироваться

Требования к коду:

Главное требование - простота кода и его расширяемость. Основной кейс для расширения - добавление новых типов задач, и новые зависимости между ними. Также важно, чтобы была возможность легко тестировать отдельные задачи и их взаимодействия. Очень важно не переусложнить решение и реализовать его максимально быстро с учетом требований.

При оценке:

Возможные ошибки при реализации:

  • Неявное управление зависимостями между задачами
  • Сложная реализация очереди
  • Использование готовых решений для очереди
  • Отсутствие четкой декомпозиции и разделения ответственностей в коде
  • Логирование, которое не позволяет воспроизвести процесс
  • Много кастов типизации
  • Сложная иерархия классов
  • Много условий в коде
  • Ограничения в функционале задач

Должно легко:

  • Миграция текущей обработки запроса (обычный асинхронный обработчик)
  • Реализовать диалог 2х LLM
  • Циклические зависимости между задачами
  • Параллельная работа нескольких разработчиков над задачами
  • Описание текущих задач и зависимостей без кода

Решение в этом репозитории:

  1. Для простоты и очередь будет реализована на основе простого js массива.
  2. Каждый запрос на сервис - создание очереди c одной задачей, которая запускает процесс.
  3. Очередь отвечает за итерацию по таскам.
  4. Метод обрабатывающий запрос - использует очередь(создание и добавление), обрабатывает результат тасок
  5. Зависимости между задачами односторонние - задача создает другую задачу
  6. Обработка конкретного запроса - полностью в рамках одной задачи
  7. Ветвления, циклы - реализуются с помощью создания новых задач

Порядок работы оценки:

  1. Реализация очереди, вспомогательных классов AbstractTask и RootTask (не больше пары дней)
  2. Добавление логирования (пара дней с настройкой бд)
  3. Создание таски для текущей реализации (создать таску -> вставить текущий код)
  4. По требования к новому процессу описать список тасок
  5. Оценить реализацию каждой таски (не должно быть оценок больше дня, иначе декомпозируем задачу)