Back to "Сигнальний Шінґл: нова архітектура для високої продуктивності ASPM SK2 NET мультипліктних- веб-сайтів"

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

AI Architecture ASP.NET Patterns Performance StyloBot

Сигнальний Шінґл: нова архітектура для високої продуктивності ASPM SK2 NET мультипліктних- веб-сайтів

Friday, 24 July 2026

Як отримати швидкі відповіді на складні панелі без божевілля?? Ви перестаєте відтворювати їх на żądaнні.


Проблема: заM SK1за запитом вентилятораМSK2вийшло

Насправді, панель - це дуже дорогий вид сторінки. Це схоже на один URL, але насправді це комп 'ютер, який має форму сторінки.

Розгорнутий панель приладів: підсумкові рахунки , часі МSK2 серійний діаграми M SK3 список роботів , кінцеві точки та погляди на країни всі розділяють одну сторінку, водночас зберігаючи невід 'ємні обновлення поверхневі MSC5

Оператор бачить один панель приладів; сервер бачить повільнийM SK1 рухомі агрегати, живі листи та дорогие вікнані перегляди .

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;

Знайома ASP.NET реалізація має кожен виджет, який отримує свої власні дані , запускає ці дзвінки паралельно МSK2 потім чекає на всі, перш ніж відтворювати сторінку

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;

Вона виглядає швидко з однією людиною і малим набором даних : дев 'ять невід 'ємних дзвінків перетинаються , так що сторінка займає приблизно стільки часу, скільки її найповільніший виджет, а не їхня сума МSK2 Арифметика змінюється, коли сторінка стає популярною

На Stylo.Bot панель приладів, один звичайний завантаження сторінки означало приблизно дев 'ять паралельних дзвінків по всьому вебсайту / гранична межа для входу МSK2ទិដ្ឋភាព дня могло сканувати більше мільйона рядків M SK4 Один спокійний загрузок вже був мультихранним -секундна секунда MSC6 Під одночасним рухом Mska7 pMska8 пройшов через сім секунд Мska9 тому що сторінка чекала Task.WhenAll десь 10 дорогих операцій, і кожен відвідувач почав ще 10

Паралелізм корисний. Для учасникаM SK1 фаната запити- проблема в тому, що все вичерпано . У п 'яти одночасних глядачахMSC4 дев' ять дзвінків становить чотиридесяти МSK5 п ’ ять конкуруючих дзвінків M SK6 у п 'ятдесяті глядачів це чотириста п 'ятьдесятіМSK7 База з' єднання баз даних бачить розширючу бурю самостоятельно дорогих робітMSL8 Запроси сповільнюються MSL9 тримають зв 'язки довше МSL10 і пришвидшують наступні запити далі МСЛ11

Паралельний вентилятор - out робить одне просування виглядати швидше, збільшуючи тиск, який знищує систему під навантаженням .

Це неправильна кривая масштабування для панелі приладів.


Рішення: Сигнальний шил

Сигнальний Шінґл сприймає кожен виджет на панелі дотиків як попереднє-рендерованеM SK1 самосвідомеМSK2континентний фрагмент сторінки. Його ідентичність - це дані, які він представляє, і як він рендерований | МSK4 | виджет |МSK5 | рядок | , | вікно |, | фильтры та дисплейні параметри | Мислання кадру навмисно не є частиною цієї ідентичності | мислання

Її відбитки пальців widget + normalised parameters + data-surface generation. Поновлення країни не повинно видаляти непотрібним живу картку - Карта для відвідувачів МSK2 змінений фильтр не повинен зробити всі інші додатки холодними

Ці фрагменти живуть в обмеженому LFU-キャッシュі. Warm читає, зберігає спостережені виджети резидентамиM SK1 one - відключені комбінації фильтров втрачають природньо.

