用于高@- @ 性能 ASP_ .}NET moto\ MS K3widget 站点的新建筑Name (中文 (Chinese Simplified))

用于高@- @ 性能 ASP_ .}NET moto\ MS K3widget 站点的新建筑Name

Friday, 24 July 2026

//

8 minute read

您如何快速回应复杂的仪表板而不发疯 @ ? @ 停止在请求路径@ MS K1 上添加这些响应?


问题在于 @: @ per @ -_ 请求粉丝@ MS K2 @ out

仪表板是一种非常昂贵的页面@.}它看起来像一个 URL @,}(但其实是一个配音引擎,上面印着“-”形大衣}♪.}*

一个已部署的仪表板:摘要对数MS K1一个时间-系列图表\ ,bot list,端点和国家视图都共享一页,同时保留独立更新表面@.#

操作员看到一个仪表盘@;}服务器看到慢速 @-#移动集成 ,活名单和昂贵的窗口视图.}

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 实施时, 每个部件都有自己获取数据的部件@,}开始同步拨打这些电话。 然后在翻譯该页面前等待所有电话。 @.}

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;

它与一个人和一个小数据集“MSK09个独立电话重叠” “,所以页面需要大约只要它最慢的部件, 而不是它们的总元件就足够长的时间。 当网页成为大众版时算术会改变@.}

Stylo. 蝙蝠侠 jacknock ,}一个正常的页面负荷意指在网站上大约9个平行呼叫@/QGateway 边界.}#30-#day 檢視可以掃描一百萬列以上的網頁 *.} Task.WhenAll 大约十次昂贵的手术 每个访客都开始另外一次

在5个同时的观众中 . @MSK49通电话成为40-}5个相互竞争的调用@.}在50个查看者中,是450.。 数据库连接库看到一场日益扩大的独立昂贵工作的风暴_.―请慢下来#,}保持连接更长的时间,}并减缓下一个请求

平行扇*-_Out通过乘以在负载下摧毁系统的压力来更快地查看单一请求@.#

这对仪表板来说是错误的缩放曲线@ . @ 一个仪表盘是一个共享的观测面@ I. @ 它应该会变得更便宜, 因为更多的人看同样的东西@ MPK2# 没有更昂贵的@.}


解决方案@:信号闪烁

信号闪光将每个仪表板部件作为预@ - @ rendered, @ self @ MS K2} 足装的页面片段 .} 它的身份是它所代表的数据,以及它是如何被转换为 < :} 元件{,} 行,} window@,}过滤器和显示参数>%.}刷新通道并非该身份的一部分

它的指纹很简单 widget + normalised parameters + data-surface generation. 国家更新不应取消活的@- visitors card @; 更改后的过滤器不应该让其他部件都感冒@MS K3 新一代只重新-Kkeys 受影响的shingle}.

这些碎片生活在一个捆绑的 LFU 缓存@. @}溫暖讀者讀者: 持續監視的元件

信号R 表示一个表面已更改@; @ 客户端询问受影响的部件批量@ ;} HTMX 应用返回的 Idiorrent\ MS K2of}-}带片段和 Idiorphorm * .} 这个信号含有肮脏的提示@ MPK5}从没有过仪表板数据的副本=.}

在图案中的“,”中 信号讯号 意指““”或“考虑刷新”和 “”;” 闪闪 是独立可处理结果@. @%

如果每个失手者都启动新的数据库扫描 , ,那么昂贵的工作仍然非常昂贵。 “.”信号星光使用两个“-”级缓存和一个刻意窄小的暗藏器“MS K5”

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;

两个缓存级别 @ :# 数据保留权威@ MS K1} 演示文稿保持待命

两者的区别是: 型号模型 和其实际数额 构件交付装置任何藏匿处都无法成为探测数据的权威

增量桶

该网关拥有数据@., 它持有一个在 @ - memory LFU 中捆绑的“ MS K1}” 连接的LFU投影: 递增的“ ,” 窗口式桶, 配有 “ 30-” 天滑动保留 : 一个工作套件+,* 不是第二个数据存储器=.}

