Środowisko wykonawcze
Po sprawdzeniu projektu i zbudowaniu artefaktów zadania muszą zostać uruchomione w konkretnym środowisku. Warstwa wykonawcza odpowiada za to, jak działają zadania, jak przekazują dane i jak reagują na zakończenie pracy lub błąd. Junexis rozwija biblioteki wykonawcze oraz kontrakty tych zachowań.
Wspólne znaczenie, różne implementacje
Nie ma dziś jednej, w pełni ujednoliconej implementacji obsługującej wszystkie środowiska Junexis. Biblioteki .NET, implementacje dla urządzeń w C i Rust oraz kod pomocniczy generowany dla Go, TypeScript i C++ mają różny zakres. Obecność funkcji w jednej implementacji nie oznacza jej dostępności we wszystkich pozostałych.
Od plików do działającego systemu
| Etap | Za co odpowiada |
|---|---|
| Kompilator Junexis | sprawdza opis i generuje kod oraz manifesty dla obsługiwanych środowisk |
| Narzędzia środowiska docelowego | budują i przygotowują wygenerowany kod do wykonania |
| Warstwa wykonawcza | realizuje obsługiwane zachowania zadań i komunikacji podczas pracy |
| Uruchomienie i wdrożenie | ustalają, gdzie i z jaką konfiguracją działają procesy lub urządzenia |
| Obserwacja | dostarcza sygnały pozwalające sprawdzić stan i przebieg wykonania |
Zainstalowanie .NET na serwerze nie uruchamia automatycznie każdego projektu Junexis. Potrzebne zależności wynikają z wybranej ścieżki i przygotowanej paczki. Przykładowo wygenerowany serwer Go korzysta z właściwego mu kodu wykonawczego; nie należy utożsamiać go z biblioteką zadań .NET.
Przykład: pomiary temperatury
Podczas działania systemu źródło dostarcza pomiary, odbiorca je przetwarza, a interfejs pokazuje wynik. Trzeba ustalić również, co dzieje się, gdy:
- źródło produkuje dane szybciej, niż odbiorca je przetwarza,
- pomiar nie nadchodzi w oczekiwanym czasie,
- jedno z zadań kończy się błędem,
- połączenie zostaje przerwane albo system jest zatrzymywany.
To pytania o zachowanie działającego systemu. Odpowiedzi zależą od użytych prymitywów, konfiguracji oraz implementacji wybranego środowiska. Sam poprawny diagram połączeń nie potwierdza odporności na te sytuacje.
Rola w platformie
flowchart LR
MODEL["Semantyka programu"] --> DOTNET["Wykonanie .NET"]
MODEL --> C["Wykonanie embedded C"]
MODEL --> RUST["Wykonanie embedded Rust"]
DOTNET --> SIGNALS["Logi, stan gotowości i zdarzenia"]
C --> SIGNALS
RUST --> SIGNALS
SIGNALS --> OBS["Observability i Narrative"]
Zakres rozwijanych implementacji
- środowisko wykonawcze .NET dla zadań i podstawowych prymitywów komunikacyjnych,
- kanały, kolejki i strumienie o odrębnej semantyce,
- mechanizmy timeout, retry, circuit breaker i supervision,
- telemetria, metryki oraz integracja z warstwą obserwacji,
- testy współbieżności, benchmarki i profilowanie,
- aktywne implementacje dla urządzeń wbudowanych w C i Rust,
- testy zgodności zachowania z wygenerowanym kodem.
Powyższa lista opisuje różne części komponentu, a nie wspólny zestaw gwarancji każdego środowiska. Test biblioteki, budowanie wygenerowanego kodu i próba na rzeczywistym urządzeniu są osobnymi dowodami. Samo istnienie implementacji nie potwierdza gotowości produkcyjnej całego systemu.
Szybkie sprawdzenie
Polecenie pokazuje informacje udostępniane przez zainstalowane CLI o prymitywach wykonania. Nie uruchamia całej aplikacji i nie sprawdza automatycznie jej sieci, urządzeń ani kompletności wdrożenia.
Testy projektu środowiska wykonawczego należą do dokumentacji deweloperskiej; użytkownik sprawdza kontrakt przez publiczne CLI.
Kontrakty komunikacji
chan<T>, queue<T> i stream<T> określają różne sposoby przekazywania
typowanych danych. Nie należy traktować ich jako zamiennych nazw tego samego
połączenia. Szczegóły buforowania, odbioru, potwierdzeń i utraty danych trzeba
sprawdzić dla konkretnej implementacji oraz konfiguracji.
flowchart TB
TASK["Zadanie"] --> CHAN["chan<T><br/>kontrolowany przepływ"]
TASK --> QUEUE["queue<T><br/>obsługa wiadomości"]
TASK --> STREAM["stream<T><br/>najnowsza obserwacja"]
CHAN --> NEXT["Kolejne zadanie"]
QUEUE --> WORKERS["Konsumenci"]
STREAM --> WATCHERS["Obserwatorzy"]
Granice
Zakres prymitywów różni się pomiędzy środowiskiem .NET, wygenerowanym Go, TypeScript i implementacjami dla urządzeń wbudowanych. Osobna, uniwersalna warstwa transportów zdalnych nie jest jeszcze gotowym produktem.
Ponowienie operacji nie gwarantuje, że jej skutek wystąpi tylko raz. Zatrzymanie zadania nie oznacza automatycznie zachowania jego stanu po restarcie. Trwałość, dopuszczalne straty danych i sposób odzyskiwania trzeba określić oraz sprawdzić w konkretnym systemie.
Zobacz jak działa Junexis, stan platformy oraz macierz języka i wykonania.