This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
Friday, 24 July 2026
Miten toimitetaan nopeat vastaukset monimutkaisiin dashboardeihin järjettömästi? Loputetaan niiden renderointi pyynnön tiellä.
Dashboard on petollisesti kallis sivu. Se näyttää yhdeltä URL:ltä, mutta se on todellakin kokoonpanokone, joka käyttää sivua.

Operaaattori katsoo yhden taulukon; palvelija katsoo hitaasti- liikkuvat agregaatiotM SK2 suorat luettelot ja kalliit ikkunalliset näkemykset .
flowchart TB
P[One dashboard page] --> H[Headline counters]
P --> T[Time-series chart]
P --> B[Top bots]
P --> E[Top content pages]
P --> C[Countries / filters]
H --> M[Shared hydrated page model]
T --> M
B --> M
E --> M
C --> M
M --> S[Versioned widget shingles]
S --> U[Independent HTMX OOB updates]
classDef outline stroke:#cbd5e1,stroke-width:1.5px;
classDef emphasis stroke:#38bdf8,stroke-width:2px;
class P,H,T,B,E,C,M,S,U outline;
class M,S,U emphasis;
linkStyle default stroke:#94a3b8,stroke-width:1.3px;
tuttu ASP.NET täytäntöönpano on, että jokaisella välineellä on oma tietonsa.
flowchart LR
R[One page request] --> W1[Summary query]
R --> W2[Time-series query]
R --> W3[Countries query]
R --> W4[Endpoints query]
R --> W5[Bot query]
W1 --> J[Task.WhenAll]
W2 --> J
W3 --> J
W4 --> J
W5 --> J
J --> V[Render response]
classDef outline stroke:#cbd5e1,stroke-width:1.5px;
classDef danger stroke:#fb7185,stroke-width:2px;
class R,W1,W2,W3,W4,W5,V outline;
class J danger;
linkStyle default stroke:#94a3b8,stroke-width:1.3px;
Se näyttää nopeasti yhdessä henkilössä ja pienellä tietokokonaisuudessa : yhdeksän riippumatonta puheenvuoroa päällekkäisyydessä , joten sivu kestää noin niin kauan kuin sen hitain väline sen sijaan, että niiden summat olisivat toisiaan vastaan.
Sillä Stylo.Bot dashboard, yksi tavallinen sivun lastaus merkitsi noin yhdeksää rinnakkaista puhelua eri puolilla verkkosivustoa. Task.WhenAll noin kymmenestä kalliista operaatiosta, ja jokainen vierailija aloitti vielä kymmenen
Parallelismi on hyödyllistä. PerM SK1pyynnön kannattaja-ongelma on loppunutMSC3 Viiden samanaikaisen katsojan keskuudessa*, yhdeksästä puheenvuorosta tulee neljäkymmentä–-viisi kilpailevaa puheenjohtajuutta . Viidessäkymmenessä katsojankeskuksessa se on neljä sataa ja viisikymmentä– . Tietokannan liitännäisverkko näkee laajentuvan myrskyn itsenäisesti kalliista toimistaMST8 Pyynnöt hidastavat–MST9 pitävät yhteyksiä pitemmällä–Mst10 ja hidastavat seuraavat pyynnöt pidemmälle –MST11
Paralaaliventilaattori -out tekee yhden pyynnön näyttävän nopeammalta moninkertaistamalla paineen, joka tuhoaa järjestelmän kuormituksen alapuolella
Tämä on väärin mittauskurva dashboardille. Dashboard on yhteinen tarkkailualueM SK1 Sen pitäisi olla halvempi, koska useammat ihmiset tarkastelevat samaa asiaa , ei kalliimpaa.
Signal Shingle kohtelee kutakin dashboard-widgettia ennalta esitetynä.
Sen sormenjälki on widget + normalised parameters + data-surface generation. Maakohtainen päivitys ei saa vahingoittaa suoraa-visitorikorttia~ ;~ Muutetun filtrin ei pidä tehdä kaikkia muita ohjelmia kylmäksi~.Uusi sukupolvi vain palauttaaM SK4kysymykset tilanteeseen vaikuttaneesta ketjustaMSC5~
Nämä fragmentit elävät rajatylittävässä LFU-キャッシュissa. Warm lukee pitää tarkkaan nähtävissä olevat widgetit elävänäM SK1 one -off-filteryhdistykset menetetään luonnollisesti.
SignalR sanoo, että pinta on muuttunut; asiakas pyytää asiaankuuluvaa widget-pakettia ; HTMX soveltaa palautettua outputia--bandifragmentteja Idiomorphin kanssaMSC4 signaalilla on likainen viittausM SK5 koskaan kopio taulukon datastaMST6
Muodossa, merkki merkitsee “harkitsemaan päivittämistäM SK1 shingle on itsemääräämiskelpoinen tulos.
Renderit-silmäsiirrot ovat yksinomaan riittämättömiäM SK1 Jos jokainen virhe käynnistää uuden tietokannan skannauksen, , kallis työ jää jäljelle.
flowchart LR
D[Gateway<br/>authoritative events] --> B[Incremental window buckets<br/>data stays single-source]
B --> C[Level 1 : content cache<br/>hydrated page result]
C --> S[Level 2 : shingle cache<br/>versioned OOB widget HTML]
S --> R[Request path<br/>read + Razor shell]
T[Schedule tick/poll + LFU demand] --> W[Bounded prewarm waves]
W --> B
W --> C
X[Coalesced SignalR dirty beacon] --> U[HTMX batch update]
U --> S
classDef outline stroke:#cbd5e1,stroke-width:1.5px;
classDef emphasis stroke:#38bdf8,stroke-width:2px;
class D,B,C,S,R,T,W,X,U outline;
class C,S,W emphasis;
linkStyle default stroke:#94a3b8,stroke-width:1.3px;
Erottelu on tehty malli ja sen esitetyt widget-toimitusyksiköt. Kummastakaan cachesta ei tule havaitsemistietojen viranomaistaM SK1
Portaali omistaa tietojensa.
Use fine buckets for six-hour and 24-hours charts, hourly rollups for long windowsM SK3 Asia on se, että pyydetty okselissa yhdistetään pusket sen sijaan, että toistetaan.
last 24 hours → merge 288 five-minute buckets
last 30 days → merge 720 hourly buckets
not
last 30 days → scan and aggregate 1,000,000+ event rows again
Uudet havainnot ajanmukaistavat uusimman puskun. Historiallinen osa ei ole uudelleen skannattuM SK1, koska sivu oli laadittu . Portaali pysyy ainoana kirjoittajana ja ainoana paikkana, jossa päätetään, mitä havaitseminen merkitsee
Ennakolta, verkkosivusto säilyttää hydratoidut dashboard-mallit, palauttaa normalisoituna widget-kokonaisuuden avulla
Muun mallin pitäminen täydellisen HTML:n sijaan tallennettuna säilyttää CSRF-arvot, todentamiskerromus chrome, vaatimukseen sisältyvät tunnusvaltiot ja ns-tunnisteet
Kaltaisella avaimella, palataan selkeään lämpenemistilaan sen sijaan, että se laskettaisiin uudelleen sinkronisestiM SK1 Ainoastaan tick materialisaattori saa uuden sivun tuloksen . myöhemmin luettavat palvelevat viimeisintä menestyksekkäämpää sukupolvea, vaikka uusimpikin on lentokoneessaMSC4
Dashboard on tarkoituksellisesti jakautunut: : verkon omistajilla on tiedot; ; verkkosivustolla on Razor ja hakukonesuhteet;. taso; 2 palvelee pieniä päivityksiä paikallisesti muuttumatta kilpailevaksi tietokantaan;
Kun sivumalli on olemassa, se voidaan renderoida OOB-elementtina ja pitää rajatussa LFU:n shingle cachessa turvallisena TTL:n avulla. hx-swap-oob="morph", ja tallentaa tuloksen sormenjäljelleen
Tavaroiden loppupiste jakaa välineet lämmisiin sormenjälkiin ja virheisiin, muodostaa tuetut virheet kerranM SK1 palauttaa sen jälkeen OOB HTML. Lyhyesti sanottuna tai valtiot muuttavat uudelleen -kysymykset vain pinta-alaanMSC4
Tämä ei ole ylimääräistä tallennusta. taso 1 vastauksia “ mikä on johdonmukainen dashboard-malliM SK3 taso
Vastauksen tallettaminen on vertailukelpoista suoraan. Tavallinen vastauksen talletusjärjestelmä säilyttää hämärän HTTP-selvityksen ; Riippumatta tallennetut välineet kehittävät riippumattomia päättymis- ja epäonnistumisoikeuksia. sivu voi ladata nopeasti, vaikka se ei enää kuvaa yhden yhtenäisen tilanteen todellisuutta.
Tunnetut tallennetusmallit ovat kaikki hyödyllisiä. Ne yksinkertaisesti suojaavat erilaisia rajojaM SK1
| Muodot | Mitä se varastoi SSK2 Paras sopivuus | Miksi se ei riitä yksinään täällä S | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| HTTP-vastauksen Cache | HTTP:n vastaus | , tavallisesti URL:n ja pyynnön avulla avattava | |||||||||||
| ASPM SK1Netin output cache | Generated server output, with explicit vary and eviction policy | Expensive pages with a small | pieni | stable request | vakaa pyyntö | - | keppialue \ | Se voi varustaa sivun nopeasti | , | mutta se on edelleen hämärä sivutulos eikä yhteensovitettu suora esittely | |||
| Donut-hole /fragmenttiキャッシュ | Dynaamisia aukkoja sisältävä cached-shellM SK4 tai itsevaraisesti cached -fragmenteja sisältävät fragmentit M | Strokeet, joiden kromi on vakaa ja joiden pienet dynaamiset alueet ovat aidosti riippumattomia | Se tekee kustakin aukosta oman Cache lifecyclen \ ; juuri näin taulukko voi muuttua sisäisesti epäjohdonmukaiseksi. | |||||||||||
| Signal Shingle ja Continue to describe one state | Cache-raja on koottu esitys ; shingles are derived from it |
taso-2 shingles ovat output cache, tarkoituksellisesti pieni ja hajanainen
flowchart LR
D[One authoritative<br/>gateway dataset] --> G[Generation 184]
G --> M[One hydrated<br/>page model]
M --> H[Headline shingle<br/>generation 184]
M --> T[Chart shingle<br/>generation 184]
M --> B[Bot-list shingle<br/>generation 184]
M --> C[Country shingle<br/>generation 184]
H --> P[One coherent page]
T --> P
B --> P
C --> P
classDef outline stroke:#cbd5e1,stroke-width:1.5px;
classDef emphasis stroke:#38bdf8,stroke-width:2px;
class D,G,M,H,T,B,C,P outline;
class G,M,P emphasis;
linkStyle default stroke:#94a3b8,stroke-width:1.3px;
Kun tiedot muuttuvat, vaikutettu kokoonpano saa uuden sukupolvenM SK1 Matkailija voi tarkastella lyhyesti edellistä ajantasaistusta, kun päivitys on lennossa , mutta tämä ikä on selvä ja rajallinen. Se ei ole koskaan erillisenä yhdistelmänäMSC4 omistamia kasveja, jotka esittävät ristiriitaisia väitteitä MST5nykyinenMSP6
Yksi viranomainen, yksi yhdistetty sukupolvi, monet uudelleenkäyttöiset toimitusfragmentitM SK2
Signal Shingle ei ole JSON-API, jossa on klientti-puskea taulukko, joka on maalattu ylhäältä . Stylo.Bot-taulukko on Razor SSR:n ensimmäinen taulukokki M SK3 merkitykselliset laskutMST4 taulukotMSSK5taulukoksetMSC6 linkit ja navigointi ennen JavaScriptin käyttöönottoa~. HTMXMST8SignalR ja Alpine parantavat sen jälkeen sivua sen sijaan, että korvaisivat sen.
flowchart LR
R[GET dashboard] --> S[Razor SSR<br/>complete useful HTML]
S --> V[Operator can read<br/>and navigate now]
S --> H[HTMX enhancement]
S --> A[Alpine enhancement]
S --> G[SignalR enhancement]
G --> D[Dirty beacon<br/>not dashboard JSON]
D --> H
H --> O[GET OOB widget batch]
O --> W[Versioned HTML shingles]
W --> M[HTMX / Idiomorph morph]
A --> I[Local UI state<br/>menus, filters, affordances]
classDef outline stroke:#cbd5e1,stroke-width:1.5px;
classDef emphasis stroke:#38bdf8,stroke-width:2px;
class R,S,V,H,A,G,D,O,W,M,I outline;
class S,W,M emphasis;
linkStyle default stroke:#94a3b8,stroke-width:1.3px;
HTMX pyytää HTML:tä ja vaihtaa palautetun saaren. SignalR toimittaa pienen likaisen signaalin JSON-mallien sijasta . Alpine omistaa paikallista UI-valtiota M SK2 menut, vaihtelevat ja kohtuulliset laitteet, jotka eivät ansaitse kierroksenMSC4matkaaMST5 Poiskaa yksi niistä ja SSR-sivu säilyy hyödyllisenä~; lisää kaikki kolme ja se saa suoraaMST7 alhaistaMKT8urnin päivityksiäMSTO9
Uudelleenlaskeminen tapahtuu sivun pyynnön ulkopuolella. Tämä on kova raja : kylmä lukeminen palauttaa lämpenemisen tuloksen, kun taas vain tick materializer muodostaaM SK3 sivupyyntö on johdonmukaisen ennusteen lukeminenMSC4 ei koskaan tekosyy kalliiden tietojenkäsittelyjen aloittamiselle
Koordinaattorien joukot on sidottu ja hiljattain- lukee kirjeitä , sitten lämmittää ne rajatylittäviin aaltoihin sivullaM SK2 lukumäärä ja seina- kellobudjettiMSC4 Aaltojen sisällä se jakaa yhteensopivia töitäMST5 mitattua kustannusbudjettia voidaan pysäyttää myöhemmät aaltot kokonaanMSP6 Tämä ei ole Task.WhenAll uusi nimi.
Yhdenmukaisuuden raja on osana korrektisuutta : refresh loop saa tietyn kapasiteettibudjetinM SK1 koskaan rajoittamaton joukko yhteyksiä. täysin lämmin päivitys ei sisällä mitään kokoonpanoa tai Razor-renderointia lainkaan
Orkestraattinen, ei myrskyäM SK1 Tämä on toimintasääntö.
Cache ei voi suojella ensimmäistä pyyntöä, jos se vain lämpenee sen jälkeen että pyyntö saapuu. Siten materialisaattorilla on kaksi tehtävää Pinned defaults säilytetään reaali 6hM SK1 24h, Kysymys-määrärahat suojafilterit, joita ihmiset todella käyttävät, luokiteltu liittymismäärän ja vastaanoton mukaan
flowchart TB
P[Pinned default windows<br/>6h · 24h · 7d · 30d] --> Q[Warm queue]
L[Recently read filtered views<br/>LFU hotness order] --> Q
Q --> G{Tick budget<br/>still available?}
G -->|yes| W[Bounded warm wave<br/>compose once, store model]
G -->|no| N[Defer to next tick<br/>serve prior generation]
W --> H[Level 1 content cache]
H --> Z[Level 2 shingle cache<br/>rendered on demand]
classDef outline stroke:#cbd5e1,stroke-width:1.5px;
classDef emphasis stroke:#38bdf8,stroke-width:2px;
class P,L,Q,G,W,N,H,Z outline;
class Q,W,H emphasis;
linkStyle default stroke:#94a3b8,stroke-width:1.3px;
Ennakolta lämpenemisen on oltava todellisen tuotteen pinta-alan mukaista. Jos UI tarjoaa neljää normaalia ikkunaa ja lämpenettäjä tietää yhdenM SK1 kolme neljäsosaa odotetusta ensimmäisestä-klikkilähestymistapasta on edelleen kylmää .
LFU on täällä enemmän kuin karkottaminen. pääsy on kysyntäsignaali : se päättää, mikä pysyy asukkaanaM SK2 mikä ajantasaistetaan ensisijaisesti duetun työn perusteella , ja mitä voi turvallisesti kadotaMSC4 Se tekee rajattomasta filtrointialueesta hallittavanMST5 Maafilteri, jota seurataan koko päivän, pysyy lämpimänäMSV6 filtri, jonka testataan ikääntymisen jälkeenMSP7 Ei erillistä ‐“ suosittua taulukkoa MSV9 taulukota tarvitaanMsv10
Perinteiset suorat taulukot vastaavat lisääntynyttä liikennettä tekemällä enemmän työtä, jolloin ne ovat vähiten hyödyllisiä kohdalta, jossa ne eniten tarvitsevat operaattoria . Signal Shingle kääntää suhteen päinvastaiseksiM SK2 Uudelleen päivittämisen valvoja mittaa uudeksi päivittämisestä aiheutuvia kustannuksia talousarvioon nähden; kalliit jaksot kaventavat tehokkaita väliaikoja
refresh cost <= budget → preserve requested cadence
refresh cost > budget → lengthen effective cadence
cost settles → cautiously shorten it again
Tämä on suojatun resurssin suljettu ketju, ei ole arvausta raakasta RPS:stä. Laadittaessa järjestelmä siirtyy statisen snapshotin suuntaan sen sijaan, että se tekisi lisää tietokannan työtä säilyttääkseen mahdottoman lupauksen elinvoimaisuudesta
Laadinnan ansiosta taulukko tekee vähemmän työtä, ei enempääM SK1 Siksi malli heikentyy eikä romahda.
“Statistinen” ei ole epäonnistuminenM SK2 Se on viimeinen tunnettu johdonmukainen ennuste ,, joka rajoittuu tuoreutta koskevaan politiikkaan ja on merkitty rehellisesti
Staattinen puoli on vastauksen sopimus : nopea, johdonmukainen snapshot cache-tasoistaM SK2 Dynaaminen puoli on erillinen budjetoitu prosessi : aikatauluja käyttävä mekanismiMSC4 asianmukaiset tarkastukset suoritetutMST5 valinnainen SignalR nopeuttaminen elävien ohjelmien osaltaMSL6 ja uudelleenliitännän uudelleensynchronisoiminen–. Vastaus pysyy nopeana myös silloin, kun snapshot tulee vanhentuneeksi
Näin järjestelmä voi liikkua jatkuvasti kahden hyödyllisen moden välillä:
quiet / cheap refreshes → dynamic dashboard, short effective cadences
busy / expensive refreshes → static-like snapshot, longer declared cadences
Tämä on rakenteeseen sisällytetty mukautuva scaling.
Kaikki välineet eivät ansaitse samaa tuoreutta. Kehitysgrafiikka tai loppupisteen luokittelu voi olla minuutteja tai tuntia jäljessäM SK1 viimeaikaisten vierailijoiden luettelo tai nykyiset pisteet tarvitsevat tiukemman kadenssin. Kadenssi elää välineiden kanssa ' tuoreusluokkaMSC4
| Luokitus | Tavanomaiset ohjausvälineet | ||
|---|---|---|---|
| Yhdennetty | yhteenveto, kehityssuuntaukset, maat, loppukohdat | minuutista tuntiin | signaali muuttuu riittävän hitaasti, että vakaus on arvokkaampaa kuin tuska |
| suorana lähetyksenä | äskettäiset vierailijat, istunnotM SK3 nimetMSC4 pisteetMST5 uhkaukset | noin minuutti S | Operaattori etsii nykyistä liikkuvuutta |
Kaksi näkyvästi identtistä widgetiä voi pyytää erilaista kadenssia. Kadensin siirtäminen cache-kysymykseen toistaa tietoja; Ensimmäisen kadensin hyväksyminen voi jättää myöhemmin kuluttajien tilanteeseen
Invariantti on yksinkertainen:
Yhteinen cache-yhteys ei saa koskaan palvella staleria kuin yksikään sen aktiivisista kuluttajista, jolta pyydetään.
Virallisesti:
effective cadence(entry) = MIN(requested cadence of every active consumer)
Cadence on per-kuluttaja pohja, ei ole osa allekirjoitustaM SK1 Jos yksi kuluttaja pyytää 60 sekuntia ja toinen viideksi minuutiksi, yksi yhteinen merkintö päivittää jokaista ♫ 60 sekuntiaMSC5 Kun nopea kuluttaja lähtee pois ‐ , laskea vähimmäismäärän uudelleen ; kun yksikään kuluttaja ei jää ‐, lopettaa aikataulun laatimisen ja antaa LFU: n peruuttaa sen
mukautusjärjestelmässä on oltava rehellistä mukautumisensa suhteen. Widget chrome osoittaa nykyisen tehokkaan kadenssin : “ päivittäen jokaista SSK3sM SK4 \“ päivittämään jokaista
Jotkin säännöt ovat välttämättömiä, jotta ennusteet olisivat rehellisiä:
Tavoite ei ole välitön johdonmukaisuus.
Tässä on koko kauppa yhdessä taulukossa.
| Per-request fanM SK3out | Signal Shingle kaksoislaaja SSK5 | |
|---|---|---|
| Sivupyynnön | Aloitetaan N-tietojen fetching ja odottaminen SSK2 lukee valmian mallin /chunkin ja renderoi shellin S | |
| Tietojen käsittely | Toistaa vierailijoita kohden | Yhteinen m, lisääntyvä M, pullonkaula |
| Ohjelmien päivitys | Jokainen ohjelmi voi palauttaa itsenäisesti | Warm shingles serve directly | |
| Kilpailu | Task.WhenAll laajentuu liikenteellä |
Rajoitettuja elvytysaaltoja mitattuna kustannusbudjetilla |
| Filtroidut näkymät | Ei salailla eikä rajoiteta SSK2 kuumat yhdistelmät pysyvät elävänäM SK3 kylmät LFU- välttämätön | |
| Load response | Useammat liikennemuodot lisäävät työvoimaa. | |
| Värvys | epäselvä ja usein epäjohdonmukainen | |
| Epäonnistumismodus | hitaat pyynnötM SK2 kaluston tuhoaminen, romahtaminen | vanempi mutta merkinnät sisältävä projiointiMSC5 rajattu työ SSK6 |
Signal Shingle koostuu tuttuista ASP-ohjelmista.NET-osista : LFU:staM SK2 SignalR:stä , paketoidusta kokoonpanosta , RazoriltaMSC5 HTMX:ltä ja aikataululta, jolla on todellinen yhteensovittamisen budjetti
Siirtää renderointia pyynnön tieltä pois. Antaa throttlen palauttaa työ sen sijaan, että vastaisi.
© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.