使用精细的桶用于 6 @-}小时和 24-hour changage table_,}小时对长窗口的滚动@.}关键是请求的窗口将桶合起来,而不是重新-}阅读原始事件=.}

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

新的观察更新了最新的桶.}历史部分没有被重新删除, 因为页面已加载@.}这个网关仍然是唯一的作家和唯一决定探测意味着什么的地方 @.}

缓存级别 @ 1 @ I:水分内容缓存

上流@,}网站缓存水化仪表板模型,}由正常部件键入的...

保存 CSRF 值@,}认证chrome @,}在请求中的标记和非括号 * - rendered shell where they belongs *\ MASK3}

在冷键上 @, 返回一个清晰的变暖状态, 而不是同步重计@. 只有滴答器能赢得新的页面结果 @MS K2 后来读到为最新成功的一代服务, 即使新来的在飞行中#.

缓存级别 @ 2 @ I: @ shingle 转换缓存

仪表板刻意分割@:(网关拥有数据) @;(网站拥有Razor)和浏览器关系;(它只持有来自网关_-背面页面模型>.}的版本HTML

一旦页面模型存在 ,}一元件可以作为 OOB 元素制成,并保存在连接的 LFU Shiingle 缓存中,带有安全性 TTLQMS K1 一个温暖的闪烁绕过构成和 Razor 翻譯\ ; {一个错误读取已经@-}/ warm 页面结果(如果可能) @, 使该部件只添加\ MPK5} hx-swap-oob="morph"@, 并存储结果 在它的指纹@.

批次端点分区部件组成温暖的指纹, 而 miss@ , 构成支持的错误一次 * MS K1}\ 返回 OOB HTML .} a 摘要或国家更改为\ MPK3\ keys 只表示表面@.}

这不是多余的 chaching @ . @ 级别 @ MPK1 @ 回答 @ I“} 什么是一致的仪表板模型@ MS K3 等级 @ OMK4 @ 答案 @ MOSK5# 这个浏览器岛能接收什么\ ?”} 第一个可以共享构成 *;} (第二个可以让部分更新几乎免费) @.}


缓存边界@: @

回应缓存值得直接比较“. 正常响应缓存存储 一个不透明的 HTTP 解答 “; 独立缓存部件开发独立的过期和失效模式@. ”页面可以快速加载, 同时不再描述一个一致的状态. 在操作仪表板上 < , 与它下面的行不符的计算使得操作员调查幽灵>=.}

熟悉的缓存模式都是有用的 它们只是保护不同的边界

”模式“ ”它储存什么?
HTTP响应缓存 @ HTTP回应@,通常由 URL 键入, 并请求 <-vary rules }公共获取端点和 CDN-}方便的內容{ 它完全不知道仪表板='内部部件或者它们的数据是否同意>.# @MS K9}
Q 昂贵的页面, 固定请求 @-}空间@ * 它可以快速缓存网页 *,}但它仍然是不透明的页面结果 而不是协调的现场投影+. @ @ @MS K10}
@ ,_ 或独立缓存的碎片@ _ Pages 其铬稳定且小动态区域是真正独立的 @ } 它使每个洞都拥有自己的缓存生命周期\ ;,这就是仪表板如何在内部变得前后不一致吗?
信号闪烁 1 水合 , 一代- 標章頁樣本加上版本的部件交付碎片 一个其部件必须独立更新的仪表板 继续描述一个状态 @ @ 缓存边界为配制的投影@ MS K1} shingles 是来自它的 ,} 不是竞争商店 @ MPK3 * @ I }

关卡@-2_闪烁 输出缓存@ , @ 故意小和碎片@ I-_ magid @ MS K2} 区别在于碎片不能独立决定数据现实 * . 内容模型由 1 代以下的 first\ ,\ 组成 ;\ 每一个闪烁都是该型号的成份 's cliche=.}

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;

当数据改变@,}当受影响的成分接收到新一代的#. 浏览器可以简要地看到上一个版本, 而更新在飞行中 @,, 但这个年龄是明确和相交的.。 它从来不是一组单独的%-}拥有的缓存, 其中对 &“Now_”.}提出相互矛盾的要求

