Przejdź do treści

Middleware FAQ

Jakie są rodzaje middleware'u?

Middleware to hostowane zachowanie rozszerzające, opisane jawnymi kontraktami. Główne typy wykonania to Rust w procesie, czysty JSON-e, JSON-e Flow, command/stdio, niezarządzany lokalny HTTP JSON, nadzorowany channel_json, konektory Sensorium oraz middleware-hosted adaptery runtime Inquirium. Stary nadzorowany executor http_local_json jest wycofany: jego formy konfiguracji i paczek są odrzucane, a implementacja runtime już nie istnieje. Dystrybucja jest osobną osią: middleware może być dostarczone fabrycznie, przez profil albo jako paczka instalowana przez operatora niezależnie od typu wykonania.

Szczegółowe opisy typów, kształty rejestracji i przykłady są w Middleware HOWTO. Granica pomiędzy czystym interpreterem a krokami przepływu należącymi do hosta jest opisana w FAQ JSON-e i JSON-e Flows.

Kiedy moduł powinien używać channel_json?

Użyj channel_json dla kwalifikującego się nadzorowanego modułu, którego listener loopback istnieje wyłącznie po to, aby host Node'a mógł wykonać attach, invoke, observation albo wystawić powierzchnię operatorską przez własny most. Moduł inicjuje uwierzytelnioną sesję do wspólnego listenera daemona; sesja nie nadaje trwałej władzy ani nie jest kolejką replay.

Zachowaj jawny listener produktowy, peerowy, przeglądarkowy lub providerowy, jeśli jest częścią kontraktu komponentu. Moduł mieszany migruje tylko host-control plane. Nie rejestruj tej samej semantycznej route'y w obu transportach jako niejawnego fallbacku. Nowe nadzorowane moduły i paczki muszą używać channel_json; zachowany listener produktowy HTTP jest osobną powierzchnią domenową, a nie executorem middleware.

Wszystkie 18 modułów fabrycznych używa channel_json; moduł host-only nie ma portu fabrycznego. Osiem modułów zachowuje listenery produktowe z osobnym właścicielem. Konfiguracje daemona, utrwalone ustawienia, luźne artefakty konfiguracyjne i manifesty paczek nazywające http_local_json są odrzucane przed efektami z jawną diagnostyką migracyjną; Node nigdy nie przekształca ich po cichu.

Moduły Pythonowe powinny używać wspólnego adaptera zamiast implementować framing WebSocket. Zobacz Tworzenie middleware channel_json.

Dla Inquirium katalog model-runtime może wybrać channel_json, podając identyfikator modułu, zadeklarowaną ścieżkę invoke i timeout. Zmienia to wyłącznie transport: runtime/ref, model binding, polityka i walidacja odpowiedzi pozostają własnością hosta.

Co się dzieje, gdy znika wymagany middleware?

Node nie kieruje dalej wywołań do konsumenta, którego wymagany provider zniknął. Rozwiązuje dokładne zależności capability-digest kontraktu, usuwa dotkniętych konsumentów z routingu, wygasza i zatrzymuje ich w kolejności od zależnych do providerów oraz raportuje dependency_unavailable. Dedykowana pętla rekoncyliacji wznawia konsumentów w kolejności od providerów dopiero po zaobserwowaniu gotowości dokładnie tych samych wymagań; odczyt health/status nigdy nie uruchamia ani nie zatrzymuje komponentu. Provider o tej samej nazwie, lecz niezgodnym kontrakcie albo niespełnionym pinie nie oznacza odzyskania.

Przy przejściowej utracie kanału supervisor wstrzykuje dziecku ograniczony czas reconnect grace. Bieżące profile generowane używają 1 sekundy; samodzielny runtime Python bez tej zmiennej próbuje przez 0 sekund. Wyczerpanie grace albo nieudany application heartbeat kończy i uprząta proces przed zastosowaniem skonfigurowanej polityki restartu. Żadne żądanie in-flight nie jest replayowane po cichu.

To przejście cyklu życia uprząta typowane zasoby lokalne hosta. Efekty trwałe, zewnętrzne i federacyjne zachowują własną semantykę transakcji, dziennika, kompensacji, zastąpienia lub zatwierdzania. Zatrzymanie procesu nigdy nie jest przedstawiane jako cofnięcie takiego efektu. Zobacz Deklarowanie zależności komponentów i odzyskiwania po efektach.

Czym jest Role Middleware?

Role Middleware nie jest typem wykonania. To wzorzec specjalizacji: komponent middleware przyjmuje request ukształtowany rolą i rozdziela go do zachowania wybranego po roli, capability albo tożsamości usługi. Może być zaimplementowany jako nadzorowany channel JSON, JSON-e Flow albo inna zarejestrowana forma middleware.

Konkretne przykłady dla nadzorowanego channel JSON i JSON-e Flow są w sekcji Role Middleware w Middleware HOWTO.

Gdzie middleware może wpinać się w ścieżkę danych node'a?

Obecne peer-message chains to pre-input, inbound-peer, pre-send oraz obserwatory post-chain. Inne powierzchnie middleware obejmują zgłoszone lokalne route'y, role/service dispatch, mosty host capability, obsługę broadcast, powierzchnie operatorskiego UI oraz read-only hooki observer/audit. Kluczowa zasada: każde podpięcie ma własny kontrakt requestu i własny zestaw dozwolonych decyzji; nie ma jednego uniwersalnego kontraktu interceptora.

Pełna mapa hooków, decyzji, przykładów i kompatybilności jest w Middleware hook HOWTO.

Jak jeden nadzorowany middleware rozróżnia wywołania z wielu hooków?

Nadzorowany middleware channel może używać jednej zadeklarowanej ścieżki invoke dla wielu rejestracji, ale ścieżka nie jest semantycznym rozróżnikiem. Middleware powinien sprawdzać kopertę requestu, zwłaszcza chain_kind, envelope_kind i schema-specific kształt payloadu. Oddzielne ścieżki są często czytelniejsze operacyjnie, lecz nawet wtedy źródłem prawdy pozostaje koperta.

Przykłady requestów i szkice rozgałęziania są w sekcji multiple-hook dispatch w Middleware HOWTO.

Gdzie opisane są zasady dystrybucji i paczkowania?

Typ wykonania i model dystrybucji są osobne. To samo zachowanie middleware może być skompilowane w node, dostarczone jako definicja profilu albo zainstalowane jako paczka operatora. Dystrybucja zmienia postawę zaufania i lifecycle, ale sama nie zmienia kontraktu runtime.

Referencja modeli dystrybucji jest w sekcji Modele dystrybucji w Middleware HOWTO.