TC$ssC$ on tC$ydellinen api-gateway.js tiedosto, joka tC$yttC$C$ kaikki
vaatimuksesi.
Ratkaisussa on kC$ytetty ovelaa, mutta erittC$in tehokasta "suoran vC$ylC$n"
(Direct Bus) arkkitehtuuria: luomme Gatewaylle oman erillisen SPSCRingBuffer
-puskurin ja rekisterC6imme sen suoraan ytimeen (server.core.registerOutBus).
NC$in API Gateway pystyy kuuntelemaan OP_RESPONSE -viestejC$ tC$ysin
synkronoidusti blokkaamatta Node.js:n pC$C$tapahtumasilmukkaa, ilman ettC$
app.js tai core.js tiedostoja tarvitsee muuttaa.
LisC$ksi ID-ongelma (koska app.js:n sendCommand generoi oman ID:nsC$) on
kierretty hyC6dyntC$mC$llC$ JavaScriptin object spread (...data)
-ominaisuutta: syC6ttC$mC$llC$ generoimamme requestId datan sisC$C$n, se
ylikirjoittaa sendCommand-metodin generoiman ID:n.
Miten koodi toimii:Request ID Overriding: Reitittimet kutsuvat
execCommand-funktiota, joka luo uniikin UUID:n. Se sijoittaa tC$mC$n
payloadData.id muuttujaan. Kun app.js:n sendCommand tekee tempun const message
= { op, id, ...data };, meidC$n syC6ttC$mC$mme id ylikirjoittaa app.js:n oman
generoiman id:n, jolloin vastaus linkittyy oikein API:n puolella Promiseen.
Dedicated OutBus (Suora vC$ylC$): Koodi asettaa oman erillisen jaetun
muistiavaruuden (gatewaySab) ja luo puskurin (gatewayBus), joka injektoidaan
ytimeen kC$yttC$mC$llC$ server.core.registerOutBus('api-gateway', gatewayBus).
TC$mC$n ansiosta gateway saa kopiot vastauksista (OP_RESPONSE) ilman, ettC$
sen tarvitsee kilpailla Worker-sC$ikeiden kanssa.Promise & Timeout Management:
pendingRequests Mapin avulla yhdistetC$C$n epC$synkroninen event-puskuri
Fastifyn synkronisiin REST-reitteihin. Jos ydin ei vastaa (esim. ruuhkan tai
puskurin tC$yttymisen vuoksi), setTimeout nivoo poikkeuksen (Reject) heti 5
sekunnin kohdalla palauttaen 500 virheen selaimelle ja vapauttaen muistin.