Skip to content

Latest commit

 

History

History
136 lines (104 loc) · 10.1 KB

File metadata and controls

136 lines (104 loc) · 10.1 KB

Техническая реализация

Архитектура

https://unidraw.io/app/board/a23e3010995136d9ae5f?xyz=109%2C275%2C0.68

Компоненты

  1. Frontend - взаимодействие с пользователем через браузер.
  2. Duely - управление пользователями, группами и дуэлями.
  3. Taski - хранение задач и управление проверкой решений.
  4. Exesh - тестирование задач и выполнение кода.
  5. FileStorage - взаимодействие с файловой системой.

Third-party компоненты

  1. Nginx
  2. PostgreSQL
  3. Kafka

Процессы

Тестирование решения задачи

  • Frontend имеет web-socket соединение с Duely через nginx и отправляет сообщение с запросом на тестирование решения задачи (1), а далее ожидает сообщения с изменением статуса тестирования в web-socket соединение
  • Duely делает http запрос в Taski на тестирование решения задачи (2) и при успешном ответе (3) далее ожидает сообщения с изменением статуса тестирования в kafka из топика testing
  • Taski делает http запрос в Exesh на запуск команд тестирования решения задачи (4) и при успешном ответе (5) далее ожидает сообщения с результатами выполнения команд в kafka из топика execution
  • Exesh при запуске команд отправляет сообщение о начале выполнения команд в kafka в топик execution (6)
  • Taski при получении сообщения о начале выполнения команд (7) отправляет сообщение о начале тестирования в kafka в топик testing (8)
  • Duely при получении сообщения о начале тестирования (9) отправляет сообщение о начале тестирования в web-socket соединение с Frontend (10)
  • Exesh при выполнении каждой команды (11) отправляет событие о выполнении команды в kafka в топик execution (12)
  • Taski при получении сообщения о выполнении команды (13) отправляет сообщение об изменении статуса тестирования в kafka в топик testing (15), если нужно оповестить Duely об этом (14)
  • Duely при получении сообщения об изменении статуса тестирования отправляет сообщение об изменении статуса тестирования в web-socket соединение с Frontend (16)
  • Taski после получения каждого сообщения о выполнении команд (13) определяет вердикт тестирования (18), если его можно определить (19), и отправляет его в kafka в топик testing (20)
  • Exesh при окончании выполнения команд отправляет сообщение о завершении выполнения команд в kafka в топик execution (23)
  • Taski при получении сообщения об окончании выполнения команд (24) определяет вердикт тестирования (25), если он не был определен ранее (26), и отправляет его в kafka в топик testing (27)
  • Duely при получении сообщения с вердиктом (21, 28) тестирования отправляет его в web-socket соединение с Frontend (22, 29)
sequenceDiagram
    participant Frontend
    participant Duely
    participant kafka [testing]
    participant Taski
    participant kafka [execution]
    participant Exesh

    Frontend->>Duely: (1) Протестировать решение задачи

    Duely->>Taski: (2) Протестировать решение задачи
    Taski-->>Duely: (3) Ок

    Taski->>Exesh: (4) Запустить команды тестирования
    Exesh-->>Taski: (5) Ок

    Exesh->>kafka [execution]: (6) Выполнение началось
    kafka [execution]-->>Taski: (7) Выполнение началось

    Taski->>kafka [testing]: (8) Тестирование началось
    kafka [testing]-->>Duely: (9) Тестирование началось
    Duely-->>Frontend: (10) Тестирование началось

    loop Выполнение команд тестирования задачи
        Exesh->>Exesh: (11) Выполнение одной команды
        Exesh->>kafka [execution]: (12) Одна команда выполнена
        kafka [execution]-->>Taski: (13) Одна команда выполнена

        opt (14) Нужно оповестить Duely об изменении статуса тестирования
        Taski->>kafka [testing]: (15) Изменение статуса тестирования
        kafka [testing]-->>Duely: (16) Изменение статуса тестирования
        Duely-->>Frontend: (17) Изменение статуса тестирования
        end

        Taski->>Taski: (18) Определение вердикта, если он возможно

        opt (19) Определен вердикт тестирования
        Taski->>kafka [testing]: (20) Вердикт тестирования
        kafka [testing]-->>Duely: (21) Вердикт тестирования
        Duely-->>Frontend: (22) Вердикт тестирования
        end
    end

    Exesh->>kafka [execution]: (23) Выполнение окончено
    kafka [execution]-->>Taski: (24) Выполнение окончено

    Taski->>Taski: (25) Определение вердикта

    opt (26) Если вердикт не был определён ранее
    Taski->>kafka [testing]: (27) Вердикт тестирования
    kafka [testing]-->>Duely: (28) Вердикт тестирования
    Duely-->>Frontend: (29) Вердикт тестирования
    end
Loading

Выполнить код на входных данных

  • Frontend имеет web-socket соединение с Duely через nginx и отправляет сообщение с запросом на тестирование решения задачи (1), а далее ожидает сообщения с изменением статуса тестирования в web-socket соединение
  • Duely отправляет http запрос в Exesh на запуск команд выполнения кода (2) и при успешном ответе (3) далее ожидает сообщения с результатами выполнения команд в kafka из топика execution
  • Exesh при запуске команд отправляет сообщение о начале выполнения команд в kafka в топик execution (4)
  • Duely при получении сообщения о начале выполнения команд (5) отправляет сообщение о начале тестирования в web-socket соединение с Frontend (6)
  • Exesh при выполнении каждой команды (7) отправляет событие о выполнении команды в kafka в топик execution (8)
  • Duely при получении сообщения о выполнении команды (9) отправляет сообщение об изменении статуса выполнения кода в web-socket соединение с Frontend (10)
  • Exesh при окончании выполнения команд отправляет сообщение о завершении выполнения команд в kafka в топик execution (11)
  • Duely при получении сообщения об окончании выполнения команд (12) отправляет в web-socket соединение с Frontend сообщение об окончании выполнения кода (13)
sequenceDiagram
    participant Frontend
    participant Duely
    participant kafka [execution]
    participant Exesh

    Frontend->>Duely: (1) Выполнить код на входных данных

    Duely->>Exesh: (2) Запустить список команд выполнения кода
    Exesh-->>Duely: (3) Ок

    Exesh->>kafka [execution]: (4) Выполнение началось
    kafka [execution]-->>Duely: (5) Выполнение началось
    Duely-->>Frontend: (6) Выполнение началось

    loop Выполнение команд
        Exesh->>Exesh: (7) Выполнение одной команды
        Exesh->>kafka [execution]: (8) Одна команда выполнена
        kafka [execution]-->>Duely: (9) Одна команда выполнена
        Duely-->>Frontend: (10) Изменение статуса выполнения кода
    end

    Exesh->>kafka [execution]: (11) Выполнение окончено
    kafka [execution]-->>Duely: (12) Выполнение окончено
    Duely-->>Frontend: (13) Выполнение окончено
Loading

Деплоймент