СигналR каже, що поверхня змінилася; klient просить застосувати впливовану партію виджетівM SK1 HTMX вводить повертаний вихід- зMSC3 фрагменти стрічки з Idiomorphом . Сигнał переносить брудну порадуМSK5 ніколи не копію даних на панелі масової панелі .

У моделі, сигнал означає “вважати обновлюванимM SK1 Шингл є незалежно адресованим результатом.

Створити-зазвичай, сторонні шинглі недостатньоM SK1 Якщо кожне пропущення спричиняє свіжий скан бази даних , дорогою працю залишається МSK3 Сигнальний шінґл використовує два M SK4уровень пам 'яті з однією навмисно вузькою рукою -останнє між ними MSC6

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;

Два рівні кэшу: : дані залишаються авторитетними , презентація залишається готова

Різниця між модель і його рендерованих واحدи доставки виджетів. Жодна кэша не стає авторитетом для розпізнавання даних

Поверховий шар 1 МSK1 додаткові клітки

Мережа володіє даними. Вона зберігає обмеженіМSK1 вMSC2 пам 'яті LFU проекцію інкрементальнихM SK3 віконних клітків з 30- щоденним слизливим збереженням : робочого набору МSK6 а не другою базою даних

Використовуйте непогані клітки для шістьох часових та годинних діаграм.

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

Нові спостереження обновлюють найновішу клітку. Історічна частина не переглянутаM SK1 тому, що сторінка була завантаженаМSK2 Перехідник залишається єдиним автором і єдинім місцем, що вирішує, що означає розпізнання.

Уровни キャッシュу 1 МSK1

Нагорі, веб-сайт зберігає hydratовані моделі панелі масок , за допомогою стандартизованого набору виджетів МSK2 вікно МСК3 фильтры та генерація М СК4 Він об 'єднує авторитетні дані і рендерування M СК5

Захищання моделі, а не повного HTML зберігає цінності CSRF , аутентифікація хрома, флаги і нонс на запиті

На холодному клавіаті, повертають яскравий стан нагрівання, а не синхронно перераховуючиM SK1 Тільки тик-матеріалізатор отримує новий результат сторінки. Далі читають, щоб служити найновішій успішній поколціMSC3 навіть тоді, коли нова вже в польотіМSK4

Рівеньキャッシュу 2 : шингловий рендер Cache

Панель панелі розділена навмисно : ворота мають дані ; веб-сайт має Razor і зв 'язок з браузером

Як тільки існує модель сторінки, виджет можна відтворити як OOB елемент і зберігати в обмеженому LFU шинглі-каші з безпекою TTL . Теплий шингл обходить як склад, так і рендерування RazorM SK2 помилка читає вже отриманий результат- теплий результат сторінки, де це можливоMSC4 відтворює лише те, що виджет hx-swap-oob="morph", і зберігає результат під пальцем

Командний кінцевий пункт розділяє виджети на гарні відбитки пальців та пропущені пропущення, складає підтримані пропущенні пропустини один разM SK1 потім повертає OOB HTML. Підсумок або країни міняють реМSK3 клавіші лише на цій поверхніMSC4

Це не надлишкове кэшування. Уровни M SK1 відповіді “ що таке кохерентна модель панелі приладів МSK3 Урові МSK4 відповіді МSK5 Що може отримати цей браузер на острові DOM? мSK6 Перший робить комбінацію доступною для спільного перегляду М SK7 другий робить частинні aktualiзації майже безкоштовними


База キャッシュу: чому це не Cache реагування

Реакційне キャッシュування варте безпосереднього порівняння. Звичайна реакційна キャッシュа зберігає неяскравий HTTP-відповідальний ; Незалежно заキャッシュованими виджетами розробляються невід 'ємні режими вимирання та невдачіM SK2 сторінка може завантажуватись швидко, поки більше не описує один єдиний послідовний стан. На операційній панелі масок МSK4 підрахунок, який не погоджується з рядками під нею, змушує оператора досліджувати призраїMSC5

