Signal Shingle, en ny architecture för högpresterande ASP, ., multi-NET och - webbsidor (Svenska (Swedish))

Signal Shingle, en ny architecture för högpresterande ASP, ., multi-NET och - webbsidor

Friday, 24 July 2026

//

17 minute read

En del av Stylo.Bot-utsläppsserien Behavior-Är medveten ASP.NET UI täcker servern Att hitta och fixa gränslös tillväxt täcker tillförlitlighetsdisciplinen bakom bounded state Att lära sig bli snabbare täcker den tidigare adaptiva versionen

Hur levererar man snabba svar till komplexa bräder utan att bli galen?


Problemet

En dashboard är en bedrägligt dyr typ av sida.

Ett användbart dashboard: sammanfattningsmätare , en tidsram - seriediagramm M SK3 botlistat MSC4 slutpunkt och ländernämningar alla delar en sida samtidigt som de behållar oberoende uppdaterade ytor

Kom snart i Stylo.Bot

Signal Shingle är den framväxande brädansarchitekturen.

Operatören ser ett dashboard, ;, servern ser långsamt, -, rörliga aggregationer, M SK2, live listor och dyra fönster.

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;

Den kända ASP-implementationen, ., NET, har varje widget som får sin egen data.

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;

Det ser snabbt ut med en person och en liten datamängd : runt tio oberoende sammandragningar, så sidan tar ungefär lika lång tid som den långsammaste widgeten snarare än sin summa. Arithmetiska förändringar när sidan blir populär

På Stylo.Bot dashboard, en normal sidamängd betydde omkring tio parallella samtal över hela hemsidan / öppningsgränsen . Daguppfattningen kunde scanna mer än en miljon rader M SK4 En enda tystnande belastning var redan flera gånger så stor MSC5sekunder| . Under samtida trafiker, gick p’ s sträcka förbi sju sekunder eftersom varje besökare väntade på ’ , ’ och började ‘ , ’ runt tio dyra operationer

Parallelism är användbar . Per-ansökerventilatorn -lösen är problemet M SK3 Vid fem samtida tittare MSC4 blir omkring tio samtalen runt femtio konkurrerande samtalen МSK5 På femtio tittare blir det runt femhundra Mska6 Den databasernas nätverk ser en växande storm av oberoendet dyrt arbete Mske7 begäran saktar ner, Mske8 håller kopplingar längre, mske9 och saktar ned nästa begäran ännu längre, M Ske10

Parallellventilatorn gör att en enda utmaning ser snabbare ut genom att multiplicera trycket som förstör systemet under last.

Det här är den felaktiga skalningskurvan för en brädan.

Normal multi
Varje begäran startar sin egen datafan - ut
Varje widget kan åldras och misslyckas oberoende av sig Widget kommer från en generation
Fler tittare skapar mer databasnivån ♫ ♫ Fler tittar på uppvärmda modeller och shingler ♫
Lad saktar ned reaktionen i sig själv ♫ ♫ Lad sträcker ut frifrisk cadens medan reaktionerna stannar snabba ♫

För Stylo är brädan den mest värdefulla under en bot-sur eller incident- -precis när databanan är under tryck... Architekturen optimerar därför först för stabilitet.:. Ett snabbt- -kohärent- -snapshot med ett explicitt ålder är mer användbart än en teoriskt nyare sida som är långsamt.


Lösningen: Signal Shingle

Signal Shingle behandlar varje brädansguidet som ett föremål.

Hans fingeravtryck är helt enkelt widget + normalised parameters + data-surface generation. Ett landsaktualisering ska inte försämra en live- --- -Visitorkort. ;- -En ändrad filter ska inte göra allt annat widget kallt.

De här fragmenten lever i en begränsad LFU-cache. Warm läsning håller bevakade widgets levande ; one - avfiltrerade kombinationer förlorar sig naturligt