一个权威 , 一种构成的一代 MS K1 许多可重复使用的投射碎片.


逐步提升第二

Stylo.Bot 仪表板是 RazorSSR 的首个有效的对应方 @:}{,}海图_,}表格,}链接和导航 在 JavaScript 运行@.}HTMXMS K8}信号R and Alpine 前

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 并交换返回的岛屿@. @signalR 提供一个小脏信号, 而不是 JSON 模型_.}Alpine 拥有本地 UI 状态 菜单,} 切换和配方不值得使用圆环-trip}.}去掉其中任何一个页。


刷新是预定任务@, @}不是交通意外副作用

重新刷新在页面请求@. @ 这是硬边界 @ :} 一个冷读返回变暖结果@ MS K2, 而只有滴答器组成了\ .{ 页面请求是一致投影的阅读@ MPK4}从不成为开始昂贵数据工作的借口 @.}

协调者队列被固定并最近@-}读取信封 @,}然后在捆绑的波浪中用页面#-count and wall_-clock building*.o} 在它分批匹配工作的波里 =;}一个计量的成本预算可以阻止以后的波流完全.}这不算什么 Task.WhenAll 使用新名称@. @%

组合货币限制是正确性的一部分 @: 刷新回路获得已知的能力预算@, never a unfounded communited . 完全暖和的更新并不包含构成或 Razor 翻譯@MS K3

管弦乐队=,}不是暴风雨.* 这就是操作规则 .

升温前是覆盖@, @% 不是愿望的缓存

只热的缓存无法保护第一个请求 之后 此请求已到达@ . @ so the register has two jobs=. @ Pinned 默认缺省 保留真实的 @6@h,}#24_H•,}{7}和@30*d 窗口选择取暖#MS K6} 要求的--gated信封 覆盖过滤器实际使用的人,}按存取计数和中度计算排序 <%.>}只有真正的请求才能保存一个活的{.

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;

如果UI提供四个正常窗口, 暖气者知道第一个#,}3/4的预产物路径仍为冷 @.}


LFU不只是驱逐 :#这是需求信号

LFU 不只是驱逐在这里@. @Access is the Demand signal signation _BARBAR_它决定了哪些仍然是常住的,}(该工作是否仍然值得刷新) 首先#,}和什么可以安全地消失.}使无限制的过滤空间能够被控制吗?.}一个全天监视的国家过滤器


向静态适应

传统的实时仪表板通过做更多的工作来应对更多交通流量,然后在操作员最需要的时候变得最少有用。 “.” 信号光照(Signal Shingle) 扭转了这种关系“.” 更新控制器根据预算“MS K3” 昂贵的周期衡量刷新成本。

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

这是对受保护资源的闭路循环@, @% 无法从原始 RPS @ .}} 加载系统向静态快照移动而不是创建更多的数据库工作来维持一个不可能的活性承诺=.}

负载使仪表板减少工作@, @ not more @.}所以图案会退化而不是崩溃=.}

这是最后已知的一致投影@,_受新政策约束, 并贴上诚实的标签 @.}

一个静态的/ 动态混合 *,按设计

静态一半是响应合同 @:}一个来自缓存水平的快速,}一致快照_. 动态一半是一个单独的预算流程 ~:{调度-}驱动的到期应答检查,}任选信号加速器 对于活部件@,}和重新连接 reync.}这个回应仍然很快 即使当抓图变老时

这样系统就可以在两个有用的模式之间连续滑动@ : @

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

这不是在游泳池失败后添加的恐慌开关@.


更新属于部件@ : @ 1 non MS K1} 可转让变量

不是每个部件都配得上相同的新鲜@. @ 趋势图或终点排名可以是小于 @ ;} 最近访问者或当前分数列表的分钟或小时, 或者需要更紧一点的candence@ MS K2 。 音节与元件一同生活\ ' @ sregness class # .#

