- Frontend - взаимодействие с пользователем через браузер.
- Duely - управление пользователями, группами и дуэлями.
- Taski - хранение задач и управление проверкой решений.
- Exesh - тестирование задач и выполнение кода.
- FileStorage - взаимодействие с файловой системой.
Frontendимеет web-socket соединение сDuelyчерез nginx и отправляет сообщение с запросом на тестирование решения задачи (1), а далее ожидает сообщения с изменением статуса тестирования в web-socket соединениеDuelyделает http запрос вTaskiна тестирование решения задачи (2) и при успешном ответе (3) далее ожидает сообщения с изменением статуса тестирования вkafkaиз топикаtestingTaskiделает http запрос вExeshна запуск команд тестирования решения задачи (4) и при успешном ответе (5) далее ожидает сообщения с результатами выполнения команд вkafkaиз топикаexecutionExeshпри запуске команд отправляет сообщение о начале выполнения команд в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
Frontendимеет web-socket соединение сDuelyчерез nginx и отправляет сообщение с запросом на тестирование решения задачи (1), а далее ожидает сообщения с изменением статуса тестирования в web-socket соединениеDuelyотправляет http запрос вExeshна запуск команд выполнения кода (2) и при успешном ответе (3) далее ожидает сообщения с результатами выполнения команд вkafkaиз топикаexecutionExeshпри запуске команд отправляет сообщение о начале выполнения команд в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) Выполнение окончено