SignalR säger att ytan har ändrats; klienten frågar efter den påverkade widgetpaketet HTMX applicerar den återvända ut från fragment i band med Idiomorfer. Signalen bär en smutsig ledtråd

I mönstret, signal betyder “se till att göra det klartM SK1 shingle är det oberoende adresserbara resultatet.

Architekturen separerar reaktionskontraktet från uppfriskningsarbetet. Reaktionen är statisk - som: en snabb~ , en coherent bild från cachen M SK4 Den dynamiska sidan är en separat process, med budget, som uppfriser och levererar ändrade fragment.

Rendera-Seitenshinglar är helt enkelt otillräckliga . Om varje miss löser en ny databass scanning, så finns det dyrt arbete kvarM SK3 Signalshinglen använder två levels-cache med en avsiktligt smal hand,

flowchart LR
    D[Gateway<br/>authoritative events] --> B[Incremental window buckets<br/>data stays single-source]
    B --> C[Delivery cache 1<br/>hydrated page result]
    C --> S[Delivery cache 2<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;

Dataprojektering och levererade kaser

Skillnaden är mellan modell och dess utformat Widgets levererade enheter. Inget av de båda kaserna blir en auktoritet för att upptäcka data

Dataprojektion: inkrementella bucket

Gatewayn äger datan.

Använd finbuckets för sex timmar

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

Nya observationer uppdaterar den nyaste burken. Den historiska delen är inte scannerad eftersom en sida laddats upp. . Gatewayt är fortfarande den enda skrivaren och den enda plats som bestämmer vad detektorn betyder.

Tillförselns kass 1: den hydraterade innehållsmodellen

Uppströms – , – kastar webbsidan upp hydratiserade datapanelmodeller, , – låst av en normaliserad widget-uppsättning,, – fönster, , – filter och generering, M SK4 – Den överbrygger autentiska data och rendering.

Att kassera en modell istället för full HTML håller CSRF-värdena, autentiseringsklom , drag flager och nonser på applikationen- skickade skala där de hör till

På ett kallat nyckel , återfå en klar uppvärmnings tillstånd snarare än att göra om det i synkrona ordning. Bara tickmaterialisatorn får ett nytt resultat på sidorna . Senare svar serverar den senaste framgångsrika generationen M SK3 även när en nyre är på flyget MSC4

Livringskiva 2: skal renderingskivan

Dashboarden är medvetet splittrad : portaal äger data ; hemsidan äger Razor och webblägrensrelationen. levereradescaffer M SK3 serverar små uppdaterade saker lokalt utan att bli en konkurrenskraftig databutik MSC4 den innehåller bara versionerad HTML som är avlägsnat från portaalet Mska5 baklagd sidamodell M Ska6

När en sidamodell existerar, kan en widget presenteras som ett OOB-element och hållas i den begränsade LFU-shinglens kass med en säkerhets TTL hx-swap-oob="morph", och lagrar resultatet under fingeravtrycket

Partitionens slutpunkt delar prylar till varma fingeravtryck och missar.

Det här är inte överdrivande kassering. Liveringskassering 1 svar | “ vad är den konsekventa datapanelmodellen |?” Livningskassring ♫ 2 | svar ♪ “ | vad DOM-inseln kan denna webblader få ♫


Cachegränsen: varför det här inte är reaktionscaching

Response caching är värt att jämföra direkt. En normal response cache lagrar en otydlig HTTP-anslutning ; oberoende cachede widgets utvecklar oberonde utgångs- och avbrytningsmodi . sidan kan laddas snabbt, medan den inte längre beskriver ett konsekventt tillstånd.

De kända kakande mönsterna är alla användbara. De skyddar helt enkelt olika gränser

Pattern ♫ ♫ ♫ Vad den förvarar ♫
HTTP response cache En HTTP-respons , som vanligtvis låses med URL och begäran- varierande regler offentliga GET-gränssnitt och CDNM SK4 tillfredsställande innehåll ♫ Den vet ingenting om dess dashboard ♫' ♫ dess inre widgeter eller om deras data är överens ♫
ASP.NET utgångsキャッシュ Genererad server-output , med explicit variants- och utskjutningspolitik dyra sidor med en liten~ , stabil beställningM SK4 nyckelrymmet ♫ Den kan kaska sidan snabbt ♫ МSK6 ♫ men det är fortfarande ett osynligt resultat snarare än en koordinerad live-projektion ♫
Donut- hål / fragment Cache En kaskad skala med dynamiska hål ♫ , eller oberoendet kaskad fragment ♫ sidor vars krom är stabil och vars små dynamska områden är verkligt oberonde ♫
Signal-Singler En hydratad generation , - en markerad sidamodell plus versionerade widget-tillförselfragment ett dashboard vars delar måste uppdateras självständigt och fortsätta att beskriva ett tillstånd Cachegränsen är den sammanbyggda prognosen ; skalor är avlägsna från den , inte konkurrenskraftiga affärer

Niveau-2 shingles är en utgångsキャッシュ, medvetet liten och fragmenterad -formad. Skillnaden är att fragment inte bestämmer data verkligheten oberoende av varandraM SK3 innehållsmodellen är uppbyggd förstMSC4 under en generation

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;

När data förändras, så får den påverkade kompositionen en ny generation... En webblader kan kortfattat se den tidigare när en redigering är på flyg, men den åldern är uppenbar och begränsad... Det är aldrig en uppsättning separata, -, ägida kasper som gör motsägelsefulla antaganden om,

En auktorite , en komponerad generation, många återanvändbara leveransfragmenter.


SSR första, ,, progressiv förbättring andra

Signal Shingle är inte en JSON API med klient Rasor SSR första : meningsfulla mätare, tabeller M SK2 tabellar , länkar och navigering innan JavaScript körs Alpine så förbättra den sidan istället för att ersätta den.

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;

Browserstocken

Rasor visar sidan på servern. HTMX begäran och utbyter HTML öar. SignalR bär små förändringssignaler. Alpine ägar den lokala interaktionsstaten. Idiomorfer uppdaterar en ö samtidigt som du bevarar stabila DOM-knoder som fokus och hover status.

Ta bort någon av dem och SSR-sidan är fortfarande användbar.

Varför är detta inte en klient

Primära skälet är enkelt: brädan måste vara användbar för varje klient utan att behöva JavaScript . En webblader med skript avstängd M SK2 en långsam koppling , en hjälpsam klient MSC4 ett automatiserat verktyg eller en kröpare får fortfarande meningsfull HTML

En klient- skickade brädan är en bra anpassning när den rika lokala applikationsstatusen är produkten . Den skulle lämna den här bräden beroende av JavaScript innan den kan visa data . Det skulle också antingen återskapa sammansättningslogiken i webbläsaren eller få webbläsaren att koordinera widget API: n M SK3 och göra den till en annan statfull deltagare i nyhet MSC4 repetitioner MST5 fel och konsistens

Client-överlämnad bräda Signal Shingle brädan
Browsern tar fram JSON och äger utformat bildtillståndet Servern komponerar modellen och utformat HTML
Client förenklar oberoende responser , laddande tillstånd och baklagda data Server stämpelar en konsekvent generation innan levereration
Den första användbara innehållet beror på att JavaScript och API är färdigt Den först användbaren innehållen är SSR HTML
Det är bäst när den rika lokala applikationsstatusen är produktet Det är bästa när brädan är en gemensam operationell prognos

Designen håller brädan universell standardmässigt.


Refresh är en avmattlig jobb, inte ett oavsiktligt biverkningar av trafiken

Uppfriskning sker utanför sidan begäran. Det här är en hård gräns : en kall läsning återskapar ett uppvärmningsresultat M SK2 medan bara tick materialiseraren komponerar . sidan begärningen är en läsning av en konsekvent prognos MSC4 aldrig ett ursäkt för att börja dyr dataarbeten

Koordinatorernas köer ställdes upp och nyligen- läste omloppsedeln , så värmer de upp i begränsade vågor med en sida Task.WhenAll som bär ett nytt namn.

Komparensgränsen är en del av korrektheten.

Orchesterat, inte en storm. Det är den operationella regeln.

Framvärmning är täckning , inte villlig kakning

En kas kan inte skydda den första begäran om den bara värms efter som begäran kommer fram. Så materialisatorn har två jobb Pinned defaults behålla den riktiga 6hM SK1 24h+, ♫ ♫ 7d och ♫ 30 d-fenstervalen varma Efterfrågan-bestämda omlopp skyddsfilter som folk faktiskt använder

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[Delivery cache 1<br/>hydrated page model]
    H --> Z[Delivery cache 2<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;

Framvärmning måste matcha den verkliga produktens yta. Om gränssnittet erbjuder fyra normala fönster och kylaren känner till ett , tre fjärdedelar av den förväntade första -klickvägen är fortfarande kallt


LFU är inte bara utfånganing : det är efterfråganssignal

LFU är mer än utfånganing här. tillgången är efterfråganssignalen : den bestämmer vad som kvarstår som bosättare , vilket avlägsna arbete uppfrischar först M SK3 och vad som kan utan tvekan försvinna MSC4 Det gör obegränsade filterytader tillägnade för att sköta dem Mska5 Ett landsfilter som observerar hela dagen stannar varmt M Ska6 ett filter som prövats när det åldras, M Ska7 Det finns ingen separat ♫ M Ska8 ♫ populärt brädselbord ♫ М Ska9 ♫ bord som behövs ♫M Ska10 ♫


Stabilitet under tryck

Traditionella live-dashboarder reagerar på mer trafik genom att göra mer arbete, så blir de minst användbara vid de punktoperatörer som behöver dem mest . SignalShingel omverkar förhållandet. Frequensreglerna mäter frigörelsekostnaden mot ett budgetMSC3 dyra cyklar sträcker ut effektiva intervallM SK4 billiga kontrakterar mot den efterfrågade inställningen

refresh cost <= budget  → preserve requested cadence
refresh cost >  budget  → lengthen effective cadence
cost settles            → cautiously shorten it again

Detta är ett slutet kretslopp på den skyddade resursen , inte en gissning från rå RPS. Under belastning rör sig systemet mot ett statiskt ögonblicksbild istället för att skapa mer databasarbete för att upprätthålla en otänkbar löfte om livfullhet. StyloM SK3 Boten blir därför lugnare när händelserna blir starkareMSC4

Lade gör att brädan fungerar mindre, inte mer. Det är därför mönstret bryts ned istället för att kollapsa

“Statisk” är inte ett misslyckande . Det är den sista kända konsekventa prognosen

Statiskt och dynamiskt

Det föregående avsepareringen ger brädan en snabb responskontrakt och en separat budgeterad redigeringsprocess. Scheduler -driven due checks, optional SignalR acceleration for live widgets and reconnect resync keep the dynamic side current

Så systemet kan skifta kontinuerligt mellan två användbara moder:

quiet / cheap refreshes       → dynamic dashboard, short effective cadences
busy / expensive refreshes    → static-like snapshot, longer declared cadences

Det är adaptiv skalning som är inbyggd i arkitekturen.


Frihet tillhör widgetet: en ickeM SK1 omnegocierad invariant

Alla prylar förtjänar inte samma nyhet. En trendgraf eller slutpunktklassning kan vara minuter eller en timme efter dem ; en lista av nyliga besökare eller aktuella poäng behöver en hårdare kadens

klass Typiska widgets grundkadensen МSK3 Varför
Aggregerad sammanfattning , trender МSK3 länder , slutpunkter ♫ minuter till en timme Signalen förändras tillräckligt långsamt för att det är mer värt att vara stabil än att knuffa
Live nya besöker , sessioner ♫ , namn ♫ , poäng ♫ МSK5 hot ♫

Två synligt identiska widgets kan be om olika kadenser. Att sätta in kadensen i dataminnet gör datan kopierad ; Att acceptera den första kan låta en senare konsument bli obekväm

Invarianten är enkel:

Ett gemensamt kassier måste aldrig servera en staler än någon av dess aktiva konsumenter som begärts..

Formellt:

effective cadence(entry) = MIN(requested cadence of every active consumer)

Cadence är en per-consumer golv, inte del av undertecknetet . Om en konsument frågar efter 60 sekunder och en annan i fem minuter , gör en gemensam insats uppfriskande varenda ♫ 60 sekunder M SK5 När snabbkonsumensen lämnar ♫ , räkna tillbaka det minimala ♫ МSK7 när inga konsumenter kvarstår ♫, sluta planera och låta LFU återta det ♫

Ett aktivt konsument är ett kortt -livt, nyställbart efterfrågans hylla skapat av en verklig begäran . Fortsättet sätter på att nyställa det M SK3 utgångsdatum är avlägsning MSC4 Timmaschematen inkluderar bara leaser på riktigt när den räknar ut minimalkadensen


Honest krom och konsekventa regler

Ett anpassningsbart system bör vara ärligt om dess anpassning.. Widget-chrom visar den nuvarande effektiva kadensen.

Det finns några regler som behövs för att hålla en prognos ärlig.

  • Generationsmärken. Varje chunk, /, registrerar datagenereringen som den skapades från.
  • Koplicerade signaler. En upptagna upptäckare kan generera många händelser per sekund. Signalbanan byter dem till ett smutsigt signal och en refresh lösning snarare än att skjuta upp webbläsaren eller refresh-loopen
  • Resync på att koppla igen. Ett återkoppel behandlas inte som bevis på att inget har hänt.
  • Begränsad TTL fallback. En bevarad del är inte tillåten att bli oömtlig . När den överträffar klassen- är begränsad till specifik förruttnad och kan inte återuppvärmas , blir den kallad M SK3 värmende istället för att tystna för alltid
  • Inget innehållsdjukan. Liv shinglar kan innehålla namn, fingeravtryck eller poängen. Deras innehåll stannar i minnet , är inte registrerade

Målet är inte omedelbart konsistens.


Möjligheter och handel

De fördelarna är strukturella: stabila efterfrågans latensitet, en konsekvent sidagenereringM SK2 gemensamt arbete för populära versioner , och ett användbart SSR utan JavaScriptMSC4 I trycketMska5 tjänar systemet en uppriktig, äldre prognos istället för att omvandla varje sidauppfattning till mer databastryck

kostnaderna är riktiga. Den här arkitekturen lägger till en programmerare , kasknycklar , generation tracking M SK3 efterfrågans hylla och upplevbarhet som en normal kontroller inte behöver MSC4 En kylfilterad bild kan visa en uppvärmnings tillstånd innan den blir gjord som en riktig sändning Mska5 Operatörerna måste välja acceptabla nyhetsgränser istället för att låtsas att varje yta behöver verklig data Mske6 tiddata M Ska7 Varje webbreplika behöver också sin egen begränsade kask och uppdatera signal

Det är dåligt tillpasat för en skrivande, djupt personaliserad applikation där varje respons är unik, eller för en yta som verkligen kräver att varje användare ser varje förändring omedelbart.

Signal Shingle komponerar välkända ASP, ., NET-skivor, :, en LFU, M SK2, SignalR, M Sk3, sammanlagd komposition, M K4, Razor, M sk5, HTMX och en programmerare med ett riktigt samtida budget.M Sk6, Gatewayn är självständig.;, hemsidan serverar en prognos.;, webbläsaren får små versionsfragment.M SK9

Dashboarden förblir snabb eftersom observation inte längre orsakar beräkningar.

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.