Знані шаблони шифрування є дуже корисними.. Вони просто захищають різні кордони

Форма МSK1 Що він зберігає МSK2 Найкраще підходить Чому він сам тут недостатньо
Cache HTTP-реакції HTTP-Реакцію МSK2 звичайно зашифровується URL і запитом МSK3різноманітні правила Публічні кінцеві точки GET та CDN МSK5 приємний контент Він нічого не знає про панель дотиків МSK7 внутрішні виджети чи те, чи згодні їхні дані
ASP . NET вихідний кэш МSK2 генерований вихід на сервері МSK3 з явною політикою варіації та викидання мSK4 дорогих сторінок з невеликим МСК5 стабільним запитом М СК6 ключевим місцем МсК7 Він може швидко підлаштувати сторінку в кэші MСК8 але це все ще незрозумілий результат сторінки, а не координована пряма проекція МSК9 M СК10
Донут - ямка МSK2 фрагментовий кэш МSK3 Кэшова оболочка з динамічними ямками мSK4 або із невід 'ємними фрагментами M Страни, чиї хром стабільний і чиї маленькі динамічні ділянки дійсно незалежні МСК6 Кожна ямика робить свій власний життєвий цикл кэшу ммSK7 саме таким чином панель управления може стати всередині несумісною МК8 МСК9
Сигнальний Шінґл Один гидратований МSK2 покоління МSK3 зашифрована модель сторінки плюс версії фрагменти доставки виджетів Dashboard, чиї частини мають бути відредаговані незалежно і продовжувати описувати один стан граничною межою кэша є сконструована проекція ; звідси беруться шинглі M SK2 не конкуруючих магазинів МSK3

Уровни-2 shingles є вихідний кэш, навмисно маленький і фрагментарний - у форміM SK2 Різниця в тому, що фрагменти не вирішують реальність даних незалежно від них МSK3 Модель контенту побудована першими МСК4 під одним поколінням М СК5 кожен шингл є рендеруванням цієї моделі

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;

Коли дані змінюються, впливова комбінація отримує нове поколінняM SK1 Браузер може коротко побачити попереднє, в той час як оновлення є в польоті, але ця вікова різниця і обмеженаМSK3 Це ніколи не набір окремогоMSC4 придбаних кэшів, які висловлюють суперечливі заяви про MST5 теперMSL6

Один орган МСК0 одна збудована генерація МSK1 багато повторюваних фрагментів доставки .


Перший - МСК0, другий - поступовий покращення

Сигнал Шінґл - це не інтерфейс JSON з клієнтом- boчна панель, намальована зверху . Модель Stylo МSK2 панель Bot - це Razor SSR першими МSK3 значні рахункиM SK4 діаграми, таблиціMSC6 посилання і навігації перед запуском JavaScriptMST7 HTMXMSSK8 SignalR та Alpine потім покращують цю сторінку, а не замінять її MST9

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 просить HTML і swaps the returned island. SignalR supplies a small dirty signal rather than JSON models


Refresh - це запланована робота, не випадковий побічний ефект руху

Обновлення відбувається за межами page request. Це важка межа M SK1 холодне читання повертає результат нагрівання, тоді як тільки тик матеріалізатор створюєМSK3 Page Request - це чтення послідовної проекції , ніколи не виправдання для того, щоб розпочати дорогий обробок даних

Координатори стояли в чергах і недавно МСК0 читали конверти МSK1 потім нагрівають їх у замкнутих хвилях сторінкою - рахунками та стінами МСК3 budżeтом годинника MСК4 Всередині хвилі він наділяє комбінацію роботи М СК5 вимірюваний бюджет витрат може повністю зупинити наступні хвиля M СК6 Це не так Task.WhenAll вдягнаючи нове ім 'я.

Конкуренційна межа є частиною коректності : цикл поновлення отримує відомі витрати на пропускну спроможність , ніколи не нескінченний набор з 'єднань МSK2 Полне тепле оновлення не робить жодного складу чи рендеринга Razor