-=YTET -伊甸园字幕组=- 翻译: |---|---|---:|---| @|Agress accountry_BARBAR|},}趋势: ,}(各国) <,}♪端点:"|>-分钟到一个小时#|} 信号变化足够缓慢,稳定性比churn@.}更宝贵 @|ZLive |Q}最近的访客,QA 会话MS K3Q 名字\ ,Q分数{,Q 威胁@|Q 约一分钟左右}#|Q 操作员正在寻找当前运动_.Q NSK9}

两个明显相同的部件可以要求不同的逗号@ . @ 在缓存密钥中插入 candence 重复数据\ ;} 接受第一个可留下一个较晚的消费 stale.}

变量是简单的@: @%

共享缓存条目绝对不能为粘贴器服务, 而不是任何活跃的消费者要求的. @% 1

正式的:

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

Cadence is a per-消费者 下楼“,”不是签名的一部分“.” 如果一个消费者要求“MS K2 秒”,另一个5分钟“,” 一个共享的条目复习,每个@60 秒” @.“当快速消费者离开<,> 重新计算最小值$; 时, 当没有消费者继续保留‘,’ 停止排期让 LFU收回它’.}


诚实铬和一致性规则

一个适应性系统应该诚实地对它的适应性表示 <. 元件染色体> 显示当前有效的航段 < : * @ MS K2 _ 更新到每个 < I60\ s@ ”,\ { NSK5\ } < MASSK7\ mZQ\ MSKO7 > “ data\ MESK9}

有几条规则需要 保持一个诚实的投影

  • 发行邮票 每个块@ / @ shingle 记录它从 .} 一个肮脏的信标中创建的数据生成, 可以比较响应 # MS K2} @ 这样旧更新无法覆盖新视图@ MPK3}
  • 折叠信号 . 繁忙的探测器每秒可能生成许多事件, 信号路径将它们分解成一个肮脏的信标和一个刷新决定, 而不是点燃浏览器或更新环@ .
  • 重新连接后再同步@ . @ 重新连接不作为未发生意外的证据@. @ a dueQ-_ check 关闭缺失的@ -# pulse 差距确定=.}
  • TTL 折叠后退@ . @ 保留区块一旦超过等级,且无法刷新#,,便不能成为不朽的@.。 它会变得寒冷 @/}升温而不是永远静默地躺着*.
  • 无内容渗漏@. @% 活闪光可能包含名称@, @ 指纹或计分@ .} 它们的内容留在记忆中@ I,没有登录@ MPK3{ 并且任何诊断都默认会修改@ OMK4}

目标不是即时一致 . 它是一个年龄和生育相交的预测


问题和解决办法

整个交易都放在一张桌子上

@ @ @ @ Per-}請求粉絲@ MS K3#out @ MPK4 @ 讯号双层 @ I @
@ 页面请求@ 启动 N 数据抓取并等待 @ 读一个现成的模型#/chunk, 并且将空壳变成 *
”数据工作“ ”重复每个访客的重覆 ” @ 共享$, 递增 ,桶"- 支持“MS K6”
@ @ 元件更新@ MS K1 @ 每个部件都可以独立获取 @ I @ 温暖的闪烁器直接服务 @ MPK3 @ 缺失的拼写作为批量 @ } @
-=YTET -伊甸园字幕组=- 翻译: Task.WhenAll 使用量测成本预算的“ ”环绕刷新波
”过滤过的视图“ ”或者没有显示或未锁定的 “热组合仍能维持住 =; }冷组合 LFUQ-evict @
负载响应 @ 更多交通创造更多的工作”“ 更多的成本拉伸向静态@
@ -_ acidence safe for share entits @ MPK5} 共享条目的安全性 @ I @
”失败模式“ ” 缓慢请求“MS K2” 游泳池耗竭$, 崩溃“ @ 年老但贴上标签的投影+, 捆绑的工作@

信号闪烁拼写了熟悉的 ASP.NET片段 @: LFU},SignalRMS K3批量合成@,Razor,HTMX 和一个有真实货币汇率预算的排程器.}(网关保留权威)>;网站提供投影=;}浏览器接收小版本的碎片

切换请求路径@ . @ Let attle restall work 而非响应Q.}

Finding related posts...
logo

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