Modularna architektura

Czytelne granice od interfejsu do wykonania

Pięć publicznych komponentów v0.1.0 rozdziela interfejs, trwały stan, izolowane wykonanie, ocenę zewnętrzną i produkcyjne wdrożenie na wymienne części.

Modularna architektura

Server koordynuje, Runnery oceniają

Client komunikuje się z centralnym Serverem. Runnery inicjują połączenia wychodzące, pobierają zgodną pracę i odsyłają wyniki. Server przechowuje i koordynuje przepływ, ale nigdy nie kompiluje ani nie wykonuje przesłanego kodu.

Client v0.1.0

Interfejs React dla uczestników i managerów, renderery oraz prezentacja wyników na żywo.

Server v0.1.0

API i trwały stan aktywności, zadań, uprawnień, zgłoszeń, zleceń oraz wyników.

Runner v0.1.0

Worker w Rust, który kompiluje, izoluje i ocenia obsługiwane typy zadań.

External-Runner v0.1.0

Worker przekazujący rozwiązanie do zewnętrznego systemu i raportujący jego werdykt.

Ops v0.1.0

Produkcyjny stos Compose i skrypty do utrzymywania instalacji self-hosted.

01

Droga zgłoszenia

Każdy komponent odpowiada za osobny fragment przepływu.

  • Client przesyła kod źródłowy i metadane
  • Server zapisuje zgłoszenie i tworzy pracę
  • Zgodny Runner pobiera zlecenie
  • Wynik wraca do Servera i widoków Clienta na żywo
02

Wykonanie pozostaje odseparowane

Centralna aplikacja i środowisko oceniające są celowo rozdzielone.

  • Server nigdy nie wykonuje przesłanego kodu
  • Runner inicjuje połączenie i może działać za NAT-em
  • Izolacja i limity należą do Runnera
  • External-Runner nie wykonuje przesłanego kodu lokalnie
03

Typy zadań pozostają rozszerzalne

Stabilne identyfikatory typów pozwalają rozwijać obrzeża systemu bez osadzania semantyki zadań w Serverze.

  • Wydany Runner obsługuje standard-io@1
  • Wydany Runner obsługuje output-only@1
  • Handlery i renderery Clienta interpretują dane właściwe dla typu
  • External-Runner integruje się obecnie z UVa Online Judge