Оркестрований, не штормM SK1 Ось як працює правило.

Упереднє нагрівання є покрытием, не обов 'язково

Cache не може захистити першого запиту, якщо він тільки нагрівається після що запит приходить. Таким чином, матеріалізатор має дві роботиM SK1 Погані вказівники зберігати справжнє число вікон: Запроси-записані конверти фільтри, які люди насправді використовують, класифіковані за кількістю доступів та достаткомM SK1 Лише справжня просьба зберігає одного живого.

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;

Упереднє нагрівання має бути відповідає реальній поверхні продукту. Якщо в інтерфейсі є чотири звичайні вікна, а нагрівювач знає одинM SK1 три чверті очікуваного першого - шлях клікання все ще холодний.


LFU - це не просто виведення : це сигнал попиту

ЛФУ - це більше, ніж виведення звідтиМСК0 Доступ - це сигнал попиту МСК1 він вирішує, що залишається rezidentомМ СК2 яка спочатку обновлюється завдяки роботіМ סК3 і що може впевнено зникнутиМ S К4 що робить безмежний простір для фильтров під контролемМ Ш К5 країнний фильтр, спостеріганий цілий день, залишається теплемМ הסК6 фильтра, яку спробували, коли ви старілиМ וסК7 немає окремого МСК8 популярної панелі приладівМ לסК9 потрібна таблицяМ בסК10


Пристосовується до статичного

Традиційні живі панелі керування реагують на більше потоку, роблячи більше роботи, тоді вони стають найменш корисними в місці, де їх найпотрібніші оператори . Сигнал Шінґл повертає цей зв 'язок МSK2 Контролер odświeżania вимірює вартість odświeżення в залежності від бюджету M SK3 дорогі цикли розтягують ефективні відстані , дешеві контрактують у напрямку запрошеної к cadence

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

Це закрита петля на захищеному ресурсі, не підозрюю від сирого RPSM SK1 Під завантаженням система рухається у напрямку статичного знімку, замість створення більшої роботи з базою даних для підтримки неможливих перспектив життєздатності

Завантаження змушує панель до праці менше, не більшеM SK1 Ось чому модель знижується, а не руйнується.

МSK0Статичний” не є проваломM SK2 Це остання відома кохерентна передбачення МSK3 обмежена політикою свіжості і оznakована чесно .

Статичний/динамічний гібридM SK1 з дизайну

Статична половина - це контракт реагування : швидкий , koherentний знімок з кэшових рівнів \ . динамічна половина - окремий бюджетований процес | МSK3 \ Скинер \ МSK4 \ підготовані due checks | , \ опційне прискорення сигналу R для живих виконувачів \МSK6 \ і реконект \ мSK7 \ реакція залишається швидкою навіть, коли знімок стає старшим \ , \ а вік залишається помітним \

Таким чином система може постійно рухатись між двома корисними режимами:

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

Це адаптивне масштабування, вбудоване у архітектуру.


Frischeness належить до виджету: неможливих інваріантів

Не кожен виджет заслуговує на те ж саме свіжість. Тренд-граф чи рейтинг кінцевих точок може бути за хвилинами або годиною післяM SK1 список нещодавніх відвідувачів чи поточних балів потребує жорстшої каденціїМSK2 Каденція живе з виджетомMSC3 клас свіжості.

Клас МSK1 Типові видоконструкції МSK2 Базова каденція Чому
МSK0 Об 'єм підсумокM SK2 тенденції МSK3 країни , кінцеві показники MSК5 хвилини до години МСК6 Сигнал змінюється досить повільно, щоб стати більш цінним за турбування
Наживо МSK1 останні відвідувачіМСК2 сеансиМ СК3 ім 'яMСК4 балиM СК5 загрози МСК6 приблизно за хвилину MSК7 Оператор шукає те саме, що відбувається

