Общая архитектура:
Внутри проект можно разбить на две АС: конструктор библиотек/заданий/подборок и грейдер.
Конструктор, как черный ящик, предоставляет интерфейс через шлюз авторизации и верификации запросов(gateway). Это единственная точка взаимодействия конструктора с внешним сетевым контуром. Пробросить запрос напрямую к сервисам библиотек или базе данных невозможно, так как они находятся внутри закрытого сетевого контура без доступа в глобальную сеть.
Шлюз предоставляет не только функционал верификации и передачи запросов, но и выполняет задачу авторизации пользователей. Такое решение немного упрощает конструкцию системы в целом.
Для работы с библиотеками, подборками, и заданиями предусмотрены отдельные микросервисы - library-service и task-service, соответственно. Это сделано для разделения задач и возможности использования наиболее подходящих ЯП для каждого сервиса. Кроме того это повышает отказоустойчивость и позволяет сервисам иметь разные релизные циклы.
База данных, в которой хранятся библиотеки и задания, единая. Это сделано для избежания избыточных запросов между микросервисами друг к другу.
Для удобства пользователей мы предоставляем собственный фронтенд конструктора. Но засчет четкого API со стороны шлюза, мы можем предоставить доступ и сторонним клиентам для реализации их собственных интерфейсов(например, мобильного приложения) или интеграции в другие сервисы(например, конструктор грейдеров).
АС грейдер взаимодействует со шлюзом для получения информации о библиотеках и заданиях для предоставления функционала выполнения и автоматической проверки графических заданий.