Два видимі ідентичні виджети можуть попросити про різні каденції. Введення каденцій у ключ кэшу скопіює даніM SK1 прийняття першого каденсу може залишити позднішнього споживача безладним

Інваріант простий:

Спільний запис в кэші ніколи не повинен служити стелеру більше, ніж будь-який з його активних потребувачів..

Формально:

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

Cadence - це один споживач поверхняМСК0 не є частиною підписуМSK1 Якщо один споживач просить 60 секунду, а інший - на п 'ять хвилинМСК3 один спільний запис обновлюється кожні мСК4 секундіMСК5 Коли швидкий споживач покидаєМ СК6 перераховує мінімальне числоM СК7 коли не залишається жодного споживачаМ סК8 припиняє планування і дозволяє ЛФУ його повернутиМ הסК9


Справжні правила хрома та консенсусу

Пристосовальна система повинна бути чесною щодо своєї адаптації. Кром Widget показує теперішню ефективну каденцію M SK1 “aktualizуючи кожен МSK3s”, \“aktualізуючи кожен

Існує кілька правил, які мусять бути чесними для прогнозування.

  • Зразки поколінь. Кожен кусочок/ шингл записує генерацію даних, яку він створив зM SK1 Потворний сигнал і відповідь можна порівняти , тому старіше оновлення не може переписати нове
  • Коалесовані сигнали. Зайняті детектори можуть викликати багато подій за секунду. Сигналовий шлях переміщує їх в один брудний сигнал та одне рішення проновлення, а не запускає браузер чи цикл проновуванняM SK1
  • Перетворити наново підключення. Перезв 'язок не сприймається як доказ того, що нічого не сталося.
  • Обмежений падіння TTL. Утримований шматок не може стати безсмертним.
  • Немає витіку контенту. Живі шинглі можуть містити імена, відбитки пальців або балиM SK1 їхній зміст зберігається в пам 'яті , не зареєстровані , і будь-яке діагностичне редагування їх по замовчуванню

Метою не є миттєва послідовність. Це проекція, чиї вік і покоління обмеженіM SK1 помітна та ніколи не випадкова .


Проблема та рішення

Ось вся торгівля в одній таблиці.

МSK0 ВключноM SK2на żądaний вентилятор МSK3в' язні Двухслойний сигналовий шиньґл \
Запрос сторінки Починає отримувати N дані та чекати МSK2 Переczyта готовий модель МSK3 забирає і відображає сховище СМСК4
Обробка даних МSK1 Повтори на відвідувача МSK2 Поширені , інкрементальні
Обновлення виджета МSK1 Кожний виджет може завантажуватись незалежно ♫ ♫ Warm shingles serve directly ♫ МSK3 ♫ Misses compose as a batch ♫
Конкуренція МSK1 Task.WhenAll зростає з рухомості Обмежені хвилі обновлення з вимірюваним бюджетом витрат
Фильтровані перегляди МSK1 Чи то безcach, чи безмежно МSK2 Горячі комбінації залишаються наживо МСК3 холодні LFU М СК4 виняткові M СК5
Завантаження реагування МSK1 Більше дорожнього руху створює більше роботи МSK2 Більше витрат розтягує каденцію до статичного
Frischeness Implicit and often inconsistent МSK2 Explicit per widget
Невправний режим МSK1 Повільні запити МSK2 вичерпання басейну , зруйнування

Сигнал Шінґл складається з знайомих ASP. NET-комп 'ютерів : LFU, Сигналу РM SK3 складного комбінату МSK4 RazorMSC5 HTMX і планувальника з реальним бюджетом співрозбігуМSK6 Мережа залишається авторитетноюMska7 веб-сайт виконує проекціюM Ska8 браузер отримує маленькі фрагменти версіїMска9

Переміщувати рендерацію з-за маршруту запиту. Дозволяти завантаження throttle відновлювати роботу, а не реакцію.

logo

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