社交平台系统工程模型

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0001

基础理论模型

分布式系统

一致性状态机复制模型

Paxos共识算法

目标:在异步网络、允许宕机但不容忍拜占庭故障的系统中,就一个值达成一致。
1. 角色划分:提议者(Proposer)、接受者(Acceptor)、学习者(Learner)。
2. 阶段一 (Prepare阶段)
- 提议者生成全局递增的提案号 n,向多数派接受者发送 Prepare(n)请求。
- 接受者若未响应过编号大于 nPrepare,则承诺不再接受编号小于 n的提案,并回复其已接受过的最高编号提案 (n_a, v_a)
3. 阶段二 (Accept阶段)
- 若提议者收到多数派的 Promise回复:
- 如果所有回复中 v_a为空,则使用自己的值 v
- 否则,选择所有回复中编号最高的提案值作为 v
- 发送 Accept(n, v)给接受者们。
4. 学习阶段:接受者若未承诺过编号大于 n的请求,则接受该提案 (n, v),并通知学习者。学习者收到多数派接受者的接受消息后,学习到值 v

活性(Liveness):在无故障和消息竞争下保证达成一致。
安全性(Safety):已达成一致的提案值不可更改。

FLP不可能定理、状态机复制理论

微信后台核心配置的同步、主从切换决策。特征:高容错、强一致性、延迟敏感。

n: 提案编号 (整数,单调递增)
v: 提案值
n_a: 接受者已接受提案的最高编号
v_a: 对应 n_a的提案值
“多数派”:节点数 N 中的至少 ⌊N/2⌋ + 1

逻辑、集合、代数、构造、算法、收敛性

形式化协议描述语言

1. T0: Proposer 分配 n。
2. T1: 发送 Prepare(n)。
3. T2: Acceptor 处理 Prepare,若满足条件,回复 Promise(n, (n_a, v_a))。不等式条件:收到_n > 已承诺的 max_n
4. T3: Proposer 等待多数派回复,决策 v。
5. T4: 发送 Accept(n, v)。
6. T5: Acceptor 处理 Accept,若满足条件,接受并广播 Accepted(n, v)。
7. T6: Learner 收集 Accepted 消息,达到多数派则学习 v。

消息流定义为有向图 G=(V, E)V是进程节点,E是消息边。消息 mProposer_iAcceptor_j的流动:flow(m, i->j, t)是时间 t的函数。共识达成等价于在消息流图上存在一个从多数派 Acceptors到所有 Learners的广播生成树,其根是已锁定的提案值 v

分布式计算理论、异步网络模型、容错计算

工业自动化中的多控制器同步、数字化系统中的全局状态同步

CPU执行提议/接受逻辑;内存存储提案状态 (n, v, promise_n);网络接口发送/接收消息。数据流:逻辑核心产生消息 -> 内核协议栈打包 -> 网卡DMA发送 -> 网络传输 -> 对端网卡接收/DMA至内存 -> 内核解包 -> 应用逻辑处理。

CPU: 数万核心集群,处理轻量级逻辑。时钟: 不依赖严格物理时钟,依赖逻辑时钟/提案编号。队列: 每个节点有输入/输出消息队列。网络: 数据中心内 RDMA 网络,微秒级延迟,>100Gbps 带宽。内存: 存储状态,亚微秒访问。存储盘: 用于持久化日志。

Chat-0002

核心算法模型

网络通信

自适应拥塞控制模型

BBR (Bottleneck Bandwidth and Round-trip propagation time)

目标:最大化吞吐量,最小化延迟,避免缓冲区膨胀。
1. 建模:将网络路径建模为一个管道,其容量为 BtlBw * RTprop
2. 测量核心参数
- BtlBw(瓶颈带宽): 最近一个时间窗口内的最大交付速率。BtlBw = max(delivered / Δt)
- RTprop(往返传播时延): 最近一个时间窗口内的最小RTT。RTprop = min(RTT)
3. 状态机
- STARTUP: 指数增长发送速率,直到交付速率停止增长 (delivered增速放缓),表明触达 BtlBw。转入 DRAIN
- DRAIN: 排空 STARTUP阶段建立的队列,转入 PROBE_BW
- PROBE_BW: 稳态,周期性地探测带宽。以 gain系数 (如 1.25, 0.75) 调整 cwnd,周期约为 RTprop
- PROBE_RTT: 每 10s,进入此状态,维持 cwnd=4至少一个 RTprop,以测量最小 RTT
4. 发送速率控制pacing_rate = gain * BtlBwcwnd = BtlBw * RTprop + 缓冲区容忍量

与丢包无关,对延迟变化敏感,可逼近物理带宽瓶颈,排队延迟低。

网络流体力学的“数据包守恒定律”、排队论

微信视频通话、朋友圈图片/视频加载。特征:高带宽利用率、低延迟、避免全局同步。

BtlBw: 瓶颈带宽 (bps)
RTprop: 往返传播时延 (s)
delivered: 已确认交付的数据量 (bytes)
Δt: 时间间隔 (s)
RTT: 往返时间 (s)
cwnd: 拥塞窗口 (packets)
pacing_rate: 发送速率 (bps)
gain: 探测增益系数

优化、极限、连续性、微分、统计特征

控制循环描述

1. T0: 连接建立。
2. T1: 进入 STARTUP,gain=2.89,每个 RTT 倍增 cwnd。监测 delivered
3. T2: 当连续3个RTT内,(Δdelivered/Δt)_current < 1.25 * (Δdelivered/Δt)_prev,判定到达 BtlBw,进入 DRAIN。
4. T3: DRAIN阶段,gain=0.35,清空队列,进入 PROBE_BW。
5. T4: PROBE_BW 稳态循环 (8个周期):
- 周期1-6: gain=1.25,上探。
- 周期7-8: gain=0.75,下探。
- 循环往复。
6. T5: 每 RTprop更新一次 cwnd = BtlBw * RTprop
7. T6: 每10秒,进入 PROBE_RTT,持续 max(200ms, RTprop),然后返回 PROBE_BW。

数据流速 F(t)的动态方程:
dF/dt = k * (BtlBw_est - F(t- RTprop)) - μ * (Queue_est/RTprop)
其中,BtlBw_est是估计带宽,Queue_est是估计的排队数据量。BBR通过测量而非直接解此方程,但行为与之相符。

网络控制论、流体力学类比、最优化理论

自动化中的流量控制、工业互联网中的确定性时延保障

网卡硬件时间戳用于精准RTT测量。CPU计算带宽和RTT估计,并通过pacing时钟或网卡卸载(如TSO/GRO)控制发包间隔。数据流:ACK包到达 -> 内核更新deliveredRTT样本 -> BBR算法模块计算新参数 -> 更新socketpacing_ratecwnd-> 调度器按pacing_rate调度数据包发送。

CPU: 核心负责每连接状态维护和计算。时钟: 高精度时钟(如CLOCK_MONOTONIC)用于pacing。队列: 内核qdisc(如FQ)实现公平排队。网络: 全球骨干网,BBR抗丢包和长肥网络。内存: 存储每连接状态结构体。

Chat-0003

数据处理模型

存储与检索

高维近似最近邻搜索模型

乘积量化 (Product Quantization, PQ)

目标:在十亿级高维向量库中快速查找近似最近邻,用于相似内容推荐、搜索。
1. 向量分割:将D维向量 x划分为 M个子向量,每个子向量维度为 D* = D/M
2. 子空间量化:对每个子空间 m,使用K-means算法独立构建一个包含 K*个质心的码本 C_mK-means目标函数:`min Σ_i

u{i,m} - c{j,m}

^2,其中u{i,m}是第i个训练样本的第m个子向量,c{j,m}是码本C_m中的第j个质心。<br>3. **编码**:对于向量x,每个子向量x_m用其最近质心的索引q_m(x)表示,编码结果为M个索引组成的序列。q_m(x) = argmin_j

x_m - c_{j,m}

^2。<br>4. **量化距离表**:查询时,预先计算查询向量q的每个子向量q_m到对应码本C_m中所有K个质心的距离,形成M x K的距离表。<br>5. **非对称距离计算**:对于数据库中的向量y(用编码[i_1, i_2, ..., i_M]表示),其与查询q的距离近似为:d(q, y) ≈ Σ_{m=1}^{M} dist_table[m][i_m]。此计算仅需M` 次查表与加法,极快。

误差源于子空间的独立量化,导致量化误差。用均方量化误差 (MSE)衡量。可通过增加MK*提升精度,但会增加存储和计算量。

向量量化理论、高维空间几何、聚类分析

微信“搜一搜”的图文/视频内容召回、视频号推荐。特征:海量数据、高维特征(如1024维)、低延迟检索。

D: 原始向量维度
M: 子空间数量
D*: 子向量维度 (D/M)
K*: 每个子码本的质心数
C_m: 第m个子空间的码本,大小为 K* x D*
q_m(x): 对子向量 x_m的量化函数
距离表: 矩阵,`dist_table[m][k] =

Chat-0004

监控系统模型

可观测性

多维时间序列异常检测模型

多元状态估计技术 (Multivariate State Estimation Technique, MSET)

目标:基于系统多个指标的历史正常数据,建立模型,实时检测系统状态的异常偏离。
1. 记忆矩阵构建:从历史正常数据中采集 n个时刻的 m个系统指标,构成 m x n的“记忆矩阵” D。每一列 d_i是一个 m维的观测向量。
2. 状态估计:对于一个新的实时观测向量 X_obs,用历史记忆矩阵中的向量的线性组合来估计其正常值 X_estX_est = D * W,其中 Wn x 1的权重向量。
3. 权重求解:通过最小化估计误差 `

X_obs - D*W

求解W。考虑到D可能病态,使用非线性运算符(如欧氏距离的倒数)构造相似度矩阵,或采用正则化方法。一种经典形式是:W = (D^T D + λI)^{-1} D^T X_obs(岭回归形式),但MSET常使用带核函数的方法。<br>4. **残差与决策**:计算残差向量R = X_obs - X_est。然后计算残差的标准化标量,如“残差平方和 (SSR)” 或 “马氏距离”:SSR = R^T * Σ^{-1} * R,其中Σ是残差在正常历史数据上的协方差矩阵估计。若SSR超过阈值τ,则判定异常。决策函数: anomaly = I(SSR > τ)`。

检测率、误报率。阈值 τ的选择通过ROC曲线在验证集上优化,平衡敏感度与特异性。

多元统计分析、模式识别、系统估计理论

微信服务器集群的CPU、内存、IO、QPS、延迟等指标的联合异常检测。特征:多指标相关性、非参数、可检测未知故障模式。

D: 记忆矩阵 (m x n)
X_obs: 实时观测向量 (m x 1)
X_est: 状态估计向量 (m x 1)
W: 权重向量 (n x 1)
R: 残差向量 (m x 1)
Σ: 残差协方差矩阵 (m x m)
λ: 岭回归正则化参数
τ: 异常决策阈值

线性代数、优化、概率与统计、矩阵论、距离测度

状态描述、告警逻辑

1. 离线建模:收集历史正常数据,构建矩阵 D,并计算 Σ(或其逆)。
2. 在线检测
- T0: 采集当前时刻 m个指标,得 X_obs
- T1: 状态估计。求解 W,例如通过解正规方程:(D^T D + λI) W = D^T X_obs
- T2: 计算 X_est = D * W
- T3: 计算 R = X_obs - X_est
- T4: 计算 SSR = R^T * Σ^{-1} * R
- T5: 决策:如果 SSR > τ,触发异常告警。

系统状态在 m维指标空间中的流动。正常状态点应位于由历史记忆矩阵 D的列向量张成的子空间(或流形)附近。模型估计了状态点在这个正常子空间上的投影 X_est。异常表现为状态点 X_obs显著偏离该子空间,残差 R表征了这个偏离向量,SSR是其加权模长。

Chat-0005

调度与排队模型

系统资源

多级反馈队列调度模型 (应用于RPC框架线程池)

动态优先级多队列调度

目标:优化请求处理的平均响应时间和系统吞吐量,区分高低优先级任务。
1. 队列设计:设置 N个优先级队列 Q_1, Q_2, ..., Q_N,优先级递减。Q_1为最高优先级(如同步调用、关键路径),Q_N为最低(如后台异步任务)。
2. 入队规则:请求 R到达,根据其类型或属性(如带有的“优先级”标签)被分配到初始队列 Q_k
3. 时间片与抢占:每个队列 Q_i有一个时间片 t_i,优先级越高,t_i通常越小(保证响应快)。调度器优先执行 Q_1中的任务,仅当 Q_1为空时才执行 Q_2,依此类推。高优先级队列的新任务可抢占低优先级队列正在执行的任务。
4. 反馈与降级:若一个任务在队列 Q_i中用完了其时间片 t_i仍未完成,则将其降级到下一个优先级更低的队列 Q_{i+1}。这防止长任务阻塞高优先级队列。
5. 动态优先级提升:为避免低优先级任务饿死,可实施“老化”机制。任务在低优先级队列中等待时间 T_w超过阈值 θ后,其临时优先级被提升,可移入更高优先级队列。公式化:if T_w > θ then 重新入队到 Q_{max(1, i-1)}

平均响应时间、尾部延迟、吞吐量。通过调整队列数 N、时间片 t_i、老化阈值 θ来优化。

排队论、调度理论、操作系统的进程调度

微信后台微服务的RPC请求调度、消息推送任务调度。特征:任务混合(CPU/IO密集型)、延迟要求差异大、需防饿死。

N: 队列数量
Q_i: 第i级队列
t_i: 队列Q_i的时间片长度
R: 请求任务
T_w: 任务等待时间
θ: 老化时间阈值
k: 请求初始优先级

离散、排序、队列、优化、随机过程

任务调度策略描述

1. T0: 请求 R到达,属性为 priority_p
2. T1: 入队。初始队列索引 i = max(1, min(N, priority_p))Enqueue(R, Q_i)
3. T2: 调度器选择任务。`j = min{ i

Q_i 非空 }。从Q_j队头取出任务R_cur执行。<br>4. **T3**: 执行计时。累计执行时间t_exec。<br>5. **T4-判断**:<br> - **Case 完成**: 若R_cur完成,则结束。<br> - **Case 时间片用完**: 若t_exec >= t_j且未完成,则Enqueue(R_cur, Q{j+1})(如果j<N)。<br> - **Case 被抢占**: 若有更高优先级任务到达,则Enqueue(R_cur, Q_j)并回到T2。<br>6. **T5-老化扫描** (周期性,如每100ms): 对每个队列Q_i(i>1) 中的每个任务R,检查其T_w。若T_w > θ,则将其移至Q{i-1}`。

请求流被视为一个随机过程。调度器是多队列服务节点。流向:高优先级任务“流”具有优先通行权,可中断低优先级“流”。反馈降级机制使得长时间占用资源的“流”被降级到低速通道。老化机制为等待过久的“流”注入“加速”脉冲,提升其优先级。系统的稳态可以用一组带有反馈和优先级跳变的排队网络模型来描述,如G/G/1 with priority and feedback

实时系统理论、随机过程、资源分配最优化

自动化生产线中的作业调度、数字化制造中的任务编排

CPU核心执行调度器逻辑和任务逻辑。时钟中断或高精度定时器用于时间片 t_i计时。硬件原子操作(如CAS)用于实现无锁队列操作,保证多线程入队/出队的正确性。数据流:网络包到达 -> 网卡中断 -> 内核协议栈 -> 用户态RPC框架 -> 根据请求解析结果,任务描述体被放入相应优先级队列(内存操作)-> 工作线程从队列取任务执行 -> 结果返回。

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0006

APP端模型

UI渲染

声明式UI与差异比对模型

虚拟DOM差异算法 (React-like Reconciliation)

目标:高效更新真实UI,最小化DOM操作。
1. 树表示:将UI结构表示为虚拟DOM树 V,节点为 v = { type, props, children, key }
2. Diff策略
- 同级比较:仅对同一层级的节点进行对比,时间复杂度 O(n)。
- Key优化:列表项使用唯一 key,通过 Map建立 key到旧节点的映射,实现最小移动。
3. 节点差异类型判断
- 类型不同type_old != type_new,则直接替换整个节点及子树。
- 类型相同,属性更新:计算属性差异集 `diff_props = {k: v_new

v_old[k] != v_new[k]}。<br> - **子节点列表对比**:核心算法。设旧子节点列表为O[1..m],新为N[1..n]。<br> 1. 前序同步:while (i <= m && i <= n && sameNode(O[i], N[i])) { i++; }<br> 2. 后序同步:while (j >= i && k >= i && sameNode(O[j], N[k])) { j--; k--; }<br> 3. 新增节点:若i > ji <= k,则将N[i..k]作为新节点插入。<br> 4. 删除节点:若i > ki <= j,则删除O[i..j]。<br> 5. 乱序处理(基于Key):建立O[i..j]key->index映射Map,遍历N[i..k]`,查找可复用节点,记录移动操作。

操作复杂度 O(n)。通过启发式策略(Key, 层级比较)逼近最小编辑距离。

树编辑距离、最长公共子序列、启发式算法

微信小程序、视频号Feed流渲染。特征:数据驱动视图、高效局部更新、跨平台。

V: 虚拟DOM树
v: 虚拟节点
type: 节点类型(如div, Text
props: 属性对象
key: 列表项唯一标识
O, N: 旧/新子节点数组
i, j, k: 数组遍历指针
sameNode(a,b): 判断节点是否可复用,通常 a.key === b.key && a.type === b.type

树、图、遍历、比较、算法、集合、映射

声明式UI描述、状态到视图的映射

1. T0:状态变更,触发新虚拟树 V_new计算。
2. T1:深度优先遍历,对根节点调用 diff(V_old, V_new, parentDOM)
3. T2:节点对比逻辑(如上所述)。
4. T3:生成补丁序列 patchList,每个补丁为 {type: ‘UPDATE_PROPS’, ‘REPLACE’, ‘INSERT’, ‘MOVE’, ‘REMOVE’, ... , payload}
5. T4:在UI线程(或特定渲染线程)中,按序应用补丁到真实DOM/原生控件。

UI状态变化流 ΔState触发虚拟树计算流 F_compute: ΔState → ΔVTree,差异比对函数 F_diff: (V_old, V_new) → PatchSequenceΔVTree转换为一个最小操作流,这个操作流作用于真实UI树 DOM,即 F_apply: (DOM, PatchSequence) → DOM’。整个过程构成一个反馈控制系统,目标是使 DOMV_new描述的预期状态一致。

函数式UI、响应式编程、算法图论

数字化面板的界面动态更新、工业HMI的视图同步

CPU(移动端SoC的AP)执行JS/Native侧的Diff计算。GPU负责后续的图层合成与光栅化。数据流:业务逻辑变更JS对象 -> JS引擎计算虚拟DOM差异 -> 通过JSI/FFI将补丁操作序列传递给Native渲染引擎 -> Native渲染引擎(OpenGL ES/Metal/Vulkan)调用GPU指令更新纹理、变换矩阵 -> 帧缓冲区 -> 显示屏。

Chat-0007

APP端模型

网络与存储

混合持久化与同步模型

操作变换与冲突解决 (CRDTs-inspired)

目标:在弱网或离线状态下,保障本地数据操作的可交互性,并在联网后与服务器状态正确同步。
1. 本地操作记录:用户操作 op(如“插入文本‘A’到位置p”)被立即应用到本地数据模型 M_local,同时存入本地的有序操作日志 L = [op1, op2, ...]
2. 操作可交换/可合并设计:设计操作使其满足交换律或特定合并规则。例如,对于文本插入,定义操作 op = (id, pos, char, prev_id),其中 id全局唯一,prev_id指向其前一个操作。合并函数:merge(op_a, op_b)能产出有序的最终操作列表。
3. 离线延迟提交:网络断开时,本地操作持续累积在 L中。
4. 同步与冲突解决:网络恢复后,将本地未同步的操作日志 L_unsync发送到服务器。服务器维护全局有序的操作序列 G。对于接收到的 L_unsync,服务器执行:
- 变换:针对 opL_unsync中的每个操作,相对于服务器当前状态 G中在其之后发生的其他客户端操作,进行“操作变换” OT(op, concurrent_ops),得到新操作 op',使其可以在 G的当前上下文中正确应用。
- 合并:将变换后的 op'并入 G,并广播给其他在线客户端。
5. 客户端状态同步:客户端收到服务器同步的新操作 op_new后,同样需要相对于自己本地的未提交操作进行变换,再应用到 M_local,以保持最终一致性。

最终一致性:所有客户端在收到所有操作并应用后,状态收敛。
因果一致性:通过向量时钟等机制保障操作的因果顺序。

分布式一致性理论、无冲突复制数据类型理论、操作变换理论

微信收藏笔记的离线编辑、小程序本地数据同步。特征:高可用、低延迟交互、网络不可靠。

M_local: 本地数据模型(状态)
op: 操作,通常为元组 (id, type, args, vector_clock)
L: 本地操作日志(队列)
G: 服务器全局有序操作日志
OT(o1, o2): 操作变换函数,使 o1o2之后执行的效果等价于 o2在变换后的 o1'之后执行的效果
vector_clock: 向量时钟,用于确定操作偏序关系

逻辑、偏序关系、交换律/结合律、状态机、并发控制

操作语义描述、同步协议描述

1. 离线编辑
- 用户操作生成 op
- M_local = apply(M_local, op)
- L.append(op)
2. 同步启动:网络恢复,客户端发送 (client_id, L_unsync)到服务器。
3. 服务器处理
- 对每个 op in L_unsync:
- 查找 G中与 op并发的操作集 C(通过向量时钟比较)。
- 计算变换后的操作:op' = op; for c in C: op' = OT(op', c);
- G.append(op'), M_server = apply(M_server, op')
- 广播 op'给相关客户端。
4. 客户端接收同步:收到 op_new后,对本地的 L_unsync中每个未确认的 op_local,如果并发,则计算 op_local = OT(op_local, op_new)。然后 M_local = apply(M_local, op_new)

数据流是双向的、异步的。客户端操作流 Ops_client和服务器操作流 Ops_server在一个共享的、逻辑上全序的空间中交汇。合并函数 Merge或变换函数 OT定义了如何将两个分支的操作流融合成一条新的有序流。状态 M是操作流按顺序应用的结果函数:M = apply(apply(apply(M_init, op1), op2), ...)。离线时,操作流在客户端本地分支;同步时,分支通过 OT函数进行“编织”合并。

分布式版本控制、协同编辑算法

工业现场分布式数据采集与同步、数字化设计图纸的离线协作

移动端SoC的CPU执行操作生成、变换和应用逻辑。本地存储(SQLite/文件系统)持久化操作日志 L和当前状态 M_local。数据流:触屏输入 -> CPU处理生成操作 -> 写入SQLite日志 -> 异步尝试网络发送 -> 服务器处理 -> 下行同步消息 -> 客户端接收 -> CPU执行冲突解决 -> 更新SQLite和内存状态 -> UI刷新。

CPU: 移动端CPU处理轻量级操作变换。存储盘: 本地SQLite存储,容量与操作日志大小相关。网络: 支持间歇性连接,需处理重连、幂等。内存: 缓存当前数据模型和部分操作日志。

Chat-0008

后端服务模型

消息系统

多收件箱混合推送模型

写扩散与读扩散混合模型

目标:高效支持单聊、群聊、公众号等场景,平衡读写压力,优化消息送达延迟与存储成本。
1. 模型抽象:将用户收件箱(Inbox)和消息发送者发件箱(Outbox)分离。
2. 写扩散(Fan-out-on-write):适用于活跃群聊或公众号。当发送者 S发送一条消息 M到群 G时,系统将此消息 M的副本“扩散写入”到群 G中每个在线成员 U_i的在线收件箱(内存队列)以及​ 每个成员的离线存储中。写入操作数 = 群成员数 `

G

。<br> - 在线推送:for U_i in online_members(G): push_to_inbox_cache(U_i, M)<br> - 离线存储:for U_i in G: insert into offline_msg_table(U_i, M)<br>3. **读扩散(Fan-out-on-read)**:适用于超大群或历史消息拉取。消息M只存储一份在全局消息存储中,关联到会话C。当用户U拉取会话C的消息时,系统从全局消息存储中读取属于C的消息列表,并合并本地的已读位置等信息。<br> - 存储:insert into global_msg_table(C, M)<br> - 拉取:select * from global_msg_table where conv_id=C and seq > read_seq`
4. 混合策略
- 在线消息、活跃小群:优先使用写扩散,保证推送实时性。
- 离线消息、历史消息、超大群:使用读扩散,节省存储和写入放大。
- 用户收件箱是两者聚合视图。

写入放大系数(写扩散)、读取延迟(读扩散)。通过设定群成员数阈值、在线状态等动态选择策略。

推拉结合理论、负载均衡、访问模式优化

微信单聊/群聊消息、订阅号消息推送。特征:海量会话、读写比例极高、在线状态敏感、延迟要求苛刻。

S: 发送者
M: 消息
G: 群组,成员集合 {U_1, U_2, ..., U_N}
C: 会话(单聊或群聊)
inbox_cache(U): 用户U的在线收件箱(缓存)
offline_msg_table: 用户离线消息表
global_msg_table: 全局消息存储表
read_seq: 用户对会话C的已读序列号

集合、映射、队列、优化、分治

消息路由规则、存储与查询逻辑

1. 发送:用户S在会话C中发送消息M。
2. 路由决策
- 如果C是单聊,目标用户T。target_list = {T}
- 如果C是群聊,且 `

G

< 阈值K,采用写扩散,target_list = G。<br> - 如果C是群聊,且

G

Chat-0009

后端服务模型

社交图谱与隐私

动态权限验证与图遍历模型

基于关系的访问控制与图可达性查询

目标:高效判断请求者 R是否有权限查看目标用户 T的某条动态(或资料),涉及复杂的好友关系、黑名单、标签分组、隐私设置。
1. 图建模:将社交关系建模为有向属性图 G=(V, E)
- 顶点 V: 用户。
- 边 E: 关系。如 (A, B, “friend”)表示A是B的好友;(A, B, “black”)表示A拉黑了B。
2. 隐私规则建模:每条动态 D关联一个隐私范围 SS是图 G上的一个可达性子集定义。例如:
- S = {“ALL”}:公开。
- S = {“FRIENDS”}:仅好友可达。
- S = {“FRIENDS_EXCLUDE”, [U1, U2]}:好友中排除特定人。
- S = {“SPECIFIC_LIST”, [Ua, Ub]}:仅特定列表。
3. 权限判定为图可达性问题CanView(R, T, D) = true当且仅当在根据 D的隐私规则 S和关系图 G构造的查询子图 G_Q中,存在一条从 RT的路径,且该路径满足 S的所有约束。
4. 优化策略
- 预计算与缓存:为每个用户的“好友集”、“同组集”等建立倒排索引或位图 (Bitmask),快速判断 R in Friends(T)
- 多级缓存:结果 (R, T, D)可缓存。
- 图数据库查询:对于复杂规则(如“朋友的朋友”),转换为图数据库(如Neo4j)的Cypher查询:MATCH path=(R)-[:FRIEND*0..2]-(T) WHERE ... RETURN count(path) > 0

查询延迟(P99)、缓存命中率。隐私规则的复杂性(路径深度、排除列表大小)直接影响计算开销。

图论、访问控制模型、数据库索引

朋友圈动态可见性、微信状态查看权限、通讯录权限。特征:实时查询、规则组合复杂、数据规模巨大(千亿边)。

G=(V, E): 社交有向图
R: 请求者 (Requestor)
T: 目标 (Target)
D: 动态/资源 (Dynamic)
S: 隐私范围规则
Friends(u): 用户u的好友集合
Blacklist(u): 用户u的黑名单集合
Groups(u): 用户u所属的标签分组

图、集合、逻辑谓词、遍历、可达性

隐私策略描述语言、访问控制查询

1. 请求:收到查询 CanView(R, T, D)
2. T1-缓存查找:查询缓存 Key=(R, T, D_id)。命中则返回。
3. T2-获取规则:获取动态 D的隐私规则 S
4. T3-规则解析与判定
- Case S = “ALL”return true(除非在黑名单)。
- Case S = “FRIENDS”return (R in Friends(T)) and (R not in Blacklist(T))
- Case S = “FRIENDS_EXCLUDE”return (R in Friends(T)) and (R not in ExcludeList) and (R not in Blacklist(T))
- Case S = “SPECIFIC_LIST”return (R in SpecificList)
- Case S = “FRIENDS_OF_FRIENDS”:执行图遍历,BFS深度为2,判断是否存在路径 R -[:FRIEND]-> X -[:FRIEND]-> T
5. T4-结果缓存:将结果写入缓存,设置TTL。

访问请求流 Query(R, T, D)流入一个决策图。这个决策图是一个由逻辑门和集合操作节点组成的流程图。RT的属性(如好友列表、分组)作为输入流入决策图。决策图根据规则 S的定义进行“计算”,例如,S=“FRIENDS”对应的子图是一个“集合成员判断”节点,它接收 RFriends(T)两个输入流,输出一个布尔值流。更复杂的规则对应更深的决策图,可能包含多个集合运算(交、并、差)和图遍历节点。

社交网络分析、属性基加密的访问策略思想、图数据库查询优化

企业知识库的权限管理、物联网设备访问控制

CPU:逻辑服务器执行集合运算和图遍历。对于简单集合判断,使用位图(Roaring Bitmap)在CPU上高效计算。对于复杂遍历,可能调用图数据库服务。
缓存:使用内存缓存(如Redis)存储用户的好友列表位图、隐私设置、热点查询结果。
存储盘:关系图存储在分布式图数据库或定制存储中,边列表按顶点分片。
数据流:API请求 -> 查询缓存 -> 未命中则加载 RT的相关关系集(位图)到内存 -> 根据规则 S执行位图运算(AND, OR, ANDNOT)或发起图查询 -> 返回结果并回填缓存。

CPU/内存:需要海量内存存储社交图的邻接表和位图索引。计算密集型,需多核并行处理集合运算。缓存:多级缓存(本地缓存+分布式缓存)应对热点查询。存储盘:图存储需百TB至PB级,支持高吞吐遍历。网络:内部服务调用频繁,需要低延迟RDMA网络连接缓存和存储服务。

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0010

后端服务模型

负载均衡

一致性哈希与有界负载模型

一致性哈希环与最少连接数混合调度

目标:将海量请求均匀、稳定、高效地分发给后端服务实例,并在实例扩缩容时最小化数据迁移量。
1. 构建哈希环:将哈希空间(如 [0, 2^128-1])首尾相连构成环。对每个服务节点 S_i,通过其标识(如IP:Port)计算 K个虚拟节点(vnode)的哈希值 hash(S_i#k),将其映射到环上。
2. 请求路由:对每个请求 Req,计算其路由键 key(如用户ID、会话ID)的哈希值 hash(key)。在环上顺时针找到第一个大于等于 hash(key)的虚拟节点,该虚拟节点对应的物理节点即为目标节点 S_target
3. 解决倾斜:引入“有界负载”约束。记录每个物理节点 S_i的当前连接数或请求负载 L_i。定义一个全局平均负载 L_avg = (ΣL_i) / N和一个容忍因子 α(如1.25)。当为请求选择节点时,如果其第一候选节点 S_target的负载 L_target > α * L_avg,则跳过该节点,继续在环上寻找下一个满足负载条件的节点。
4. 节点变更:当新增节点 S_new时,仅影响环上其逆时针方向相邻节点到 S_new之间的部分数据/请求。当节点 S_down下线时,其负载由其顺时针方向的下一个节点接管。迁移量近似为 Q_down / NQ_down为故障节点负载,N为总节点数)。

平衡性:请求分布均匀度,由虚拟节点数 Kα控制。
单调性:节点增减时,大部分请求仍映射到原节点。

哈希理论、负载均衡理论、随机分配

微信接入网关、微服务路由、缓存分片。特征:高并发、后端实例动态变化、需保持会话粘连。

H(x): 哈希函数(如MurmurHash3)
S_i: 第i个物理服务器节点
vnode: 虚拟节点,hash(S_i#k), k=1..K
ring: 有序的哈希值环
key: 请求路由键
L_i: 节点 S_i的当前负载(如连接数)
L_avg: 全局平均负载
α: 负载容忍因子(α≥1)
N: 存活节点数

哈希、环、模运算、集合、排序、优化

路由决策逻辑、节点管理协议

1. 初始化:对所有节点 S_i,计算其 K个虚拟节点哈希值,插入有序结构 ring(如红黑树或跳表)。
2. 请求到达:对请求 Req,提取或生成 key,计算 h = H(key)
3. 查找节点:在 ring中二分查找第一个 node_hash ≥ h的虚拟节点 vnode_j,得其物理节点 S_cand
4. 负载检查:获取 L_cand和当前 L_avg
- 如果 L_cand ≤ α * L_avg,则选择 S_cand
- 如果 L_cand > α * L_avg,则从 ring中获取 vnode_j的下一个虚拟节点,重复步骤4,直到找到合适节点或遍历一圈。
5. 转发与更新:将请求转发给选定的节点 S_final,并原子地更新 L_final++
6. 节点故障:从 ring中移除故障节点 S_down的所有虚拟节点,其负载由后续节点自然接管,负载计数器需重新统计。

请求流 Flow_req的键 key通过哈希函数 H映射到环上的点 P = H(key)。节点在环上占据一个区间(从一个虚拟节点到下一个虚拟节点之间的弧段)。请求流被分配到包含点 P的弧段所对应的节点。这定义了一个从请求键空间到节点集合的确定性映射函数 f: Key → Node。当加入新节点时,它在环上“切出”一段弧并入自己,原来落在这段弧上的请求流 ΔFlow改变流向,流向新节点。有界负载约束修改了映射函数,使其变为 `f’: Key → {Node

L_node ≤ α*L_avg}`,是一个带约束的映射。

分布式哈希表、随机分配、流量工程

云计算资源调度、内容分发网络(CDN)节点选择

CPU:负载均衡器(如LVS/Envoy)的CPU计算哈希和查找。内存:存储哈希环数据结构和各节点负载计数器。网络:负载均衡器需高吞吐网卡,进行数据包转发。
数据流:请求包到达负载均衡器 -> 解析包提取key -> CPU计算哈希 -> 查询内存中的环结构 -> 检查负载计数器 -> 修改目的IP/端口为后端服务器地址 -> 通过网卡转发。

Chat-0011

APP端模型

安全与加密

双棘轮加密会话模型

Signal Double Ratchet Algorithm

目标:为实时通信提供前向安全与后向安全的端到端加密,即使长期密钥泄露,过去的和未来的会话消息仍受保护。
1. 三层密钥结构
- 根链(Root Chain):用于派生新的发送/接收链密钥。RK表示根密钥。
- 发送链与接收链(Sending/Receiving Chains):每条链产生消息密钥。CK_s, CK_r表示链密钥。
- 消息密钥(Message Keys):每次加密生成唯一密钥。MK表示消息密钥。
2. 双棘轮
- 对称密钥棘轮:每次发送或接收消息后,对应链的链密钥通过KDF(如HMAC-SHA256)向前迭代一步,生成新的链密钥和消息密钥。CK_{n+1}, MK_n = KDF(CK_n, constant)
- 迪菲-赫尔曼棘轮:在发送消息中偶尔(如每一条或每隔若干条)附加一个新的临时迪菲-赫尔曼公钥 DH。接收方收到后,双方用自己当前的 DH密钥对和收到的对方公钥计算新的共享密钥,并将其与当前的根密钥混合,生成新的根密钥和新的链密钥。RK_{new}, CK_{new} = KDF(RK_{old}, DH(A_priv, B_pub))。这提供了“断后”安全性。
3. 密钥派生函数:`KDF(ck, input) = (HMAC-SHA256(ck, 0x01

input), HMAC-SHA256(ck, 0x02

input))`,输出为新的链密钥和消息密钥。

前向安全:泄露当前链密钥无法解密过去的消息(因消息密钥已删除)。
后向安全:泄露当前长期密钥无法解密未来的消息(因DH棘轮引入了新的临时秘密)。

密码学、迪菲-赫尔曼密钥交换、密钥派生函数、哈希链

微信端到端加密聊天(如安全聊天)。特征:实时异步、抵抗中间人攻击、密钥不可否认性。

IK_A, IK_B: 身份密钥对(长期)
EK_A, EK_B: 临时密钥对(短期)
RK: 根密钥(32字节)
CK_s, CK_r: 发送链、接收链密钥
MK: 消息密钥(用于 AES-256-GCM)
DH(pub, priv): 迪菲-赫尔曼共享密钥计算
KDF(ck, input): 密钥派生函数
N_s, N_r: 发送、接收消息计数器

迭代、随机性、单向函数、群运算(椭圆曲线)

协议状态机描述、密钥派生步骤

1. 会话初始化:双方通过外部方式(如二维码)交换身份公钥和初始临时公钥,计算初始根密钥 RK和链密钥 CK
2. 发送消息
- T2a-生成消息密钥CK_s, MK = KDF(CK_s, “0”)
- T2b-加密:使用 MK和随机数 nonce加密消息 M,得到密文 C = AES-256-GCM-Encrypt(MK, nonce, M)
- T2c-发送:发送 (C, nonce, 当前发送消息序号 N_s, 可选的附带的新的临时公钥 EK_A_new)
- T2d-棘轮CK_s = CK_s(上一步已更新)。如果附带了新的 EK_A_new,则执行DH棘轮:RK, CK_s = KDF(RK, DH(EK_A_new_priv, IK_B_pub))
3. 接收消息
- T3a-处理DH:如果消息包含新的临时公钥,先执行DH棘轮更新 RKCK_r
- T3b-派生消息密钥CK_r, MK_expected = KDF(CK_r, “0”)
- T3c-解密M = AES-256-GCM-Decrypt(MK_expected, nonce, C)
- T3d-棘轮CK_r = CK_r(已更新)。
4. 密钥删除:使用后的 MK立即从内存中清除。

密钥状态是一个随时间(消息序列)演化的确定性状态机。状态转移由两个“棘轮”函数驱动:
1. 对称棘轮(CK_{n+1}, MK_n) = RATCHET_SYM(CK_n),每次发送/接收触发,沿链方向流动。
2. 非对称棘轮(RK_{new}, CK_{new}) = RATCHET_ASYM(RK_old, DH_new),当发送方注入新的临时公钥时触发,该公钥像“扳机”一样,将新的熵注入根密钥,产生新的分支链。
消息流和密钥流相互锁定。密文流 C_i的解密,需要精确同步的密钥流 MK_i,而 MK_i的生成依赖于按顺序处理的双棘轮状态转移。

Chat-0012

后端服务模型

数据处理

流式窗口聚合与状态管理模型

Apache Flink 式 Keyed Windowed Aggregation

目标:在无界数据流上,按键分组并进行基于时间或数量的窗口聚合计算(如每分钟活跃用户数、每5秒错误率)。
1. 数据流抽象:数据流 DataStream<T>,其中每个元素是 (key, value, timestamp)
2. 键控分区:通过 keyBy(keySelector)操作,将流按 key分区,相同 key的数据发送到同一个并行子任务。
3. 窗口分配:窗口分配器 WindowAssigner将元素分配到窗口。例如,滚动窗口:window = ⌊timestamp / window_size⌋ * window_size。滑动窗口:每个元素属于多个窗口。
4. 触发器与增量聚合:触发器决定何时触发窗口计算。使用增量聚合函数 ReduceFunctionAggregateFunction,每来一个元素就更新中间状态 accumulator,避免存储全量数据。acc = reduce(acc, element)
5. 状态后端与容错:窗口的中间结果(acc)和窗口元数据作为状态,由状态后端(如RocksDB)管理。通过分布式快照(Chandy-Lamport算法)实现精确一次语义。快照 Barrier 在流中传播,触发各算子对其状态做 checkpoint。

延迟:从事件发生到结果产出时间。
吞吐量:每秒处理元素数。
状态大小:与窗口数量和数据分布相关。

流处理理论、分布式快照、乱序事件处理

微信视频号实时观看人数统计、支付实时风控、广告点击实时分析。特征:高吞吐、低延迟、事件时间、状态庞大。

D: 数据流,元素为 e=(k, v, t)
K: 键空间
W: 窗口,表示为 [start, end)
window_size: 窗口长度
slide_size: 滑动步长(滑动窗口)
assigner: 窗口分配函数,W = assigner(e)
trigger: 触发器,决定何时对 W触发计算
agg_func: 聚合函数,acc = agg_func(acc, e)
state_backend: 状态后端,存储 (k, W) -> acc的映射

流、窗口、聚合、状态、时间、键分区

流式SQL、数据管道定义

1. 数据摄入:源算子接收数据 e,分配事件时间 t_event和水印 watermark
2. 键分区:计算 k = keySelector(e),根据 k的哈希值将 e路由到下游对应的并行实例。
3. 窗口分配:在窗口算子中,计算该元素所属的窗口集合 {W_i} = assigner(t_event, e)
4. 状态获取与更新:对于每个窗口 W_i,从 state_backend获取其当前的累加器状态 acc(若无则创建初始状态)。然后执行 acc_new = agg_func(acc, e),并将 acc_new写回状态后端。
5. 触发器判断:对于每个窗口 W_i,检查触发器 trigger是否满足(如 watermark >= W_i.end或窗口内元素数达到阈值)。若满足,则发出窗口结果 result = getResult(acc_new),并可选择清除窗口状态。
6. 容错:当接收到 checkpoint barrier n时,算子对其所有状态(包括窗口状态)做异步快照,完成后将 barrier 发送给下游。

数据流 D在时间线上流动。窗口算子定义了一个函数 F_window,它像一组滑动的“收集桶”。对于流中的每个元素 e,函数 assigner将其映射到一个或多个桶 W_i。每个桶 W_i关联一个状态 S_i(累加器)。F_window的内部逻辑是:for W in assigner(e): S_W = agg(S_W, e); if trigger(W, e, watermark): emit(result(S_W))。状态后端是这些桶的“仓库”,负责 S_W的持久化和容错。水印 watermark(t)是一个单调递增的时间函数,它定义了“在此时间之前的事件大概率已到达”,驱动基于事件时间的窗口触发。

数据流编程模型、实时计算、事件时间处理

工业物联网实时监控、数字化产线实时质量控制

CPU:流处理任务分布在多个CPU核心/节点上执行,每个核心处理一个或多个键分区。
内存:状态后端(如RocksDB)利用内存缓存和本地SSD存储窗口状态。
网络:在键分区和算子链之间需要高速网络交换数据。
数据流:Kafka等消息队列 -> 源算子(CPU反序列化)-> 键分区(网络Shuffle)-> 窗口算子(CPU执行聚合逻辑,访问状态后端)-> 输出结果。

CPU/GPU:大规模流处理集群(数千节点)。GPU可用于某些聚合计算(如矩阵运算)。时钟:事件时间和水印的推进是逻辑时钟。队列:消息队列(如Kafka/Pulsar)作为数据缓冲。网络:数据中心内高带宽网络支持Shuffle。内存/缓存:状态后端需大内存和高速本地SSD,总状态可能达PB级。存储盘:用于保存checkpoint和保存点。

Chat-0013

后端服务模型

分布式锁与服务发现

基于租约的分布式协调模型

Google Chubby / ZooKeeper 原子广播与会话

目标:在分布式系统中实现可靠的分布式锁、领导者选举和配置管理。
1. 分层命名空间:数据模型为类似文件系统的树状结构,每个节点(ZNode)可存储少量数据,并有关联的ACL。
2. 会话与心跳:客户端与服务器建立会话(Session),会话有超时时间 timeout。客户端需定期发送心跳(Ping)以保持会话活性。服务器端维护会话的租约(Lease),租约到期则会话失效,其创建的所有临时节点和锁将被自动清理。
3. 分布式锁实现
- 锁节点:锁对应一个持久父节点下的临时顺序节点(EPHEMERAL_SEQUENTIAL)。
- 获取锁:客户端在锁节点下创建临时顺序节点 L。获取父节点下所有子节点列表,如果 L是序号最小的节点,则获得锁。
- 监听前序节点:如果 L不是最小,则监听(Watch)比它小的前一个节点 P的删除事件。
- 锁释放与传递:当持有锁的客户端删除其节点,或会话超时导致节点被自动删除,则下一个序号节点的客户端会收到通知,从而尝试获取锁。
4. 原子广播与一致性:使用 Zab 或类似协议保证写请求在所有服务器上顺序一致。写请求由领导者(Leader)处理,通过原子广播(Atomic Broadcast)同步给追随者(Follower),多数派持久化后返回客户端成功。

强一致性:所有服务器看到的更新顺序一致。
高可用:多数派存活即可服务。
会话超时检测精度:依赖于服务器和客户端之间的时钟同步与网络延迟。

分布式共识、原子广播、租约机制、观察者模式

微信后台服务的主从选举、配置中心、分布式任务调度。特征:强一致性、低写高读、监听机制。

path: ZNode路径,如/locks/resource1
session_id: 客户端会话唯一标识
timeout: 会话超时时间
sequence_number: 顺序节点的序列号
watch: 监听事件,如节点删除、数据更新
quorum: 法定人数,⌊N/2⌋+1
zxid: 事务ID,由(epoch, counter)组成

树、顺序、集合、逻辑、租约、心跳

客户端API调用、服务器端协议

1. 客户端启动:连接集群,建立会话,获得 session_id
2. 加锁流程
- T2a-创建节点:在锁路径下创建临时顺序节点,如 /locks/resource1/lock-000000001
- T2b-获取列表:获取 /locks/resource1下的所有子节点列表 children
- T2c-判断最小:如果自己创建的节点序号是 children中最小的,则获得锁,流程结束。
- T2d-监听前驱:否则,找到比自已节点序号小的最大节点作为前驱 P,并对 P设置 watch(删除事件)。
- T2e-等待通知:进入等待,直到收到 P被删除的通知,然后回到步骤2b。
3. 释放锁:删除自己创建的节点。
4. 会话维持:客户端启动一个心跳线程,定期(如 timeout/3)向服务器发送 Ping 请求,刷新租约。
5. 服务器端一致性:领导者将写请求(创建、删除节点)包装为提案,分配 zxid,发送给所有追随者。收到多数派确认后,提交并应用状态机,回复客户端。

锁的争用被建模为一个排队网络。每个锁请求是队列中的一个作业。队列顺序由节点序号决定。客户端是作业的发起者,ZNode是作业的“令牌”。作业(请求)在队列中流动,只有队首作业持有令牌。监听机制构成了作业间的通知链:当队首作业完成(节点删除),它会通知下一个作业。会话是作业的生命周期持有者,如果作业持有者(客户端)失效(心跳停止),系统(服务器)会自动回收令牌并将其分配给队列中的下一个等待者。整个系统是一个有序的、容错的任务调度器。

分布式锁、领导者选举、配置管理

工业控制中的主备切换、分布式集群配置管理

CPU:协调服务器(如ZooKeeper节点)的CPU处理读写请求、维持会话、运行共识协议。
内存:在内存中维护整个命名空间树、会话超时队列、Watcher列表。
存储盘:预写日志(WAL)和定期快照(snapshot)持久化到本地磁盘,保证状态可恢复。
网络:服务器间用于原子广播的内部通信,客户端与服务器间的长连接用于请求/响应和Watcher通知。
数据流:客户端TCP连接 -> 服务器接收请求 -> 若为写请求,领导者发起提案 -> 原子广播到追随者 -> 多数派持久化日志 -> 提交并应用到内存树 -> 响应客户端 -> 如有Watcher,触发通知。

CPU:协调服务集群(数百节点)处理元数据请求,CPU压力相对较小但要求低延迟。时钟:会话管理依赖服务器的单调时钟。队列:服务器内部有请求处理队列、提案队列等。网络:客户端连接数可能达百万级,需高并发网络框架;服务器间共识通信需低延迟网络。内存:内存中存储整个目录树和会话信息,数据量在GB级别。存储盘:WAL日志需低延迟持久化存储(如SSD)。

Chat-0014

APP端模型

多媒体处理

自适应视频编码与传输模型

感知视频编码与带宽估计模型

目标:在变化的网络条件下,实时调整视频编码参数和传输策略,以最大化终端用户的视觉体验质量(QoE)。
1. 视频复杂度分析:对输入视频帧序列 F_i进行复杂度分析,如计算空间信息 SI和时间信息 TISI = std_dev(Sobel(F_i)), TI = std_dev(F_i - F_{i-1})。复杂度高的片段分配更多码率。
2. 率失真优化:编码器在给定目标码率 R_target下,为每个编码单元(如CTU)选择最佳的编码模式(如帧内/帧间、块划分、QP等),以最小化失真 D。拉格朗日优化:min(J), 其中 J = D + λ * Rλ为拉格朗日乘子,与量化参数QP相关,λ = 0.85 * 2^{(QP-12)/3}(H.266/VVC)。
3. 带宽估计与码率控制:基于实时传输协议(如RTP/RTCP)的反馈,估计可用带宽 B_est。使用滤波器(如卡尔曼滤波器)平滑估计:B_est[k] = α * B_est[k-1] + (1-α) * B_sample[k],其中 B_sample为瞬时吞吐量测量值。目标码率 R_target = γ * B_estγ为保守因子(如0.8),避免拥塞。
4. 自适应分辨率与帧率:当 B_est持续低于某个阈值时,动态下调发送视频的分辨率 (W, H)和/或帧率 fps,以匹配可用带宽。决策可基于查表法或优化模型:在 R_target约束下,求解 (W, H, fps, QP)以最大化主观质量分数 QoE = a*log(PSNR) - b*log(bitrate) - c*frame_loss - d*resolution_change

PSNR/SSIM:客观质量度量。
端到端延迟:从捕获到渲染的总延迟。
卡顿率:播放中断的频率。

信息论(率失真理论)、控制理论、网络估计

微信视频通话、视频号直播。特征:实时性要求高、网络波动大、终端性能异构。

F_i: 第i帧图像
SI, TI: 空间、时间信息指数
R_target: 目标输出码率 (bps)
D: 失真,如均方误差 (MSE)
λ: 拉格朗日乘子
QP: 量化参数
B_est: 估计带宽 (bps)
B_sample: 采样带宽
α, γ: 滤波系数和保守因子
(W, H): 分辨率
fps: 帧率
QoE: 体验质量综合评分

优化、统计、滤波、编码、率失真

编码控制逻辑、网络适配逻辑

1. 采集与预处理:摄像头采集原始帧 YUV,可选进行降噪、缩放。
2. 复杂度分析(周期性或每帧):计算 SITI,更新场景复杂度模型。
3. 带宽估计(周期性,如每100ms):从网络反馈中获取 RTT、丢包率、接收端报告的总接收字节数,计算 B_sample = Δbytes / Δt,应用卡尔曼滤波更新 B_est
4. 码率决策R_target = min(R_max, γ * B_est),其中 R_max为编码器最大能力。
5. 编码参数决策:基于 R_target和复杂度,通过码率控制模型(如VBR/CBR)计算每帧的 QP,或决策是否调整 (W, H, fps)
6. 编码:执行运动估计、变换、量化、熵编码。在宏块/CTU级,计算不同编码模式的 J = D + λ*R,选择 J最小的模式。
7. 封装与发送:编码后的比特流打包为RTP包,通过拥塞控制算法(如BBR,见Chat-0002)发送。

这是一个闭环反馈控制系统。被控对象:编码器和网络信道。控制器:自适应算法。设定点:目标QoE。
前向通路:原始视频流 -> 编码器(参数由控制器设定)-> 网络包流 -> 解码器 -> 渲染显示。
反馈通路:网络状态(带宽、丢包、延迟)和接收端缓冲区状态 -> 带宽估计器 -> 码率控制器 -> 编码参数决策器。
扰动:网络带宽变化、视频内容复杂度变化。控制器通过调整编码参数(QP, fps, resolution)来对抗扰动,使输出质量 QoE稳定在较高水平。

视频编码标准、网络自适应流媒体、控制理论

工业远程视频监控、实时视频会议系统

CPU/GPU:移动端SoC的ISP处理原始图像,NPU/GPU/专用编码器(如H.264/H.265硬件编码器)执行高复杂度编码任务。CPU执行控制逻辑和网络栈。
内存:存储原始帧、参考帧、编码后数据缓冲区。
数据流:摄像头传感器 -> ISP -> 内存(YUV) -> 编码硬件(参数由CPU控制)-> 编码后比特流 -> CPU网络协议栈打包 -> 网卡/Wi-Fi芯片发送。网络反馈信息逆向流动控制CPU的参数决策模块。

CPU/GPU/NPU:编码主要依赖专用硬件,释放CPU。CPU负责自适应逻辑和网络传输。时钟:高精度时钟用于帧率控制和网络测量。队列:编码输出缓冲队列、网络发送队列。网络:无线网络(Wi-Fi/5G)带宽波动大,需鲁棒的自适应。内存/缓存:帧缓冲区大小影响端到端延迟。

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0015

后端服务模型

分布式存储

纠删码冗余存储与修复模型

Reed-Solomon 纠删码 (n, k) 编码与最小带宽修复

目标:将大文件分块并编码为多个数据块和校验块,分布存储在不同节点,在保证可靠性的同时降低存储开销,并优化修复带宽。
1. 编码:将文件分割为k个等大的数据块 D_1, D_2, ..., D_k,每个块可视为一个长度为L的向量(元素在有限域GF(2^w)上)。通过生成矩阵 G(大小为 n×k,前k行为单位矩阵,即系统码)计算n个编码块:C = G * D,其中 D是 k×L 的数据块矩阵,C是 n×L 的编码块矩阵。前k个编码块即原始数据块,后 m = n-k个为校验块。
2. 存储布局:将n个编码块存储在不同的存储节点上,每个节点存一个块。
3. 解码与修复:当至多m个块丢失(故障节点)时,可以从任意k个存活的块中恢复原始数据。选取任意k个存活块对应的生成矩阵的行构成子矩阵 G'(k×k),则 D = (G')^{-1} * C',其中 C'是k个存活块组成的向量。
4. 最小带宽修复:传统修复需要下载k个完整块。最小带宽修复(MBR)通过允许新节点从d(k ≤ d ≤ n-1)个存活节点各下载β大小的数据,使得总修复带宽 γ = d * β最小。这需要设计特定的编码(如再生码)。

存储效率:k/n,即原始数据大小与总存储大小的比值。
可靠性:可容忍任意m个节点同时故障。
修复带宽:恢复一个故障节点所需传输的数据量。

有限域代数、编码理论、图论(网络流)

微信朋友圈图片、视频等大文件的持久化存储。特征:海量文件、高可靠性要求、存储成本敏感。

n: 编码块总数
k: 数据块数量
m = n-k: 校验块数量
D: 数据块向量(k×L)
G: 生成矩阵(n×k)
C: 编码块向量(n×L)
L: 每个块的长度(符号数)
w: 有限域 GF(2^w) 的位数,通常w=8或16
d: 修复时连接的存活节点数
β: 从每个存活节点下载的数据量

线性代数、有限域运算、矩阵求逆、优化

编码/解码过程描述、修复协议

1. 编码
- 文件F被分割为k个数据块,每个块视为GF(2^w)上的L维向量。
- 构建生成矩阵G(通常采用Vandermonde矩阵以保证任意k行线性无关)。
- 计算编码块:C_i = Σ_{j=1}^{k} G_{i,j} * D_ji=1..n
2. 存储:将每个编码块 C_i存储到不同的存储节点 Node_i
3. 读取(解码):当需要读取文件时,从任意k个节点获取k个编码块,构成向量 C'和对应的子矩阵 G'。解方程 G' * D = C'得到 D。若采用系统码,前k个节点存活则直接读取数据块。
4. 节点修复:当节点f故障时,新节点联系d个存活节点(k ≤ d ≤ n-1),每个存活节点计算其存储块与一个特定系数向量的内积,将结果(大小为β)发送给新节点。新节点收到d个β后,通过线性组合恢复出故障节点的原始块。

数据流在编码时从k个数据块扩散到n个编码块,存储到n个节点,称为“编码流”。在修复时,从d个存活节点各流出β大小的“修复子流”,汇聚到新节点,并通过计算“合流”为完整的编码块。整个过程可视为一个多源单汇的网络流,目标是最小化总流量(修复带宽)。

信息论、分布式存储编码、网络编码

云存储系统、冷数据存储

CPU:编码和解码过程需要大量的有限域运算,可使用CPU的SIMD指令(如GFNI)或专用加速卡加速。
内存:编码/解码时需要将数据块和校验块加载到内存进行矩阵运算。
网络:在编码后分发块、修复时传输数据需要内部网络带宽。
存储盘:每个存储节点使用HDD或SSD存储编码块。
数据流:上传时,数据源 -> 编码器(CPU/GPU)-> 网络分发到n个存储节点。下载时,从k个节点读取块 -> 网络传输 -> 解码器 -> 数据恢复。修复时,从d个节点读取部分数据 -> 网络传输到新节点 -> 解码重建。

CPU/GPU:编码/解码集群,CPU需支持向量指令,或使用GPU进行并行编码。网络:存储集群内部需高带宽网络,以支持数据修复和再平衡。存储盘:总存储容量为原始数据的n/k倍,考虑多副本则更高。内存:编码缓冲区。

Chat-0016

后端服务模型

搜索服务

倒排索引与向量空间模型

TF-IDF 与 BM25 排序算法

目标:对海量文本(如公众号文章、聊天记录)建立索引,快速返回与查询相关的文档,并按相关性排序。
1. 倒排索引:对于每个词项(term)t,记录其出现的文档列表(posting list),列表中每个条目包含文档ID doc_id和在该文档中出现的位置、频率等信息。
2. TF-IDF 权重:词项 t在文档 d中的权重 w_{t,d} = tf_{t,d} * idf_t,其中 tf_{t,d}是词频,常用公式为 1 + log(f_{t,d})f_{t,d}是原始词频),idf_t = log(N / df_t)N是总文档数,df_t是包含词项 t的文档数。
3. 向量空间模型:文档 d和查询 q分别表示为向量 V_dV_q,向量的每个维度对应一个词项,值为TF-IDF权重。相关性用余弦相似度计算:`sim(q, d) = (V_q · V_d) / (

V_q

*

V_d

)。<br>4. **BM25 改进**:BM25是TF-IDF的扩展,对词频进行饱和处理,并加入文档长度归一化。score(D, Q) = Σ{t in Q} idf(t) * (f{t,D} * (k_1 + 1)) / (f_{t,D} + k_1 * (1 - b + b *

D

/ avgdl)),其中f_{t,D}是词项t在文档D中的词频,

D

是文档长度(词数),avgdl是平均文档长度,k_1b是自由参数,通常k_1 ∈ [1.2, 2.0],b ≈ 0.75`。

Chat-0017

后端服务模型

推荐服务

深度协同过滤与多任务学习模型

DeepFM 模型 (Deep Factorization Machine)

目标:基于用户历史行为(点击、观看、购买等)和上下文特征,预测用户对物品(如视频、文章、商品)的点击率(CTR)或观看时长,用于个性化推荐。
1. 特征编码:输入特征包括类别型特征(如用户ID、物品ID、城市)和数值型特征(如年龄、价格)。类别型特征通过嵌入层(Embedding Layer)转换为低维稠密向量 e_i。数值型特征可以直接使用或分桶后嵌入。
2. FM部分:学习特征之间的二阶交互。y_{FM} = w_0 + Σ_{i=1}^{n} w_i x_i + Σ_{i=1}^{n} Σ_{j=i+1}^{n} <v_i, v_j> x_i x_j,其中 w_0是全局偏置,w_i是一阶权重,v_i是特征i的隐向量,<·,·>是点积。点积项可以改写为线性复杂度:Σ_{i=1}^{n} Σ_{j=i+1}^{n} <v_i, v_j> x_i x_j = 1/2 * Σ_{f=1}^{k} ( (Σ_{i=1}^{n} v_{i,f} x_i)^2 - Σ_{i=1}^{n} v_{i,f}^2 x_i^2 ),其中k是隐向量的维度。
3. Deep部分:将嵌入向量拼接成一个大向量 e = [e_1; e_2; ...; e_m],输入到多层全连接神经网络(DNN),学习高阶特征交互。a^{(0)} = e, a^{(l+1)} = σ(W^{(l)} a^{(l)} + b^{(l)}),最终输出 y_{DNN}
4. 输出与损失:最终预测值为 ŷ = sigmoid(y_{FM} + y_{DNN})。使用二元交叉熵损失:L = -1/N Σ_{i=1}^{N} (y_i log(ŷ_i) + (1-y_i) log(1-ŷ_i)),其中 y_i是真实标签(点击为1,否则为0)。
5. 多任务学习扩展:可以共享底层特征嵌入,在顶层构建多个任务输出层,如同时预测点击和观看时长。损失函数为各任务损失的加权和。

AUC:衡量排序能力。
LogLoss:衡量预测概率的校准程度。
线上AB测试指标:点击率、人均观看时长等提升。

因子分解机、深度学习、表示学习

微信视频号、看一看的个性化推荐。特征:特征维度高、数据稀疏、需要实时更新。

x_i: 第i个特征的值(类别特征为one-hot,数值特征为标量)
e_i: 特征i的嵌入向量(若为类别特征)
v_i: FM部分特征i的隐向量
w_i: FM部分一阶权重
W^{(l)}, b^{(l)}: DNN第l层的权重和偏置
σ: 激活函数,如ReLU
k: 隐向量维度
ŷ: 预测的点击概率

线性代数、矩阵分解、神经网络、优化、梯度下降

特征工程描述、模型训练和预测流程

1. 数据预处理:对原始日志进行清洗,构造样本 (features, label)。对类别特征进行编码(如哈希或字典编码),数值特征归一化。
2. 模型训练(离线)
- 初始化参数:嵌入矩阵、FM的 w, v,DNN的权重。
- 前向传播:计算FM部分输出 y_{FM}和 DNN部分输出 y_{DNN},求和后通过sigmoid得到 ŷ
- 计算损失 L
- 反向传播,使用优化器(如Adam)更新参数。
3. 在线预测
- 接收请求,提取用户和物品的特征向量 x
- 加载模型参数,进行前向传播,得到 ŷ
- 按 ŷ排序,返回Top-K物品。

特征流:原始特征(用户、物品、上下文)经过嵌入层,转换为稠密向量流。这些向量流分两路:一路进入FM组件,进行两两交互(点积)后聚合;另一路拼接后进入DNN组件,经过多层非线性变换。两路的结果流汇合,通过一个激活函数产生最终的预测概率流。训练时,样本流不断输入,产生的预测流与真实标签流比较,产生误差流,误差流反向传播更新模型参数。

推荐系统、机器学习、深度学习

电子商务推荐、内容信息流推荐

CPU/GPU:离线训练使用GPU集群进行大规模并行计算。在线推理使用CPU(或专用AI芯片)进行前向计算,需低延迟。
内存:存储嵌入表(可能非常大)和模型参数。
存储盘:存储训练数据、模型快照。
数据流:在线:请求 -> 特征抽取 -> 嵌入查找 -> 神经网络前向计算 -> 输出分数。离线:日志 -> 样本生成 -> 分布式训练(参数服务器或AllReduce) -> 模型导出。

CPU/GPU:训练需成千上万GPU卡;在线推理需大量CPU服务器,可能配备AI加速卡。内存:嵌入表可达TB级,需分布式存储。网络:训练时参数同步需要高速网络(如InfiniBand)。存储盘:训练数据PB级,模型GB~TB级。

Chat-0018

后端服务模型

支付系统

分布式事务与资金核对模型

TCC(Try-Confirm-Cancel)事务模型与异步核对

目标:在分布式环境下,保证跨多个服务的支付操作(如扣款、记账、通知)的原子性和一致性,并确保资金安全。
1. TCC三个阶段
- Try:预留资源。检查并锁定账户余额,记录临时状态。例如,从用户账户A中冻结支付金额 amountif balance_A ≥ amount then balance_A -= amount; frozen_A += amount
- Confirm:确认执行。使用Try阶段预留的资源,完成最终业务操作。例如,将冻结的金额从A账户转移到B账户:frozen_A -= amount; balance_B += amount。Confirm需保证幂等。
- Cancel:取消。释放Try阶段预留的资源。例如,将冻结金额解冻:frozen_A -= amount; balance_A += amount。Cancel也需幂等。
2. 事务协调器:协调器(Coordinator)按顺序调用各参与服务(Participant)的Try、Confirm/Cancel方法。若所有Try成功,则发起Confirm;若任一Try失败,则发起Cancel。
3. 超时与重试:每个阶段可能超时或失败,协调器需记录事务状态,并不断重试未完成的Confirm或Cancel,直到成功。
4. 异步核对:由于网络分区或极端故障,可能出现不一致。通过定期核对账本,比较交易流水和账户余额,发现并修复不一致。核对公式:期初余额 + 收入流水总额 - 支出流水总额 = 当前余额

原子性:所有操作要么全部成功,要么全部回滚。
一致性:资金总额在任何时刻都平衡。
最终一致性:核对保证最终一致。

分布式事务理论、补偿事务、可靠消息传递

微信支付、转账、红包。特征:高并发、资金安全第一、强一致性要求。

T: 一个事务,包含多个参与服务
Participant_i: 第i个参与者
Try_i(), Confirm_i(), Cancel_i(): 参与者的三个方法
amount: 交易金额
balance: 账户可用余额
frozen: 冻结金额
coordinator: 协调器,维护事务状态(进行中、已提交、已取消)

事务状态机、幂等、补偿、核对等式

业务活动描述、协调协议

1. 事务开始:协调器生成全局唯一事务ID xid,并记录事务状态为“进行中”。
2. Try阶段:协调器依次调用所有参与者的 Try_i(xid, params)方法。如果所有Try成功,协调器将状态改为“已提交”;如果任一Try失败(或超时),协调器将状态改为“已取消”。
3. Confirm/Cancel阶段
- 如果状态为“已提交”,协调器异步调用所有参与者的 Confirm_i(xid)方法(可重试)。
- 如果状态为“已取消”,协调器异步调用所有参与者的 Cancel_i(xid)方法(可重试)。
4. 完成:当所有Confirm或Cancel调用成功,协调器记录事务完成。
5. 核对:每日定时任务,扫描账户表和流水表,验证每个账户的余额等式。若不等,触发修复流程(如冲正)。

资金流和事务控制流分离。资金流:用户账户 -> 冻结(Try)-> 转移(Confirm)-> 目标账户。控制流:协调器产生Try命令流,流向各参与者;根据Try的结果,产生Confirm或Cancel命令流,再次流向各参与者。参与者接收命令流,修改本地资源状态。核对流程是一个批处理流,读取快照状态和流水日志,进行比对计算,产出差异报告流,然后触发修复流。

分布式系统、事务处理、金融系统对账

供应链金融、分布式订单处理

CPU:支付网关和账户服务需要处理高并发请求,CPU执行业务逻辑和数据库操作。
内存:缓存热点账户信息,加速余额查询和扣款。
存储盘:使用关系数据库(分库分表)持久化账户、流水、事务状态,保证ACID。
网络:内部服务间RPC调用,需要低延迟和高可靠性。
数据流:支付请求 -> 支付网关 -> 协调器 -> 调用账户服务Try(冻结)-> 调用积分服务Try -> ... -> 全部成功则异步Confirm。

CPU:支付核心集群需要高性能CPU处理交易。时钟:分布式事务需要时钟协调,但TCC不严格依赖。队列:异步消息队列用于解耦和重试。网络:金融级网络要求高可靠、低延迟。内存/缓存:账户信息缓存,减少数据库访问。存储盘:数据库需持久化,多副本,数据强一致。

Chat-0019

后端服务模型

信用系统

信用评分与行为图谱模型

逻辑回归与图嵌入融合模型

目标:基于用户的历史支付行为、社交关系、履约记录等,评估用户的信用风险,输出信用分。
1. 特征工程:从多维度提取特征,包括:
- 支付行为:历史逾期次数、平均还款时长、交易频率等。
- 社交关系:好友信用分均值、社交网络密度、中心性等。
- 账户属性:年龄、职业、资产等。
2. 逻辑回归模型:将线性组合的特征通过sigmoid函数映射为违约概率。`P(y=1

x) = 1 / (1 + exp(-(w^T x + b))),其中x是特征向量,w是权重,b是偏置。信用分通常线性映射到一定范围,如score = A - B * log(odds),其中odds = P/(1-P)。<br>3. **图嵌入增强**:构建用户社交关系图G,使用图嵌入算法(如Node2Vec)学习每个用户的低维向量表示u_i。Node2Vec通过有偏随机游走生成节点序列,然后使用Skip-gram模型最大化节点上下文的共现概率。目标函数:max Σ{u∈V} Σ{v∈N(u)} log P(v

u),其中P(v

u) = exp(embed(v)·embed(u)) / Σ_{z∈V} exp(embed(z)·embed(u))。得到的图嵌入向量作为额外特征加入逻辑回归模型。<br>4. **模型训练**:使用带正则化的最大似然估计。损失函数:L(w) = -Σ_i [y_i log(p_i) + (1-y_i) log(1-p_i)] + λ

w

^2`,通过梯度下降求解。

KS统计量:衡量模型区分好坏客户的能力。
AUC:排序能力。
稳定性PSI:评估模型在不同时间段的稳定性。

统计学习、图表示学习、风险建模

微信支付分、微粒贷信用评估。特征:数据稀疏、冷启动、需要可解释性。

x: 特征向量
w, b: 逻辑回归权重和偏置
`P(y=1

x): 违约概率<br>odds: 胜率,P/(1-P)<br>score: 信用分<br>G=(V, E): 社交图,V是用户节点,E是关系边<br>embed(u): 用户u的图嵌入向量<br>λ`: 正则化系数

Chat-0020

后端服务模型

视频直播

低延迟直播与弹幕分发模型

基于WebRTC的实时传输与弹幕合并渲染

目标:实现低延迟、高并发的视频直播流分发,并实时同步显示海量用户的弹幕评论。
1. 视频传输:采用WebRTC协议族,包括:
- 拥塞控制:使用Google Congestion Control (GCC),基于延迟梯度与丢包率估计带宽。带宽估计公式:B_est = η * (α * packet_size / Δt),其中 Δt是单向延迟梯度,α, η为调节参数。
- 前向纠错:对视频帧进行FEC编码,如UlpFEC,添加冗余包,允许在丢包时恢复。对于一组k个媒体包,生成r个冗余包,可恢复任意≤r个丢失。
- 自适应码率:根据估计带宽 B_est和接收端缓冲区 buffer调整视频编码码率 R。控制策略:if buffer < threshold_low then R = R * 0.8; else if buffer > threshold_high then R = R * 1.2
2. 弹幕分发
- 合并与节流:服务端对短时间内同一直播间的弹幕进行合并,减少下行消息数。例如,每100ms打包一次该时间段内的弹幕,批量下发。
- 同步渲染:弹幕消息携带时间戳 t_send和视频帧序号 frame_id。客户端在渲染视频帧 frame_id时,同时渲染对应的弹幕,实现音画同步。
3. 全球加速:通过Anycast或DNS调度,将用户导向最近的边缘节点。边缘节点从源站拉流,并分发給观众。

端到端延迟:从采集到播放的延迟,目标1-3秒。
卡顿率:播放中断时间占比。
弹幕同步误差:弹幕与视频画面的时间差。

实时传输协议、拥塞控制、多媒体同步

微信视频号直播。特征:高并发观看、强实时互动、网络条件差异大。

B_est: 估计带宽
Δt: 延迟梯度,即连续包组间延迟变化
packet_size: 数据包大小
α, η: GCC算法参数
R: 视频编码码率
buffer: 接收端播放缓冲区长度
threshold_low, threshold_high: 缓冲区阈值
frame_id: 视频帧序号
t_send: 弹幕发送时间戳

控制理论、排队论、网络传输、同步

信令交互、媒体流传输、弹幕协议

1. 信令交换:通过信令服务器交换SDP和ICE候选,建立P2P或TURN中转连接。
2. 媒体流传输
- 发送端:摄像头采集 -> 视频编码(调整码率R)-> 分包 -> 添加FEC -> 通过SRTP发送。同时,周期性计算延迟梯度和丢包率,运行GCC算法更新 B_est,调整 R
- 接收端:收包 -> FEC恢复/重传请求 -> 组帧 -> 解码 -> 放入缓冲区 buffer-> 按需渲染。
3. 弹幕发送:用户发送弹幕,客户端附上当前 frame_id,发送到服务器。
4. 弹幕分发:服务器按直播间聚合弹幕,每100ms打包一次,广播給该直播间所有观众客户端。
5. 弹幕渲染:客户端在渲染视频帧时,检查弹幕队列,绘制 frame_id匹配的弹幕。

视频流和弹幕流是两个独立的流,但需要在时间上同步。视频流从主播端流向边缘节点,再分流到每个观众,形成一个多级分发树。弹幕流从每个观众上行到服务器,合并后,再从服务器下行广播到所有观众(包括发送者自己)。视频流是单向的、连续的,弹幕流是双向的、突发的。同步机制在客户端将两个流对齐:视频渲染引擎以帧为单位推进,弹幕渲染引擎根据帧号触发。

流媒体、内容分发网络、实时群聊

在线教育直播、远程医疗会诊

CPU/GPU:主播端编码使用硬件编码器(如GPU/NPU),观众端解码使用硬件解码器。服务器(边缘节点)进行流转发和弹幕合并,需要多核CPU处理网络I/O。
内存:缓冲区存储视频帧和弹幕消息。
网络:主播上行需要高带宽、低延迟;观众下行依赖CDN,边缘节点间需要高速骨干网。
数据流:主播:摄像头 -> 编码 -> 网络发送。观众:网络接收 -> 解码 -> 渲染。弹幕:客户端 -> 服务器 -> 广播 -> 客户端渲染。

CPU/GPU:边缘服务器集群处理流转发和弹幕,CPU密集型。网络:全球CDN,带宽需求巨大,可能达Tbps级。内存/缓存:边缘节点缓存直播流片段。存储盘:用于直播录制存储。

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0021

后端服务模型

短视频

智能转码与自适应流模型

感知哈希与多码率自适应(HLS/DASH)

目标:对上传的视频进行智能分析、转码,生成多码率版本,并根据用户网络条件自适应切换,优化观看体验。
1. 感知哈希去重:计算视频关键帧的感知哈希(pHash)。对每一帧提取特征(如DCT低频系数),生成64位哈希值 H_f。若新视频与已有视频的汉明距离 d(H_new, H_existing) < threshold,则判定为重复/相似内容,可重用转码结果。
2. 多码率阶梯生成:定义一组目标码率 R = {R_1, R_2, ..., R_L},对应分辨率 (W_i, H_i)和帧率 FPS_i。使用编码器(如x265)以CRF(恒定质量)模式编码,再通过二次编码(two-pass VBR)精确控制码率。码率-分辨率模型:R_i = a * (W_i * H_i * FPS_i)^{b},参数 a, b通过历史数据拟合。
3. 自适应流媒体:使用HLS或DASH协议,将视频切片为多个TS/MP4片段(如2秒一段)。客户端根据当前网络带宽 B_est和缓冲区长度 buffer,选择最合适的码率版本。决策算法:`j = argmax_j {R_j

R_j ≤ γ * B_est, buffer > α * R_j},其中γ为保守因子(如0.9),α为缓冲区安全系数。<br>4. **预加载与缓存**:预测用户观看行为,预加载后续切片。使用马尔可夫链模型预测下一个切片请求的概率,优先级P(next) = Transition(current, next)`。

转码速度:每分钟转码的视频时长。
压缩比:输出码率与源视频码率之比。
卡顿率:播放中断频率。
重复检测准确率

信息论、视频编码、自适应流媒体、哈希

微信视频号短视频、朋友圈视频。特征:海量上传、多种终端、网络环境各异。

H_f: 视频帧的感知哈希值(64位整数)
d(): 汉明距离函数
threshold: 相似度阈值(如5)
R_i: 第i个码率阶梯的目标码率(bps)
(W_i, H_i): 第i个阶梯的分辨率
FPS_i: 第i个阶梯的帧率
a, b: 码率-分辨率模型参数
B_est: 客户端估计的可用带宽
buffer: 客户端缓冲区长度(秒)
γ, α: 自适应决策参数

哈希、距离、优化、统计、马尔可夫链

转码工作流描述、自适应切换逻辑

1. 上传与检测:视频上传,计算关键帧pHash,与库中哈希索引比对,若高度相似则跳过转码,返回已有播放地址。
2. 转码任务拆分:将视频转码任务分解为多个并行子任务(如按GOP或时间片)。
3. 并行编码:对每个码率阶梯 R_i,启动编码进程,使用两趟编码:第一趟分析统计信息,第二趟编码输出。码率控制方程:R_i = (目标文件大小) / 视频时长
4. 切片与清单生成:编码完成后,用封装工具(如ffmpeg)切片,生成M3U8或MPD清单文件。
5. 客户端播放:下载清单,根据当前 B_estbuffer选择切片,下载并播放。定期(如每切片)重新评估带宽,决策是否切换码率。

视频流从上传点流入,经过“去重过滤器”,重复流被拦截,新流进入“转码工厂”。转码工厂是一个并行的处理流水线,输入流被复制成L个分支,每个分支以不同的参数(码率、分辨率)进行编码,产出L个不同质量的视频流。这些流被切片成时间片段,形成L个片段流。客户端根据网络条件和缓冲区状态,从一个片段流动态切换到另一个片段流,形成一个自适应的观看流。预加载模块根据观看历史,预测并提前加载可能的后续片段流。

视频处理、自适应比特率流、内容去重

视频点播平台、UGC内容审核

CPU/GPU:转码集群使用GPU(如NVIDIA Tesla)加速编码,CPU处理任务调度和切片。内存:存储视频帧和中间编码数据。存储盘:存储源视频、转码后多码率文件和切片,容量巨大(PB~EB级)。网络:上传带宽、转码节点间数据传输、CDN分发。
数据流:用户上传 -> 对象存储 -> 触发转码任务 -> 调度到GPU机器 -> 并行转码 -> 切片 -> 上传到CDN -> 生成播放地址。

Chat-0022

后端服务模型

分布式锁

基于Redis的分布式锁优化模型

RedLock算法与租约续期

目标:在分布式缓存(Redis)集群上实现高可用、强一致的分布式锁,解决单点故障问题。
1. RedLock算法:假设有N个独立的Redis主节点(无主从)。
2. 获取锁
- 客户端获取当前时间 T1(毫秒)。
- 依次向N个节点发送加锁命令:SET lock_key unique_value NX PX lock_timeout,其中 unique_value为客户端唯一标识,lock_timeout为锁的超时时间。
- 客户端计算获取锁花费的时间 T_elapsed = 当前时间T2 - T1。只有当客户端在多数派节点(至少 N/2+1)上成功获取锁,并且T_elapsed < lock_timeout时,锁才获取成功。锁的有效时间为 lock_timeout - T_elapsed
3. 租约续期:获取锁成功后,客户端启动一个看门狗线程,定期(如每隔 lock_timeout/3时间)向所有成功加锁的节点发送 PEXPIRE命令,重置键的超时时间,实现锁的续期,避免业务未完成锁被释放。
4. 释放锁:客户端向所有节点发送Lua脚本,仅当 lock_key的值等于 unique_value时才删除该键,保证只有锁的持有者才能释放。

安全性:在任何时刻,只有一个客户端能持有锁。
活性:最终总能获取到锁,避免死锁。
容错性:能容忍部分节点故障。

分布式共识、时钟漂移、多数派原则

微信后台定时任务调度、全局配置更新。特征:高并发竞争、网络分区、时钟不同步。

N: Redis节点总数(奇数,如5)
lock_key: 锁的键名
unique_value: 客户端生成的唯一标识(如UUID)
lock_timeout: 锁的超时时间(毫秒)
T1, T2: 获取锁开始和结束时间戳
T_elapsed: 获取锁耗时
majority: 多数派数量,⌊N/2⌋+1

集合、逻辑、时钟、超时、多数派

加锁/释放锁协议

1. 加锁尝试:记录 T1。对 i=1 to N,向节点 R_i发送 SET命令,记录成功/失败。
2. 统计与校验:获取 T2,计算 T_elapsed。统计成功加锁的节点数 S。如果 S ≥ majorityT_elapsed < lock_timeout,则加锁成功。否则,向所有节点发送释放命令(即使未成功也尝试),然后等待随机时间后重试。
3. 业务执行:加锁成功后,执行业务逻辑,同时看门狗线程定期续期。
4. 释放锁:业务完成后,向所有N个节点发送Lua脚本:if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end

锁的获取请求流从客户端发出,分叉流向N个Redis节点。每个节点返回成功/失败流。客户端收集这些反馈流,当满足多数派成功且时间约束时,锁的状态流从未持有变为已持有。持有期间,续期心跳流定期流向相关节点。释放锁时,删除请求流流向所有节点。锁的状态在整个系统中是一个多副本的、带租约的状态,通过多数派和租约机制保证其排他性。

分布式锁、租赁协议、容错系统

分布式资源调度、集群选主

CPU:Redis节点CPU处理简单的SET/GET/DEL命令和Lua脚本。客户端CPU计算耗时和决策。
内存:Redis节点内存存储键值对。
网络:客户端与多个Redis节点间的网络延迟直接影响锁获取的耗时和可靠性。
时钟:依赖于客户端的本地时钟,时钟漂移可能影响 T_elapsed的计算,因此需要较宽松的 lock_timeout

CPU/内存:Redis集群,每个节点需足够内存存储锁状态。时钟:不严格要求全局同步,但需NTP同步以减少漂移。网络:客户端到Redis节点的网络需要低延迟和高可用,避免网络分区导致脑裂。队列:Redis内部命令队列。

Chat-0023

后端服务模型

信息服务

大规模实时推送网关模型

长连接管理与批量推送

目标:维持与数亿客户端的持久长连接,并将服务端的消息(如新消息通知、状态更新)实时、可靠地推送到客户端。
1. 连接管理:每个客户端与网关服务器建立并维持一个长连接(如WebSocket)。网关服务器维护连接会话表 SessionTable,映射 user_id -> connection_info。连接信息包括连接句柄、心跳时间、客户端属性等。
2. 心跳保活:客户端定期(如60秒)发送心跳包。服务器收到后更新会话的 last_heartbeat时间。服务器端运行一个定时任务,扫描所有会话,如果 now - last_heartbeat > timeout(如75秒),则判定连接失效,清理会话。
3. 批量推送优化:当有消息需要推送给大量用户(如群公告)时,采用批量推送。将目标用户列表分片,每个分片由一个网关服务器负责。该服务器遍历分片内的用户会话,将消息封裝后,通过各自的连接发送。为减少系统调用和网络包数量,可使用写时合并:将多个小消息缓冲,达到一定数量或时间窗口后,合并成一个大的网络包发送(如TCP Cork)。
4. 推送确认与重试:重要的推送需要确认。消息携带唯一ID,客户端收到后回复ACK。服务器维护推送状态,超时未收到ACK则重试(指数退避)。

连接保活率:长连接的稳定性。
推送到达率:消息成功送达的比例。
推送延迟:从产生到送达的时间。
网关吞吐量:每秒可处理的消息数。

网络编程、连接管理、可靠传输

微信新消息通知、服务号模板消息、系统公告。特征:海量连接、小消息、高并发写。

user_id: 用户唯一标识
connection_info: 连接信息结构体
last_heartbeat: 最后一次心跳时间戳
timeout: 心跳超时时间
message: 待推送的消息体
batch_size: 批量推送的批次大小
max_retry: 最大重试次数
backoff_base: 指数退避基数

集合、映射、队列、超时、指数退避

连接建立/维持协议、推送协议

1. 连接建立:客户端发起WebSocket握手,网关服务器验证权限,创建会话记录存入 SessionTable
2. 心跳维持:客户端定时发送心跳包ping,服务器回复pong,并更新last_heartbeat
3. 消息推送触发:业务逻辑服务器将推送任务 (user_list, message)放入消息队列。
4. 网关消费:网关服务器从队列拉取任务,根据 user_list和本地会话表,找出本地连接的子集 target_users_local
5. 批量发送:对 target_users_local中的每个用户,将消息放入其对应的连接发送缓冲区。当缓冲区满或达到时间窗口(如10ms),将缓冲区中的所有消息合并编码,调用 send()系统调用一次性发送。
6. 确认与重试:启动定时器等待ACK。若超时,将消息重新放入重试队列,等待下次重试,重试间隔 interval = backoff_base ^ retry_count

客户端连接流像无数条小溪流汇聚到网关服务器池。业务消息流从上游生产者产生,流入消息队列。网关服务器从队列中消费消息流,并根据用户ID将消息流路由到对应的连接流。连接流是双向的:下行是推送消息流,上行是心跳和ACK流。批量推送是将多条小的消息流在时间窗口内聚合成一条大的消息包流,然后注入连接流。心跳流定期从客户端发出,流经网关,维持连接流的活性。

发布-订阅、消息队列、长连接管理

物联网设备监控、实时告警推送

CPU:网关服务器CPU主要消耗在网络I/O处理(epoll/kqueue)和协议编解码。需多核高性能CPU支撑高并发连接。
内存:存储海量会话信息,每个连接需要一定的内存缓冲区。数十亿连接需要TB级内存集群。
网络:网卡需支持多队列和RSS,以将连接负载均衡到多个CPU核心。需要高带宽应对突发推送流量。
数据流:网络包到达网卡 -> DMA到内核 -> epoll通知用户态 -> 解码 -> 业务逻辑 -> 写入发送缓冲区 -> 内核协议栈 -> 网卡发送。

CPU:数万台网关服务器,每台处理数十万连接。时钟:用于心跳超时检测和重试定时器。队列:每个连接有发送/接收队列,网关有任务队列。网络:需应对DDoS攻击,边缘网络带宽巨大。内存/缓存:会话信息内存存储,可考虑分片。存储盘:用于持久化未确认的推送消息(如Redis)。

Chat-0024

后端服务模型

搜索服务

实时索引与混合检索模型

倒排索引更新与向量检索混合查询

目标:在全文检索的基础上,结合向量检索,实现语义搜索和混合排序,并支持近实时索引更新。
1. 近实时索引:使用LSM树思想。新文档先写入内存缓冲区 MemBuffer和事务日志(WAL)。后台线程定期将 MemBuffer与磁盘上的旧段(Segment)合并。查询时,需要同时搜索内存缓冲区和所有磁盘段,合并结果。
2. 混合查询:用户查询 Q被解析为两部分:关键词部分 Q_kw和语义向量部分 Q_vecQ_kw用于检索倒排索引,得到文档集 D_kw和BM25分数 S_kw(d)Q_vec与文档向量库(如通过BERT预计算)进行近似最近邻搜索(见Chat-0003),得到文档集 D_vec和余弦相似度分数 S_vec(d)
3. 分数融合:综合两种分数进行排序。可采用线性加权:S_final(d) = α * norm(S_kw(d)) + (1-α) * norm(S_vec(d)),其中 norm()为归一化函数(如min-max),α为权重参数,可通过学习获得。
4. 索引更新延迟:从文档写入到可被检索到的时间,由 MemBuffer刷新周期决定,可配置为秒级。

索引新鲜度:文档从入库到可搜索的延迟。
检索精度:MRR、NDCG等指标。
查询延迟:P99延迟。

信息检索、向量搜索、LSM树、多模态融合

微信“搜一搜”综合搜索(包含文章、公众号、小程序等)。特征:多模态、实时性要求高、查询多样。

MemBuffer: 内存中的倒排索引缓冲区
Segment: 磁盘上的索引段
Q_kw: 查询关键词部分
Q_vec: 查询语义向量(e.g., 768维)
D_kw, D_vec: 关键词和向量检索结果集
S_kw(d): 文档d的BM25分数
S_vec(d): 文档d的向量相似度分数
α: 融合权重(0≤α≤1)
norm(x): 归一化函数,如 (x - min)/(max - min)

集合、排序、向量、相似度、加权、LSM树

查询解析、索引合并、分数计算

1. 文档入库:文档经过分词、向量化后,写入WAL,并更新内存倒排索引 MemBuffer和内存向量索引。
2. 段合并:当 MemBuffer达到阈值,将其冻结为只读,并启动后台线程将其与磁盘上的一些旧段合并,生成新段。向量索引类似。
3. 查询处理
- 解析查询,可能同时提取关键词和生成查询向量。
- 并行执行:线程A用 Q_kw搜索所有段(包括 MemBuffer)的倒排索引,得到 D_kwS_kw;线程B用 Q_vec搜索向量索引,得到 D_vecS_vec
- 合并结果集:对 D_kw ∪ D_vec中的每个文档,计算 S_final(d)
- 按 S_final排序,返回Top-K。
4. 权重学习:收集点击日志,训练 α参数,最大化点击率等指标。

文档流不断进入索引系统,被分流为两部分:文本流进入倒排索引构建流水线,向量流进入向量索引构建流水线。这两个流水线都会经历内存缓冲和定期合并到磁盘的过程。查询流进入时,被复制成两路,分别流入倒排索引查询引擎和向量索引查询引擎。两个引擎并发搜索,产生两个分数流,然后在融合节点处,对每个文档合并两个分数,产生最终分数流,最后排序输出。

搜索引擎架构、多模态机器学习、近似最近邻搜索

企业知识库检索、电商商品搜索

CPU:索引合并和查询时向量计算消耗大量CPU。可使用SIMD加速向量运算。
内存:内存缓冲区、倒排索引常驻部分、向量索引(如PQ量化后的编码)需要大内存。
存储盘:索引段存储在SSD上,提供高IOPS。
GPU:可选用GPU加速向量相似度计算(在ANN库中)。
数据流:文档 -> 分词/向量化 -> 写入内存索引 -> 定期刷盘 -> 查询 -> 并行检索 -> 分数融合 -> 排序返回。

CPU/GPU:索引集群,CPU用于倒排索引,GPU用于向量检索。内存:索引常驻内存,需TB级。存储盘:SSD存储索引段,容量PB级。网络:查询请求负载均衡到多个搜索节点。

Chat-0025

后端服务模型

管理服务

配置中心与动态推送模型

配置版本化与灰度发布

目标:集中管理所有微服务的配置,支持动态更新、版本回滚、灰度发布,并实时推送到服务实例。
1. 配置存储:配置以键值对形式存储,组织为 namespace -> dataId -> version -> content。使用Git管理配置版本,每个提交对应一个版本号 version(如Git commit hash)。
2. 客户端长轮询:客户端(微服务实例)启动时从配置中心拉取配置,并缓存本地。之后,客户端发起长轮询请求,请求中携带本地配置的 version。服务器端比较客户端版本与最新版本,如果相同,则挂起请求(如30秒);如果不同,立即返回最新配置。如果在挂起期间配置有更新,也立即返回。
3. 灰度发布:定义发布规则,如按IP、用户ID、流量百分比等将配置更新分批推送给不同的实例。数学模型:将实例集合 I划分为 m个批次,I = I_1 ∪ I_2 ∪ ... ∪ I_mI_i ∩ I_j = ∅。发布时,依次对 I_1, I_2, ..., I_m启用新配置。流量百分比规则:对每个请求,生成一个随机数 r ~ U(0,1),如果 r < p(p为灰度百分比),则使用新配置,否则使用旧配置。
4. 配置监听与回调:客户端收到新配置后,解析并更新内存中的配置对象,并触发预先注册的配置变更回调函数,使业务逻辑生效。

推送延迟:配置更新到所有客户端生效的时间。
一致性:在最终一致的基础上,尽可能保证同一批灰度实例同时生效。
可用性:配置中心故障不影响客户端运行(使用本地缓存)。

版本控制、发布订阅、灰度发布

微信后台所有微服务的配置管理、功能开关、业务参数。特征:配置项多、变更频繁、需精细控制。

namespace: 命名空间,用于环境隔离(如dev, prod)
dataId: 配置ID,唯一标识一个配置项或文件
version: 配置版本号(如MD5值)
content: 配置内容
I: 所有客户端实例集合
I_i: 第i个灰度批次实例集合
p: 灰度流量百分比(0≤p≤1)
r: 均匀分布随机数

集合、映射、版本、概率、随机

配置拉取/推送协议、灰度规则描述

1. 初始拉取:客户端启动,根据 namespacedataId向配置中心发起HTTP请求,获取最新配置和 version,并缓存。
2. 长轮询:客户端启动一个后台线程,循环执行:
- 发送长轮询请求,参数包括 dataId和本地 version_local
- 服务器端检查:如果 version_latest != version_local,立即返回新配置;否则,将请求挂起在队列中,等待 timeout(如30秒)或配置变更事件唤醒。
- 客户端收到响应(可能是新配置或超时),如果是新配置,则更新本地缓存和 version,并触发回调。然后继续下一轮轮询。
3. 管理员发布:在控制台修改配置并提交,生成新版本 version_new
4. 灰度发布:管理员选择灰度规则(如10%实例),配置中心根据规则计算哪些实例应被推送。对于在长轮询队列中的这些实例的请求,立即返回新配置。

配置数据流从管理员发布点产生,形成新版本的数据包。这个数据包被注入到配置中心的存储中。客户端的长轮询请求流持续不断地流入配置中心,每个请求携带其当前版本号。配置中心将请求版本与最新版本比较,如果相同,请求流被暂时阻塞在一个“等待池”中;如果不同,请求流立即携带新配置数据返回。当新版本发布时,相当于在“等待池”中注入了一个触发事件,使得所有相关的被阻塞请求流被释放并携带新数据返回。灰度发布是控制这个触发事件只作用于一部分请求流。

配置管理、特性开关、持续交付

微服务配置动态更新、A/B测试平台

CPU:配置中心服务器处理大量长连接和长轮询请求,CPU消耗在网络I/O和比较操作上。
内存:存储配置内容、客户端长轮询上下文。
存储盘:持久化配置数据,可使用数据库或分布式配置存储(如etcd)。
网络:客户端与配置中心间的长连接消耗,推送时可能产生突发流量。

CPU:配置中心集群,处理海量长轮询连接。内存:存储配置和连接上下文。存储盘:配置持久化存储,数据量不大但需高可用。网络:内部服务与配置中心通信,需稳定。

Chat-0026

后端服务模型

信号监听

事件驱动与反应式编程模型

Reactor模式与背压(Backpressure)

目标:构建高并发的网络服务,通过异步非阻塞I/O和事件驱动,高效处理海量连接和请求,并处理上下游速度不匹配问题。
1. Reactor模式:由一个或多个Acceptor线程监听端口,接收新连接,并将新连接注册到I/O多路复用器(如epoll)上。一组Worker线程(通常与CPU核心数相同)运行事件循环,从多路复用器获取就绪的I/O事件,并分发给对应的处理器(Handler)进行非阻塞读写和业务处理。
2. 异步处理链:业务处理被分解为多个阶段,每个阶段都是无阻塞的,可能包括解码、业务逻辑、编码等。阶段之间通过队列或回调传递数据,形成处理流水线。
3. 背压控制:当下游处理速度跟不上上游数据产生速度时,需要反向施加压力,限制上游速率。令牌桶算法:下游维护一个容量为 B的令牌桶,以恒定速率 R产生令牌。上游每处理一个事件需要消耗一个令牌,若无令牌则阻塞或丢弃。数学上,令牌数量 tokens的变化:tokens = min(B, tokens + R * Δt),消费时 tokens -= 1,如果 tokens < 0则等待。
4. 反应式流规范:实现Publisher-Subscriber接口,订阅时Subscriber通过 request(n)向上游请求n个数据,实现拉式背压。

吞吐量:每秒处理的请求数。
延迟:请求处理时间。
资源利用率:CPU、内存使用率。

事件驱动、异步编程、流量控制、排队论

微信API网关、RPC框架、消息推送网关。特征:高并发、低延迟、资源高效。

Acceptor: 接收新连接的线程
Worker: 工作线程,运行事件循环
epoll: I/O多路复用器
Handler: 事件处理器
B: 令牌桶容量
R: 令牌产生速率(个/秒)
tokens: 当前令牌数
Δt: 时间间隔

事件、队列、流、控制、速率限制

事件循环伪代码、背压协议

1. 启动:主线程创建Acceptor,绑定端口,监听。创建Worker线程池,每个Worker运行事件循环。
2. 接受连接:Acceptor接收到新连接 socket_fd,通过轮询或特定方式分配给一个Worker,并将 socket_fd注册到该Worker的epoll实例,关注可读事件。
3. 事件循环:每个Worker循环:
- int n = epoll_wait(epfd, events, max_events, timeout);
- for i in 0..n:处理 events[i]
- 如果是可读,则从socket非阻塞读取数据到缓冲区,解码出完整请求,提交到业务线程池或继续在本地线程处理。
- 如果是可写,则将发送缓冲区的数据非阻塞写入socket。
4. 背压传递:业务处理线程池的任务队列有最大长度,当队列满时,拒绝新的任务,向上游传递背压,最终可能导致epoll线程暂停读取新数据。

网络数据包流到达网卡,被DMA到内核缓冲区,epoll检测到可读事件流,触发用户态的数据读取流。读取到的字节流被解码为请求对象流,然后流入业务处理流水线。流水线的每个阶段都是一个处理器,处理后将结果对象流传递给下一个阶段。如果某个阶段处理速度慢,其输入队列会堆积,背压机制会通过队列长度或令牌反向抑制前一个阶段的输出流,最终可能抑制到最源头的网络读取流,实现全链路的流量控制。

网络编程模型、反应式宣言、流量整形

高并发网络服务器、实时数据处理管道

CPU:Worker线程运行在多个CPU核心上,利用多核并行处理事件。业务逻辑可能由单独的线程池处理,避免阻塞I/O线程。
内存:每个连接需要读写缓冲区,需合理分配以避免内存浪费。
网络:网卡多队列与Worker线程绑定,实现CPU亲缘性和减少锁竞争。
数据流:网卡中断 -> 内核协议栈 -> epoll检测 -> 用户态读取 -> 解码 -> 业务处理 -> 编码 -> 写入socket缓冲区 -> 内核 -> 网卡发送。

CPU:服务器多核CPU,核心数决定Worker线程数。时钟:用于超时和定时任务。队列:每个Worker有一个就绪事件队列,业务处理有任务队列。网络:高带宽网卡,支持RSS。内存/缓存:连接状态和缓冲区内存。

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0027

后端服务模型

支付系统

分布式事务与最终一致性模型

TCC (Try-Confirm-Cancel) 事务模型

目标:在微服务架构下,实现跨服务的业务事务,保证数据最终一致性,避免长时间的资源锁定。
1. 三阶段设计:将一个分布式事务拆分为两个阶段提交(2PC)的业务化实现,包含三个阶段:
- Try:尝试执行业务检查,并预留必要的资源。此阶段需保证幂等性。各参与者冻结部分资源,生成事务日志。状态:事务T进入Trying
- Confirm:确认执行业务。使用Try阶段预留的资源,真正执行业务更新。此操作必须幂等。状态:事务T进入Confirmed
- Cancel:取消执行业务。释放Try阶段预留的资源。此操作必须幂等。状态:事务T进入Cancelled
2. 事务管理器协调:事务管理器(TM)维护全局事务状态,并驱动各参与者(RM)按顺序执行Try、Confirm/Cancel。TM需持久化事务状态。
3. 恢复与重试:任何阶段失败,TM根据日志状态进行重试。Confirm/Cancel必须实现幂等,确保重试安全。最大努力送达。
4. 空补偿与悬挂:需处理Try未执行但收到Cancel(空补偿),或Try超时后执行了Confirm(悬挂)的异常场景,通过事务上下文传递和状态检查避免。

最终一致性:事务完成后,所有参与方数据最终一致。
可用性:相比2PC,降低了资源锁定时间,提高了可用性。
业务侵入性:强,需业务实现三阶段接口。

分布式事务理论、补偿事务、最终一致性

微信支付、转账业务(涉及账户、优惠券、积分等多个服务)。特征:高并发、高一致性要求、跨多个资源。

T: 全局事务唯一标识
TM: 事务管理器
RM_i: 第i个资源管理器(参与者)
Try(): 尝试接口,返回是否成功
Confirm(): 确认接口,幂等
Cancel(): 取消接口,幂等
事务状态: {Trying, Confirmed, Cancelled}
幂等键: 由TRM生成的唯一键,用于去重

状态机、幂等、补偿、最终一致性

事务协调协议、补偿逻辑描述

1. 事务开始:TM生成全局事务ID T,记录日志。
2. Try阶段:TM同步或异步调用所有 RM_i.Try(T, biz_context)。如果所有Try成功,进入Confirm阶段;如果任一Try失败,进入Cancel阶段。
3. Confirm阶段:TM调用所有 RM_i.Confirm(T)。TM需不断重试直到所有RM确认成功。状态更新为Confirmed。
4. Cancel阶段:TM调用所有 RM_i.Cancel(T)。TM需不断重试直到所有RM取消成功。状态更新为Cancelled。
5. 恢复作业:独立的恢复服务定期扫描超时或状态不一致的事务,根据日志重新驱动Confirm或Cancel。

业务请求流到达TM,TM将其转换为一个全局事务流 Flow_TFlow_T随后分叉为多个子事务流 Flow_Try_i流向各个RM。RM执行Try后,返回成功/失败流给TM。TM根据聚合的结果流,决定发起确认流 Flow_Confirm_i或取消流 Flow_Cancel_i流向各个RM。整个事务的最终状态流是这些分支流最终收敛的结果。补偿流(Cancel)是正向业务流(Try)的逆向操作流,用于对冲。

补偿事务、 Saga模式、最终一致性

企业级应用集成、电商订单履约

CPU:TM和RM的CPU处理业务逻辑和状态维护。
内存:存储事务上下文和日志缓存。
存储盘:TM和RM需持久化事务日志(如数据库),用于故障恢复。
网络:TM与RM间频繁的RPC调用,需低延迟高可用网络。
数据流:请求 -> TM -> 记录日志 -> 调用RM Try -> RM记录日志并执行业务检查 -> 返回结果 -> TM决策 -> 调用RM Confirm/Cancel -> RM执行业务更新/补偿 -> 返回结果 -> TM更新最终状态。

CPU:事务管理集群,处理协调逻辑。时钟:用于超时控制。队列:异步任务队列用于重试。网络:内部服务间RPC网络需稳定。内存/缓存:缓存热点事务状态。存储盘:事务日志数据库,需高TPS。

Chat-0028

后端服务模型

信用系统

实时风险评分卡模型

逻辑回归与特征分箱(WOE/IV)

目标:基于用户多维度特征,实时计算信用评分,用于支付风控、信贷准入等。
1. 特征工程与分箱:对连续变量(如年龄、交易额)进行分箱,使其线性化。常用最优分箱(如基于信息价值IV)。计算每个箱的权重证据(Weight of Evidence, WOE):WOE_i = ln((% of good_i) / (% of bad_i)),其中good/bad代表好坏样本比例。信息价值:IV = Σ ((% of good_i - % of bad_i) * WOE_i)。IV用于特征筛选。
2. 逻辑回归模型:将分箱后的特征(WOE值)作为输入,预测用户违约概率 `P(y=1

x)。模型:logit(P) = ln(P/(1-P)) = β_0 + β_1 * x_1 + ... + β_n * x_n。参数β通过极大似然估计(MLE)求解:最大化似然函数L(β) = Π P_i^{y_i} (1-P_i)^{1-y_i},通常用梯度下降或牛顿法求解。<br>3. **评分卡转换**:将逻辑回归的预测概率转换为标准评分卡分数,分数与违约概率负相关。常用线性变换:Score = A - B * logit(P) = A - B * (β_0 + Σ β_i * WOE_i)。其中A, B` 为常数,由设定的基准分和比率(odds)确定。
4. 实时推理:模型上线后,用户请求时,实时抽取特征,计算WOE,代入公式得到分数。特征可能来自实时流(最近交易)和离线数仓(历史征信)。

区分度:KS统计量、AUC。
稳定性:PSI(群体稳定性指标)。
预测准确性:预测概率与真实违约率校准曲线。

统计学习、逻辑回归、信用评分

微信支付分、微粒贷准入评估。特征:高维稀疏特征、实时性要求、模型可解释性要求高。

x_i: 原始特征
WOE_i: 第i个特征在所属分箱内的WOE值
IV: 信息价值,用于特征筛选
β_i: 逻辑回归系数
P: 预测的违约概率
logit(P): 逻辑回归的线性部分
A, B: 评分卡刻度参数,由基准分基准比率计算:A = 基准分 + B*ln(基准比率)
Score: 最终信用分数

概率、统计、对数、线性回归、最优化

特征计算规则、评分公式

1. 离线训练:准备历史样本(带标签:好/坏)。
2. 特征分箱:对每个特征,使用决策树或卡方分箱,使每箱的WOE单调。计算每个特征的IV,筛选IV>0.02的特征。
3. 模型训练:将筛选后特征的WOE值作为训练数据,用逻辑回归拟合。求解 β使得负对数似然 -ln L(β)最小。
4. 评分卡制作:设定基准分(如600分对应比率1/50),计算 A, B。生成每个特征分箱的分数表:Score_ij = - (B * β_i * WOE_ij)
5. 在线推理:收到用户请求,获取特征值,查表得到每个特征的分箱及对应 WOE_ijScore_ij。基础分 Base_Score = A - B*β_0总评分 = Base_Score + Σ Score_ij

用户特征数据流从多个源头(实时行为流、离线特征库)汇聚到评分引擎。特征计算节点从原始数据流中提取出特征向量流 XX流入“分箱与WOE映射”节点,转换为WOE向量流 WW流入线性模型节点,计算 logit = β_0 + β·W。最后,logit流入分数转换节点,输出最终的信用分数据流 S。模型参数(β, A, B, WOE映射表)作为控制平面参数,周期性更新。

信用风险建模、统计推断、可解释AI

银行贷款审批、企业客户信用评估

CPU:在线推理服务CPU执行简单的查表和加减乘除运算,延迟极低。离线训练在GPU/CPU集群上进行。
内存:在线服务加载评分卡模型(分箱规则、WOE、系数)到内存,实现快速查找。
存储盘:存储用户特征数据、模型版本。
数据流:请求 -> 获取用户ID -> 并行查询多个特征服务 -> 特征拼接 -> CPU查表计算WOE和部分分 -> 求和 -> 输出分数。

Chat-0029

后端服务模型

小文件存储

小文件合并与索引模型

Facebook Haystack 索引结构

目标:高效存储和检索海量图片、缩略图等小文件(KB~MB级),降低元数据开销和IOPS。
1. 物理文件合并:将大量小文件(photo)逻辑文件追加写入到少数大物理文件(PhysicalVolume)中。每个物理文件大小固定(如100GB)。写入格式:[MagicNumber(4B)] [逻辑文件大小Size(4B)] [逻辑文件数据Data(Size B)] [逻辑文件大小Size(4B)]
2. 内存索引:在内存中维护一个紧凑的索引,映射 (逻辑文件Key) -> (物理文件ID, 文件偏移Offset, 文件大小Size)。索引常驻内存,实现O(1)查找。索引条目设计紧凑,例如:Key(64bit) -> VolumeID(32bit), Offset(40bit), Size(24bit)共16字节。
3. 去重与缓存:对相同内容的文件计算指纹(如SHA1),相同指纹只存储一份。热点文件在CDN和内存缓存多级缓存。
4. 垃圾回收:当文件被删除时,只在内存索引中标记删除,物理文件位置成为“空洞”。后台垃圾回收进程定期合并有效数据到新物理文件,回收旧文件空间。

存储效率:元数据与数据大小的比例。
读取延迟:P99延迟。
吞吐量:每秒读写文件数。

文件系统、索引结构、合并写入

微信头像、聊天图片、朋友圈缩略图存储。特征:文件数量巨大、读取频繁、写一次读多次。

Key: 逻辑文件唯一标识(如文件ID)
PhysicalVolume: 物理卷文件
MagicNumber: 魔数,用于定位恢复
Size: 逻辑文件大小(字节)
Offset: 逻辑文件在物理卷中的字节偏移量
IndexEntry: 内存索引条目,结构体
Fingerprint: 文件内容哈希(如SHA1)

映射、偏移、哈希、缓存

文件读写协议、索引更新逻辑

1. 写文件
- 计算文件内容指纹 fp,查询指纹索引,若存在则直接返回已有Key,实现去重。
- 否则,分配一个新的唯一 Key
- 将文件数据追加写入当前活跃的物理卷文件,记录写入的 (VolumeID, Offset, Size)
- 更新内存索引:Index[Key] = (VolumeID, Offset, Size)。可选更新指纹索引:FingerprintIndex[fp] = Key
2. 读文件
- 通过 Key在内存索引中查找 (VolumeID, Offset, Size)
- 如果缓存命中,直接返回缓存数据。
- 否则,打开对应的物理卷文件,执行 pread(文件句柄, buf, Size, Offset)读取数据,并可能加入缓存。
3. 删除文件:从内存索引中删除该 Key的条目(或标记为删除)。物理空间由GC异步回收。

小文件数据流(写入流)汇聚到存储系统。系统对每个数据块计算指纹流,指纹流经过“去重过滤器”,重复的块流被拦截并返回已有Key,新块流被允许通过。新块流被追加写入到当前活跃的物理卷流中,同时生成一个索引条目流,注入内存索引表。读取请求流通过Key查询内存索引表,索引表返回位置信息流,该流引导文件系统从物理卷流的特定位置读取数据块流,返回给请求方。这是一个典型的“写追加-读随机”的流模式。

对象存储、日志结构合并树思想

海量图片存储、医疗影像归档

CPU:计算文件指纹(SHA1)消耗CPU。索引查找为内存操作,消耗小。
内存:整个索引必须常驻内存。数十亿文件需要TB级内存集群存储索引(通过分片)。
存储盘:物理卷文件存储在HDD或SSD上,顺序写入,随机读取。需要EB级容量。
网络:客户端与存储节点间数据传输。
数据流:上传数据 -> 计算指纹 -> 查重 -> 分配Key -> 追加写盘 -> 更新内存索引 -> 返回Key。下载时:用Key查索引 -> 获取位置 -> 读盘 -> 返回数据。

CPU/内存:索引服务器集群,内存需求巨大(TB~PB级),用于存放全局索引。存储盘:存储节点集群,硬盘容量需EB级,IOPS要求高(SSD用于热点缓存,HDD用于冷数据)。网络:存储节点与索引节点、存储节点与客户端间需高带宽。

Chat-0030

后端服务模型

大文件存储

纠删码冗余与分片存储模型

Reed-Solomon纠删码 (k+m)

目标:可靠、高效地存储视频、安装包等大文件,在保证高可靠性的同时降低存储成本(相比多副本)。
1. 文件分片:将大文件 F分割为 k个等大的数据块(shard):D_1, D_2, ..., D_k。每个块大小为 S
2. 编码生成校验块:使用Reed-Solomon编码,将这 k个数据块视为向量,通过生成矩阵 G(Vandermonde矩阵)计算,生成 m个校验块 C_1, C_2, ..., C_m。运算在有限域 GF(2^8)上进行。公式:[C_1, ..., C_m]^T = G * [D_1, ..., D_k]^TG是一个 m x k的矩阵。
3. 分布式存储:将 n = k + m个块(数据块+校验块)分散存储到 n个不同的存储节点上。每个节点存储一个块。
4. 解码与修复:读取时,从任意 k个节点下载块即可通过解码矩阵 G'恢复原始文件。[D_1, ..., D_k]^T = G'^{-1} * [下载的k个块]^T。当有节点失效(块丢失)时,系统可以通过从存活的 k个节点下载数据,重新编码出丢失的块,写入新节点,实现修复。
5. 成本与可靠性:存储开销为 (k+m)/k,例如 k=10, m=4,开销为1.4倍,低于3副本。可容忍任意 m个节点同时故障。

存储开销(k+m)/k
可靠性:MTTDL(平均数据丢失时间),与 k, m和节点失效率相关。
修复带宽:修复一个丢失块需要从 k个节点读取数据,产生 k*S的流量。

信息论、纠删码、有限域算术

微信聊天中的大视频、文件、朋友圈原图、应用安装包。特征:文件大(MB~GB)、读多写少、需长期保存。

F: 原始大文件
k: 数据块数量
m: 校验块数量
n: 总块数,n = k + m
D_i: 第i个数据块
C_j: 第j个校验块
G: 生成矩阵(m x k,元素在GF(2^8)中)
S: 每个块的大小(字节)
GF(2^8): 256阶伽罗华域

线性代数、有限域、矩阵、分片、冗余

编码/解码流程、修复流程

1. 上传与编码
- 将文件 F分割为 k个数据块 D_1..D_k
- 在内存/CPU/专用硬件中执行RS编码,计算校验块 C_1..C_m。编码是矩阵乘法,可使用加速库(如Jerasure)。
- 将 n个块并行上传到 n个不同的存储节点。
2. 下载与解码
- 客户端请求下载,系统选择 k个可用性最好的节点(可以是数据块或校验块)。
- 并行从这 k个节点下载块。
- 如果下载的块恰好是 k个数据块,直接拼接成文件。
- 如果包含校验块,则执行RS解码(求解线性方程组),恢复出 k个数据块,再拼接。
3. 节点故障修复
- 检测到某个节点块 X丢失。
- 从存活的 k个节点下载对应的块。
- 在修复节点上重新编码计算丢失的块 X
- 将新生成的块 X'存储到新的健康节点上。

大文件流在进入存储系统时,被一个“分片器”节点切割成 k个并行的数据块流。这 k个数据块流流入“编码器”节点,编码器通过线性变换矩阵 G,生成额外的 m个校验块流。原始的 k个数据块流和新生的 m个校验块流,总共 n个块流,被路由到分布式的存储节点集合中。读取时,一个“解码器”节点从存储节点集合中拉取任意 k个块流,通过可能需要的逆线性变换,还原出原始的 k个数据块流,然后“合并器”节点将它们拼接成原始文件流。

分布式存储、纠删码理论、网络编码

云存储、档案存储

CPU:编码和解码过程消耗大量CPU,特别是对于大文件和大的 k, m。可使用Intel ISA-L库或GPU加速。
内存:编码/解码时需要内存存放 k+m个块的数据进行矩阵运算。
存储盘:存储节点使用廉价的HDD,容量大。
网络:上传/下载/修复过程产生大量内部网络流量,需高带宽骨干网。
数据流:文件 -> 分片 -> 编码 -> 并行上传到多个存储节点。下载时:从多个节点并行拉取块 -> 解码 -> 合并 -> 返回文件。

CPU/GPU:编码集群,使用CPU或GPU加速纠删码计算。存储盘:海量存储节点(成千上万),总容量达ZB级。网络:存储节点间需超高带宽网络(>100Gbps)以支持修复流量。内存:编码中间缓冲区。

Chat-0031

后端服务模型

视频直播

低延迟实时传输与混流模型

WebRTC 传输与 Selective Forwarding Unit (SFU)

目标:实现多人视频通话或直播连麦,保证低延迟、高同步性,并支持服务器端混流(合成单路流)。
1. 端到端传输:使用WebRTC协议栈。音频编码(Opus)、视频编码(VP8/VP9/H.264)。通过ICE建立P2P或中转连接。使用SRTP进行加密传输。拥塞控制使用Google Congestion Control (GCC)算法,基于延迟变化和丢包率调整发送码率。
2. SFU路由:在服务器端部署SFU。每个参与者将其音视频流推送到SFU。SFU不进行解码,只根据订阅关系,将接收到的流选择性转发给其他参与者。例如,在N人会议中,每个参与者上行一路流,SFU下行N-1路流给该参与者。
3. 服务器端混流:对于直播场景,可能需要将多路视频合成为一个画面。混流服务器(MCU或特定混流服务)需要解码各路上行流,按照布局(如画中画、平铺)重新编码合成一路流,再以RTMP或HLS推送到CDN。布局坐标计算:假设画布大小为 (W, H),第i个视频流位置为 (x_i, y_i),大小为 (w_i, h_i),需满足不重叠等约束。
4. 音频混音:将多路音频PCM流进行加权求和与防溢出处理:mixed_sample = Σ (gain_i * sample_i),然后进行归一化或动态范围压缩。

端到端延迟:从采集到播放的总延迟,目标<400ms。
同步性:音画同步、多路视频间同步。
资源消耗:服务器端下行带宽和计算资源(混流时)。

实时传输协议、网络自适应、多媒体处理

微信视频通话、视频号直播连麦。特征:实时交互、网络抖动敏感、计算密集型(混流)。

RTT: 往返时延
packet_loss: 丢包率
target_bitrate: GCC计算的目标码率
SFU: 选择性转发单元
MCU: 多点控制单元(混流)
(W, H): 混流画布分辨率
(x_i, y_i, w_i, h_i): 第i路流的布局位置和大小
gain_i: 第i路音频的增益系数
sample_i: 第i路音频的PCM采样值

网络传输、坐标几何、信号混合、优化

SDP协商、RTP/RTCP报文、混流指令

1. 信令交换:通过信令服务器交换SDP offer/answer,建立会话。
2. 传输建立:ICE收集候选地址,进行连通性检查,建立SRTP通道。
3. 推流上行:客户端采集、编码,通过SRTP将流推送到SFU服务器。
4. 流路由/混流
- SFU模式:SFU根据订阅列表,将用户A的视频流转发给订阅了A的用户B、C...。
- 混流模式:混流服务器拉取多路上行流,解码,将视频帧按布局摆放到新画布上,重新编码;对多路音频进行混音。生成单路流。
5. 下行分发:SFU转发的多路流或混流后的单路流,通过SRTP/RTMP等协议下发给观众/参与者。
6. 拥塞控制:接收端定期发送RTCP Receiver Report (RR)包,包含丢包、延迟信息。发送端GCC算法根据这些反馈调整 target_bitrate

音视频流从每个参与者端产生,形成上行流 U_i。在SFU架构中,所有 U_i汇聚到SFU节点。SFU内部有一个路由矩阵 RR[i][j]表示是否将流 i转发给参与者 j。根据 R,SFU生成N个下行流 `D_j = {U_i

R[i][j]=1}分发给各个参与者。在混流架构中,多路上行流U_i汇聚到混流节点,被解码为原始帧流,然后被“布局合成器”合并为一个视频帧流,再被编码为单路下行流D` 广播给所有观众。音频流类似,经过“混音器”合并。

实时通信、多媒体系统、网络自适应

远程教育、视频会议

CPU/GPU:客户端编码/解码可使用硬件加速。服务器端SFU消耗带宽和少量CPU(转发逻辑)。混流服务器消耗大量CPU/GPU进行解码、合成、编码。
内存:存储缓冲区、解码后的帧数据。
网络:上行、下行带宽要求高,特别是多对多场景。需全球加速网络优化传输路径。
数据流:摄像头/麦克风 -> 编码 -> SRTP发送 -> 网络 -> SFU/混流服务器 -> 路由/合成 -> SRTP/RTMP发送 -> 网络 -> 客户端 -> 解码 -> 渲染/播放。

Chat-0032

后端服务模型

投资系统

投资组合优化模型

马科维茨均值-方差模型

目标:给定一组资产,在预期收益和风险(波动)之间取得平衡,构建最优投资组合。
1. 模型输入
- n种资产的历史收益率序列,计算预期收益率向量 μ(n x 1),其中 μ_i = E[R_i]
- 收益率的协方差矩阵 Σ(n x n),其中 Σ_ij = Cov(R_i, R_j),对角线 Σ_ii = σ_i^2为方差。
2. 投资组合:投资组合由权重向量 w(n x 1) 表示,Σ w_i = 1w_i可为负(表示卖空)。组合的预期收益 R_p = w^T μ,组合的方差(风险)σ_p^2 = w^T Σ w
3. 优化问题
- 最小方差组合:在给定预期收益 R_target下,最小化风险:min_w (w^T Σ w),约束条件:w^T μ = R_target, w^T 1 = 1
- 最大夏普比率组合:最大化单位风险超额收益:max_w ( (w^T μ - R_f) / sqrt(w^T Σ w) ),其中 R_f为无风险利率。此优化等价于求解一个二次规划问题。
4. 有效前沿:求解不同 R_target下的最小方差组合,得到一条在收益-风险空间中的抛物线边界,称为有效前沿。所有最优组合都落在这条前沿上。

估计误差μΣ的估计误差会严重影响优化结果,需使用正则化或贝叶斯方法改进。
夏普比率:衡量风险调整后收益。

现代投资组合理论、最优化、统计学

零钱通、理财通等产品的底层资产配置。特征:多维资产、收益不确定、风险厌恶。

n: 资产数量
R_i: 第i种资产的收益率(随机变量)
μ: 预期收益率向量 (n x 1)
Σ: 收益率协方差矩阵 (n x n)
w: 投资组合权重向量 (n x 1)
R_p: 投资组合预期收益
σ_p^2: 投资组合收益方差
R_f: 无风险利率
R_target: 目标预期收益
1: 元素全为1的列向量

线性代数、最优化、概率统计、二次规划

投资组合构建规则、约束条件

1. 数据准备:收集历史价格数据,计算对数收益率或简单收益率。估计 μΣ。可引入指数加权移动平均(EWMA)给予近期数据更高权重。
2. 设定约束:根据业务,可能增加约束,如 w_i ≥ 0(禁止卖空),w_i ≤ 0.1(单一资产上限)。
3. 求解优化问题
- 对于最小方差组合,构建拉格朗日函数:L(w, λ1, λ2) = w^T Σ w + λ1*(w^T μ - R_target) + λ2*(w^T 1 - 1)
- 对 w, λ1, λ2求偏导并令为0,得到线性方程组:[2Σ, μ, 1; μ^T, 0, 0; 1^T, 0, 0] * [w; λ1; λ2] = [0; R_target; 1]
- 求解该方程组得到最优 w*
4. 生成有效前沿:遍历一系列 R_target值,重复求解,得到一系列 (σ_p, R_p)点,构成有效前沿。

资产收益率数据流(时间序列)输入到模型估计模块,产生参数流 (μ, Σ)。参数流和投资者风险偏好(R_target或风险厌恶系数)作为输入,流入二次规划求解器。求解器内部通过迭代算法(如内点法)产生一个优化的权重向量流 w*。这个权重向量流定义了资金流向各个资产的分配比例。整个系统是一个从市场数据到资产配置的映射函数。

金融工程、资产定价、风险管理

资产管理、量化投资

CPU:优化求解,特别是当资产数量 n很大时,求解涉及大规模矩阵运算,需要高性能CPU。
内存:存储历史数据、协方差矩阵(n x n)。
存储盘:存储历史市场数据。
数据流:市场数据源 -> 清洗计算收益率 -> 估计 μ, Σ-> 输入优化器 -> 求解权重 -> 输出资产配置方案。

CPU:用于模型计算和优化的服务器,对单核性能有要求。内存:存储协方差矩阵,n=1000时矩阵约8MB。网络:实时获取市场数据。存储盘:历史数据库。

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0048

后端服务模型

媒体消息

富媒体消息即时转码与压缩模型

感知编码与渐进式传输

目标:在聊天中发送图片、语音等富媒体消息时,在接收端网络和设备能力未知的情况下,快速生成适配的版本,保证体验并节省流量。
1. 快速感知编码:对于图片,在服务器端预先生成多个分辨率/质量版本(如缩略图、中等质量、原图)。使用快速缩略图算法(如 Lanczos 重采样)和下采样。对于语音,采用感知音频编码(如 Opus),根据网络状况动态调整比特率。编码目标:在最小可察觉失真下最大化压缩率。
2. 渐进式传输与懒加载:消息中首先包含一个极小的预览版本(如 Base64 嵌入的极低分辨率图或语音波形图)。接收方客户端根据当前网络(Wi-Fi/4G)和设备能力(屏幕尺寸、存储空间),决策是否及何时下载更高质量的版本。决策函数:fetch_high_res = if (network_type == ‘Wi-Fi’ or (user_action == ‘click_to_view’ and network_speed > threshold)) then true else false
3. 设备感知参数选择:客户端上报设备能力 CAP = (screen_width, screen_height, max_decoding_capability, free_storage)。服务器根据 CAP选择最合适的已转码版本,或实时转码。例如,对于图片,选择满足 W_img ≤ screen_width * 2H_img ≤ screen_height * 2的最小版本。

转码速度:从上传到生成多版本的时间(P99)。
带宽节省:实际传输数据量 vs 原图数据量的比率。
用户体验:从点击到清晰图展示的延迟。

图像处理、音频编码、信息论中的率失真理论、渐进式传输

微信聊天图片、语音消息。特征:实时性要求高、网络和设备异构、需节省流量和存储。

I_orig: 原始媒体文件
{V_i}: 转码后的多个版本,V_i = (resolution_i, quality_i, size_i)
CAP: 客户端设备能力向量
network_type: 网络类型(枚举)
network_speed: 当前网络速度估计(bps)
user_action: 用户交互动作(如‘preview’, ‘click_to_view’)
threshold: 触发下载高质量版本的网络速度阈值

优化、决策、编码、采样、压缩

设备适配规则、传输决策逻辑

1. 上传与即时转码:客户端上传 I_orig,服务器接收并立即启动并行转码任务,生成多个版本 {V_thumbnail, V_medium, V_original},存储并返回 V_thumbnail的 URL 和元数据。
2. 消息发送:消息体中包含 V_thumbnail的 URL 和 V_original的 URL(或其他版本 URL)。
3. 客户端接收与决策:客户端收到消息,立即加载 V_thumbnail并显示。同时,根据 network_type, network_speed, CAP以及用户是否有点击放大意图,决策是否在后台预加载 V_mediumV_original。决策模型:if (network_type == WIFI) { prefetch(V_medium); } else if (user_action == CLICK) { if (network_speed > THRESHOLD) { fetch(V_original); } else { fetch(V_medium); } }
4. 下载与替换:下载高质量版本后,在本地替换低质量版本用于展示,并缓存。

原始媒体文件流上传到服务器,被“转码处理器”节点分流成多个不同质量/分辨率的媒体流分支。消息元数据流携带这些分支的访问地址流向客户端。客户端“决策器”节点根据环境状态流(网络、设备、用户交互)选择一个或多个媒体流分支进行下载。高质量的媒体流分支可能作为后台预取流存在,仅在需要时才切换到前台展示流。这是一个带反馈和预测的媒体流选择系统。

多媒体通信、自适应流、设备适配

移动社交应用、远程医疗影像

CPU/GPU: 服务器端转码集群使用 CPU(如 FFmpeg)或 GPU(如 NVIDIA NVENC)进行并行编码。内存: 存储转码过程中的中间帧数据。存储盘: 存储多版本媒体文件,采用分级存储(热数据 SSD,冷数据 HDD)。网络: 上传和下载带宽,以及 CDN 分发网络。
数据流: 客户端上传 -> 服务器接收并转码(并行生成多个版本)-> 存储到对象存储/CDN -> 返回元数据 -> 客户端决策下载 -> CDN 传输。

CPU/GPU: 转码集群规模需支持海量并发上传,GPU 加速编码。网络: CDN 全球分发网络需 Tbps 级带宽。存储盘: 对象存储容量达 EB 级。内存: 转码节点需要大内存处理高分辨率媒体。

Chat-0049

后端服务模型

展示服务

个性化 Feed 流排序与混排模型

多目标优化与 contextual bandit

目标:在朋友圈、视频号等信息流中,对候选内容(帖子、视频)进行个性化排序,同时平衡点击率、停留时长、多样性等多个目标。
1. 特征工程:用户特征 U(画像、历史行为),内容特征 I(文本、图像、发布者),上下文特征 C(时间、地点、设备)。构建联合特征向量 x = φ(U, I, C)
2. 多目标预测:使用多任务学习模型(如 MMoE)预测多个目标 y = [y_ctr, y_vtr, y_like, ...],其中 `y_ctr = P(click

x),y_vtr = E[view_time

x]等。共享底层特征,上层有多个塔(Tower)网络分别预测不同目标。<br>3. **多目标打分融合**:综合多个预测分,得到最终效用分Utility(I

U,C) = Σ_i w_i * f_i(y_i),其中w_i为人工或自动学习的权重,f_i为校准或归一化函数(如log)。<br>4. **多样性混排**:在按Utility排序的列表上,应用多样性约束,如 MMR(Maximal Marginal Relevance):MMR = argmax_I [λ * Utility(I) - (1-λ) * max_{J in S} sim(I, J)],其中S是已选集合,sim` 是内容相似度。避免连续出现高度相似的内容。

在线指标:人均 Feed 刷新次数、总停留时长、互动率(点赞、评论)。
离线指标:AUC 提升(各目标)、多样性指标(如类别分布)。
探索与利用:通过 bandit 算法(如 Thompson Sampling)平衡。

多目标学习、排序学习、推荐系统、多样性优化

朋友圈信息流、视频号推荐流、看一看。特征:实时个性化、多目标(点击、时长、社交互动)、需新颖性和多样性。

U: 用户特征向量
I: 内容特征向量
C: 上下文特征向量
x: 联合特征向量
y_i: 第 i 个目标的预测值
w_i: 第 i 个目标的融合权重
λ: 多样性与相关性权衡参数 (0~1)
sim(I,J): 内容 I 与 J 的相似度(如余弦相似度)
S: 已选入最终列表的内容集合

向量、概率、加权和、优化、相似度

排序与混排规则、多目标模型结构

1. 候选召回:从海量内容池中通过多个召回通道(协同过滤、兴趣标签、热门)获取数百到数千候选内容 {I}
2. 精排预测:对每个候选 I,拼接特征 x = φ(U, I, C),输入多任务深度模型,得到多目标预测向量 y
3. 分数融合:计算每个候选的最终分数 s = Σ_i w_i * f_i(y_i)。按 s降序得到初始排序列表 L
4. 重排与混排:从 L中依次选择内容加入最终列表 S。对于 L中每个待选内容 I,计算其与 S中已有内容的相似度,调整其得分:s’ = λ * s - (1-λ) * max_{J in S} sim(I, J)。选择 s’最大的 I加入 S,直到 S达到所需长度。
5. 在线学习与探索:将展示结果、用户反馈(点击、停留等)记录为日志,用于模型在线更新(如 contextual bandit),动态调整权重 w_i或模型参数。

用户请求流携带 UC特征流入推荐系统。系统从内容池中召回候选内容流 {I}。每个候选内容 IU, C结合形成特征流 x,输入多目标预测模型,产生多目标分数流 [y_i]。融合模块将这些分数流合并为单一效用分 s流。重排模块接收排序后的 s流和内容特征流,应用多样性规则,输出最终有序的内容列表流给用户。用户反馈流(点击、停留等)回流系统,用于模型更新。

推荐系统、多目标优化、信息检索

Chat-0050

后端服务模型

支付系统

分布式事务强一致性模型

Paxos 协议下的分布式账本

目标:在支付、转账等金融核心场景,保证跨多个账户的余额变更具有强一致性(ACID),即使部分节点故障。
1. 账本抽象:每个账户的余额变更记录为一个只追加的日志条目。跨账户转账涉及对多个日志的原子追加。
2. Multi-Paxos 应用:将 Paxos 实例化用于确定日志条目序列。每个日志索引对应一个 Paxos 实例。Proposer(支付服务)发起提案,内容为“从A账户扣款X元,向B账户加款X元”。Acceptor(账本分片)接受提案。Learner(副本)学习已确定的日志条目并应用到状态机(余额表)。
3. 状态机复制:所有副本按相同顺序应用日志条目,保证最终状态一致。余额检查:在提案前,Proposer 需读取本地状态机的最新余额,验证 A 账户余额 ≥ X,否则提案被拒绝。
4. 线性一致性:通过 Paxos 确定全局顺序,所有操作(读、写)都拥有一个全局的、实时的顺序,读操作能看到之前已提交的写。实现上,读操作也可以走一次 Paxos 流程,或由 Leader 提供强一致读。

强一致性:所有副本状态严格一致。
可用性:在多数派节点存活时可用。
延迟:一次 Paxos 提交需要至少一次往返多数派的延迟。

分布式共识、状态机复制、线性一致性

微信支付核心转账、零钱通份额变更。特征:数据强一致、高可用、容错、低延迟要求高。

index: 日志条目索引(整数)
value: 提案值,即转账操作 (from_account, to_account, amount)
proposal_id: 提案编号(单调递增)
accepted_id, accepted_value: Acceptor 已接受的最高提案编号和值
quorum: 法定人数,⌊N/2⌋+1
balance: 账户余额状态

共识、顺序、状态机、原子性

转账事务协议、Paxos 协议

1. 客户端请求:客户端发送转账请求 T=(from, to, amount)给 Proposer(Leader)。
2. 余额预检:Proposer 读取本地状态机(或通过一次 Paxos 读)获取 from账户余额 bal。若 bal < amount,返回失败。
3. Paxos 提案:Proposer 选择下一个日志索引 i和新的 proposal_idn,向所有 Acceptors 发送 Prepare(n, i)请求。
4. Paxos 承诺:Acceptor 若未响应过编号大于 n 的 Prepare,则承诺并回复 Promise(n, accepted_id, accepted_value)
5. Paxos 接受:Proposer 收到多数派 Promise 后,若所有回复的 accepted_value为空,则使用 value = T;否则使用 accepted_id最大的 accepted_value。然后发送 Accept(n, i, value)给 Acceptors。
6. Paxos 学习:Acceptor 收到 Accept,若未承诺过编号大于 n 的请求,则接受该提案,并广播 Accepted(n, i, value)。Learner(包括 Proposer)收到多数派 Accepted 后,认为日志条目 i已确定,值为 value
7. 状态机应用:Learner 将已确定的日志条目按顺序应用到状态机:balance[from] -= amount; balance[to] += amount;
8. 响应客户端:Proposer 在应用后,返回客户端成功。

转账请求流 T进入 Leader。Leader 将其作为 Paxos 协议流的输入值。Paxos 协议流是一个多阶段的消息交换流:Prepare 请求流、Promise 响应流、Accept 请求流、Accepted 响应流。当协议流在某个日志索引 i上达成共识时,产生一个已确认的日志条目流。这个日志条目流被有序地应用到所有副本的状态机上,产生确定性的状态变更流(余额更新)。客户端请求流的处理结果(成功/失败)依赖于状态机应用后的状态。

分布式数据库、共识算法、金融系统

银行核心系统、分布式账本

CPU: Paxos 参与节点(Proposer/Acceptor/Learner)的 CPU 处理协议消息和状态机应用。
内存: 存储 Paxos 状态(承诺、接受值)、日志缓存、状态机内存镜像。
存储盘: 持久化日志条目(WAL)和状态机快照,保证崩溃恢复。
网络: 节点间需要低延迟、高可靠的网络进行多轮消息交换。

CPU: 共识集群(如 5 节点),CPU 用于协议处理和状态机应用。时钟: 不依赖严格同步。网络: 节点间需超低延迟(同城多数据中心)网络,RDMA 可加速。内存/存储盘: 持久化日志和状态机,需高性能 SSD。

Chat-0051

后端服务模型

搜索引擎

倒排索引构建与排名模型

BM25F 与学习排序 (Learning to Rank)

目标:对海量文本(公众号文章、聊天记录)建立索引,支持快速全文检索,并按照相关性排序。
1. 倒排索引构建:文档 D经过分词得到词项 t。建立映射 t -> posting_list,其中 posting_list是包含 t的文档 ID 列表,以及在该文档中的词频 tf、位置等信息。使用跳跃表或 Roaring Bitmap 压缩存储列表。
2. BM25F 相关性评分:BM25 的域扩展版本,用于结构化文档(如标题、正文)。score(D, Q) = Σ_{t in Q} IDF(t) * TF(t, D),其中 TF(t, D) = Σ_{field f} w_f * (tf_{t,f} * (k1+1)) / (tf_{t,f} + k1 * (1 - b + b * (dl_f / avgdl_f)))IDF(t) = log((N - n_t + 0.5)/(n_t + 0.5) + 1)w_f是域权重,dl_f是域长度,avgdl_f是平均域长度,k1, b是调优参数。
3. 学习排序 (LTR):使用机器学习模型(如 LambdaMART)对 BM25 等基础特征进行加权组合,优化排序。特征包括:BM25 分数、查询词项在文档中的覆盖度、文档的 PageRank 值、文档新鲜度等。模型训练目标是最小化排序损失(如 NDCG loss)。
4. 分布式索引与查询:索引按文档 ID 或词项哈希分片到多个节点。查询时,将查询 Q分发到所有分片,每个分片返回 Top-K 结果,然后在聚合节点进行归并得到全局 Top-K。

检索精度:MAP、NDCG 等指标。
查询延迟:P95 查询响应时间。
索引吞吐量:文档建索引的速度。

信息检索、概率模型、机器学习排序

微信“搜一搜”(文章、聊天记录)。特征:海量文本、实时索引更新、多字段、个性化需求。

t: 词项(term)
D: 文档
Q: 查询,词项集合 {t}
N: 文档总数
n_t: 包含词项 t的文档数
tf_{t,f}: 词项 t在文档 D的域 f中的词频
dl_f: 文档 D的域 f的长度(词数)
avgdl_f: 所有文档域 f的平均长度
k1, b: BM25 调优参数(通常 k1∈[1.2,2.0], b≈0.75
w_f: 域 f的权重(如标题权重 > 正文)
feature vector: 用于 LTR 的特征向量

统计、对数、加权和、排序损失、梯度提升

索引构建流程、查询处理与评分

1. 索引构建:文档 D经过分词、去停用词、词干化,得到词项列表。对于每个词项 t和其出现的域 f,更新倒排列表:将文档 ID doc_idtf_{t,f}和位置信息追加到 tposting_list中。同时更新全局统计信息 N, n_t, avgdl_f
2. 查询处理:对查询 Q分词,得到词项列表。对于每个查询词项 t,从倒排索引中取出其 posting_list
3. 初步评分:对于每个包含任意查询词项的文档 D,计算 BM25F 分数:score_bm25 = Σ_{t in Q} IDF(t) * TF(t, D)。这是一个近似计算,可通过 WAND 等算法动态决定文档是否需要完全评分。
4. 特征提取:对 Top-K 候选文档,提取 LTR 特征向量 φ(D, Q)
5. 学习排序:将特征向量 φ输入已训练的 LTR 模型(如 GBDT),得到最终的排序分数 score_ltr
6. 结果归并:如果是分布式索引,聚合节点收集各分片的 Top-K 结果,按 score_ltr重排序,返回全局 Top-K。

文档流经过“文本处理管道”(分词、标准化)被拆解成词项流。每个词项流流入倒排索引构建器,更新其对应的倒排列表。查询流进入后,被拆解成查询词项流,每个词项流去倒排索引中查找,返回对应的文档列表流。这些文档列表流在“文档评分器”中合并,对每个候选文档计算特征流(包括 BM25 分数流)。特征流输入“排序模型”得到最终分数流,最后经过“排序器”产生有序的文档结果流。

搜索引擎、文本检索、机器学习

企业搜索、知识库检索

CPU: 索引构建时分词和倒排列表合并消耗 CPU。查询时评分和排序消耗 CPU,LTR 模型推理需要计算能力。
内存: 倒排索引的热点部分常驻内存(如词典、常用词的倒排列表)。
存储盘: 索引文件存储在 SSD 上,以支持高随机读。
网络: 分布式搜索时,查询分发和结果归并需要网络通信。

CPU: 索引和查询集群需要多核高性能 CPU,特别是对文本处理。内存: 倒排索引内存缓存需 TB 级。存储盘: 全量索引存储在 SSD 阵列上,容量 PB 级。网络: 聚合节点与分片节点间需高带宽。

Chat-0052

后端服务模型

小程序沙箱

JavaScript 隔离与资源限制模型

V8 Isolate 与 CPU/内存配额

目标:安全地运行第三方小程序 JavaScript 代码,防止其访问或影响宿主环境,并限制其资源使用。
1. JavaScript 引擎隔离:使用 V8 引擎的 Isolate 概念。每个小程序运行在独立的 Isolate 中,拥有独立的堆内存、全局对象和执行上下文。Isolate 间内存不共享,通过序列化(如ArrayBuffer)通信。
2. CPU 时间限制:使用“中断”机制。在运行 JavaScript 代码前设置一个计数器或定时器。在 V8 的“中断检查点”(如循环迭代、函数调用入口)检查是否超时。实现:v8::Isolate::SetTerminateExecutionv8::Isolate::IsExecutionTerminating。限制每个任务或事件循环的最大 CPU 时间。
3. 内存限制:通过 v8::ResourceConstraints设置堆内存大小限制。当内存接近限制时,触发垃圾回收(GC)。如果 GC 后仍超限,则终止脚本执行。监控对象数量和总大小。
4. API 访问控制:通过注入一个受限制的 wx对象到沙箱全局环境,提供安全的 API。所有对原生系统(网络、存储、UI)的访问都必须通过该对象,并在 C++ 层进行权限检查和参数校验。

安全性:无法突破沙箱访问宿主或其它小程序。
资源控制精度:CPU 和内存使用的限制准确性。
性能开销:隔离和监控带来的额外开销。

语言虚拟机、沙箱技术、资源隔离

微信小程序运行环境。特征:执行不可信第三方代码、需严格资源限制、保证宿主安全。

Isolate: V8 隔离实例
Context: JavaScript 执行上下文
heap_size_limit: 堆内存大小限制(字节)
cpu_time_limit: 单次任务 CPU 时间限制(毫秒)
wx: 注入的安全 API 对象
ResourceConstraints: V8 资源约束配置

隔离、限制、监控、API 拦截

代码加载与执行流程、资源监控规则

1. 小程序启动:创建新的 V8 Isolate 和 Context。配置内存限制 heap_size_limit
2. 代码加载与编译:将小程序的 JavaScript 代码字符串编译为 V8 脚本。
3. API 注入:在 Context 的全局对象上创建并绑定 wx对象,其属性对应各种安全封装过的原生方法。
4. 执行与监控
- CPU 监控:在调用 script->Run()前,启动一个监控线程或信号,在 cpu_time_limit后调用 isolate->TerminateExecution()
- 内存监控:通过 isolate->AddMemoryAllocationCallback设置内存分配回调,监控当前堆使用量。接近 heap_size_limit时触发 GC,超限则终止。
5. API 调用:当小程序代码调用 wx.request()等 API 时,V8 会调用到 C++ 绑定层。C++ 层检查调用权限、参数合法性,然后执行真正的原生操作,最后将结果序列化返回给 JavaScript。

小程序代码文本流被加载到沙箱环境。代码流在 Isolate 中被解析、编译成字节码流,然后执行。执行过程中产生的内存分配流和 CPU 时间消耗流被“资源监控器”节点持续测量。如果资源流超过配额,监控器会注入一个“终止信号流”到执行引擎,中断代码执行流。API 调用流从 JavaScript 执行流中产生,流经安全封装层,被校验和转换,然后才流入底层的原生系统资源流(网络、文件等)。

浏览器安全模型、资源隔离、能力控制

云函数、插件系统

CPU: 每个小程序的 Isolate 运行在独立的线程或进程中,CPU 时间被严格计量和限制。宿主进程需要调度多个 Isolate。
内存: 每个 Isolate 有独立的堆内存,受限制。宿主需要管理大量 Isolate 的总内存。
系统调用: 所有敏感 API 调用都被拦截和重定向到安全的实现。

CPU: 需要大量 CPU 核心来并行运行成千上万的小程序实例。内存: 需要巨大的总内存来容纳大量 Isolate,每个 Isolate 内存限制在几十 MB。时钟: 用于精确计量 CPU 时间。

Chat-0053

后端服务模型

消息推送

长连接保活与网络状态探测模型

自适应心跳与 TCP Keep-Alive 优化

目标:在移动网络不稳定、NAT 超时等因素下,维持客户端与服务器长连接活性,及时探测连接有效性,并快速感知断线重连。
1. 自适应心跳:客户端定期向服务器发送心跳包(ping),服务器回复 pong。心跳间隔 T_heartbeat根据网络条件和历史往返时间(RTT)动态调整。公式:T_heartbeat = max(T_min, min(T_max, α * RTT_smoothed + β)),其中 RTT_smoothed是平滑后的 RTT(如指数加权移动平均:RTT_s = γ * RTT_old + (1-γ) * RTT_new),α, β, γ为参数,T_min, T_max为最小最大间隔。
2. TCP Keep-Alive 辅助:在应用层心跳基础上,启用 TCP Keep-Alive 作为底层保活。设置 tcp_keepalive_time(如 300 秒)、tcp_keepalive_intvl(如 75 秒)、tcp_keepalive_probes(如 3 次)。当应用层心跳失效时,TCP 层可探测并关闭无效连接。
3. 断线快速检测:除了心跳超时,还利用 TCP 特性。服务器发送数据时,如果收到 TCP RST 或多次重传失败,立即判定连接断开。客户端检测网络状态变化(如 WiFi 到 4G),主动重连。
4. 连接迁移:在客户端 IP 变化(如网络切换)但连接未完全断开时,支持会话迁移。通过客户端标识(如 deviceId + userId)和令牌(token)在服务器端关联新连接与旧会话状态。

连接存活率:长连接的平均存活时间。
断线检测延迟:从实际断线到系统感知的时间。
心跳开销:心跳流量占总流量的比例。

网络协议、移动网络特性、自适应算法

微信消息推送长连接、实时通知。特征:海量连接、移动网络不稳定、需低延迟感知断线。

T_heartbeat: 应用层心跳间隔(秒)
RTT: 最近一次心跳的往返时间
RTT_smoothed: 平滑后的 RTT
α, β, γ: 自适应参数,α通常 >1,β为常数项
T_min, T_max: 心跳间隔上下限(如 25s, 300s)
tcp_keepalive_*: TCP Keep-Alive 相关内核参数
deviceId, userId, token: 用于连接迁移的标识

平滑、自适应、最大值/最小值、网络探测

心跳调度算法、断线检测与重连逻辑

1. 连接建立:客户端与服务器建立 TCP 连接,进行认证,获取 token,服务器记录 (client_id, connection)映射。
2. 心跳发送:客户端启动心跳定时器,间隔初始为 T_initial。定时器触发,发送 ping 包,记录发送时间 t_send
3. 心跳响应:服务器收到 ping,立即回复 pong。客户端收到 pong,记录 RTT_new = now() - t_send,更新 RTT_smoothed,并计算新的 T_heartbeat,重置定时器。
4. 心跳超时处理:如果发送 ping 后,在 T_heartbeat * k(k=2~3)时间内未收到 pong,判定心跳超时,断开连接并触发重连。
5. TCP 层探测:操作系统 TCP 栈在连接空闲 tcp_keepalive_time后,开始发送 Keep-Alive 探测包。若连续 tcp_keepalive_probes次无响应,内核关闭连接,应用层感知到错误。
6. 网络切换重连:客户端监听网络状态变化事件,当网络类型变化或 IP 地址变化时,主动发起重连,并在新连接上携带 token和旧会话信息。

客户端和服务器之间存在一个双向的“连接活性流”。应用层定期注入“心跳包流”(ping)到该连接流中,并期望在预期时间内收到“心跳响应流”(pong)。RTT 测量流用于动态调节心跳包流的间隔。如果响应流中断超过阈值,连接活性流被判定为失效,触发“重连流”。同时,底层的 TCP Keep-Alive 机制也产生一个低频的探测流,作为应用层心跳流的备份。网络状态变化事件流也可能直接触发重连流。

移动网络通信、连接管理、容错

物联网设备长连接、在线游戏

CPU: 服务器和客户端处理心跳包消耗少量 CPU。服务器需要维护大量连接的心跳定时器。
内存: 服务器存储海量连接状态(socket 描述符、心跳时间、用户信息)。
网络: 心跳包产生持续的、低带宽的网络流量。海量连接消耗大量端口和内存缓冲区。
操作系统: 需要调整内核 TCP 参数以支持大量长连接(如 net.ipv4.tcp_max_tw_buckets, net.core.somaxconn)。

CPU: 连接网关服务器需要处理海量心跳包,CPU 消耗在网络 I/O 和定时器管理。内存: 数亿长连接状态内存存储达 TB 级。网络: 需要应对海量并发连接和心跳流量,网络栈优化至关重要。时钟: 需要高精度定时器管理心跳。

Chat-0054

后端服务模型

分布式追踪

大规模采样与存储优化模型

头部采样与尾部采样结合

目标:在全链路追踪中,平衡数据详细度和系统开销,只存储对问题排查最有价值的 Trace 数据。
1. 头部采样 (Head-based Sampling):在 Trace 入口(如网关)做出采样决策,决策依据可以是固定概率(如 0.1%),或基于请求属性(如特定用户、URL)。一旦决定采样,该 Trace 的所有 Span 都会被收集。
2. 尾部采样 (Tail-based Sampling):在 Trace 完成后,根据整个 Trace 的特征(如总耗时、是否包含错误、关键服务延迟)决定是否保留。需要在 Collector 处缓冲完整的 Trace 数据,直到做出决策。
3. 混合采样策略:结合两者。先用头部采样进行粗筛(如 1%),再用尾部采样对粗筛后的 Trace 进行精筛。尾部采样策略:例如,保留所有包含错误的 Trace、所有慢 Trace(总耗时 > 阈值 T_slow)、以及随机采样的一部分正常 Trace(如 0.1%)。
4. 存储分层:高价值 Trace(如错误、慢请求)全量存储,用于详细分析。低价值 Trace 仅存储聚合指标(如延迟分布、请求量),用于监控仪表盘。

采样决策延迟:尾部采样需要等待 Trace 完成,引入存储延迟。
存储成本:采样率直接影响存储数据量。
问题覆盖率:采样策略是否能捕捉到所有有问题的 Trace。

采样理论、数据流处理、决策理论

微信全链路追踪,用于性能监控和故障排查。特征:数据量巨大、需高价值信息提取、存储成本敏感。

p_head: 头部采样率(如 0.001)
Trace: 一个完整的请求追踪,由多个 Span 组成
Span: 追踪中的一个操作单元
T_slow: 慢 Trace 阈值(如 1 秒)
error_flag: Trace 是否包含错误
decision: 采样决策(布尔值)

概率、条件判断、聚合、延迟

采样决策流程、Trace 聚合规则

1. 头部采样:在请求入口(如 API 网关),生成随机数 r ~ U(0,1)。如果 r < p_head,则在请求上下文中设置采样标志 sampled=true,否则 sampled=false。该标志随请求传播。
2. Span 生成与上报:所有服务在生成 Span 时,检查 sampled标志。如果 sampled=true,则将该 Span 上报到 Collector;否则丢弃。
3. 尾部采样缓冲:Collector 接收到属于同一个 Trace 的 Span,将其缓存在内存中,等待 Trace 完成(通过超时或收到根 Span 完成标志)。
4. 尾部采样决策:Trace 完成后,计算其特征:总耗时 duration、是否包含错误 has_error。决策规则:decision = has_error OR (duration > T_slow) OR (rand() < p_tail),其中 p_tail是对正常 Trace 的二次采样率。
5. 存储:如果 decision=true,将 Trace 的所有 Span 写入持久化存储(如 Elasticsearch)。否则,仅将 Trace 的聚合指标(如服务名、耗时、状态码)发送到指标系统,然后丢弃详细 Span。
6. 缓冲清理:设定缓冲超时,超时未完成的 Trace 强制进行尾部采样决策。

所有请求流在入口处被“头部采样器”节点过滤,只有一小部分请求流被标记为采样,其产生的 Span 数据流才会流向 Collector。Collector 将 Span 流按 TraceId 聚合,形成临时的 Trace 流缓存。当 Trace 流完成(或超时)时,“尾部采样决策器”节点根据 Trace 流的特征(延迟、错误)做出最终决策,决定该 Trace 流是流入详细存储流,还是仅提取指标后丢弃。这是一个两级的过滤和决策流。

可观测性、数据降采样、流处理

APM 系统、分布式调试

CPU: Collector 进行尾部采样决策和 Trace 聚合消耗 CPU。
内存: Collector 需要大量内存缓冲未完成的 Trace。
网络: Span 上报网络流量,经采样后大幅减少。
存储: 详细 Trace 存储成本高,需要压缩和冷热分层。

CPU: Collector 集群需要较强算力进行实时聚合和决策。内存: Trace 缓冲内存可能达数百 GB。存储盘: 详细 Trace 存储需要 PB 级容量,采用 TTL 和压缩。网络: Span 上报流量仍需可控,头部采样率是关键。

Chat-0055

后端服务模型

实时通信

消息可靠投递与去重模型

序列号与确认重传 (ARQ)

目标:在端到端或客户端-服务器消息通信中,保证消息不丢失、不重复、按序到达。
1. 序列号:发送方为每条消息分配一个单调递增的序列号 seq。接收方维护下一个期望接收的序列号 expected_seq
2. 确认与重传:接收方收到消息后,向发送方发送确认(ACK),包含已连续接收到的最大序列号 ack_seq。发送方维护一个发送窗口 [send_base, send_base + window_size - 1],窗口内的消息可以发送。发送方为每个已发送未确认的消息启动重传定时器。如果收到 ack_seqsend_base,则移动窗口,并确认所有 seqack_seq的消息。如果某个消息的重传定时器超时,则重传该消息。
3. 去重:接收方根据 seq判断重复。如果 seq< expected_seq,说明是重复消息,直接丢弃并回复 ACK。如果 seq== expected_seq,则交付给应用,并更新 expected_seq++,同时检查缓冲区中是否有后续已到达的消息可以顺序交付。
4. 滑动窗口流量控制:接收方在 ACK 中还可以通告接收窗口 rwnd,表示接收缓冲区剩余空间。发送方确保 发送未确认字节数 ≤ min(cwnd, rwnd),其中 cwnd为拥塞窗口(见 Chat-0002 BBR)。

可靠性:消息最终成功投递的概率(100% 在无永久故障下)。
顺序性:消息按发送顺序被接收方应用层处理的保证。
吞吐量:滑动窗口大小和网络条件决定的最大吞吐量。

可靠传输协议、滑动窗口、自动重传请求

微信消息(单聊、群聊)的可靠投递、实时音视频的信令传输。特征:需强序、不丢不重、网络环境复杂。

seq: 消息序列号(整数)
ack_seq: 确认号,表示期望收到的下一个序列号
send_base: 发送窗口基序号,最早未确认的消息序号
window_size: 发送窗口大小(报文段数)
rwnd: 接收方通告的接收窗口大小(字节)
cwnd: 拥塞窗口大小(报文段数)
timer: 每个已发送未确认消息的重传定时器

序列、窗口、定时、确认、去重

消息发送、接收、确认协议

1. 发送方发送:当应用有消息要发送,且 next_seq_num < send_base + window_sizenext_seq_num - send_base < min(cwnd, rwnd)时,分配 seq = next_seq_num,发送消息 M[seq],启动重传定时器,next_seq_num++
2. 接收方接收:收到消息 M[seq]
- 如果 seq < expected_seq,是重复,发送 ACK(expected_seq)
- 如果 seq == expected_seq,交付给应用,expected_seq++,检查接收缓冲区中是否有 seq = expected_seq的消息,有则交付并递增 expected_seq,直到没有连续消息。发送 ACK(expected_seq)
- 如果 seq > expected_seq,将消息放入接收缓冲区(按 seq排序),发送 ACK(expected_seq)(表示期望的序号)。
3. 发送方处理 ACK:收到 ACK(ack_seq)。如果 ack_seq > send_base,则移动发送窗口 send_base = ack_seq,并停止所有 seq < ack_seq的消息的定时器。如果窗口移动后有待发送消息,则发送。
4. 超时重传:如果某个消息的定时器超时,重传该消息,并重启定时器(可能采用指数退避增加超时时间)。

发送方产生有序的消息流 M[seq]。消息流进入发送窗口缓冲区,然后被注入网络信道。接收方从信道中接收消息流(可能乱序、丢失、重复)。接收方对消息流进行排序和去重,产生有序的交付流给上层应用。同时,接收方生成 ACK 流,反馈给发送方。ACK 流驱动发送方从缓冲区中清除已确认的消息,并可能触发新消息流的发送或旧消息流的重传。网络丢包或延迟会导致 ACK 流中断,从而触发重传流。

计算机网络、传输层协议、可靠数据传输

工业控制通信、文件传输

CPU: 发送方和接收方处理序列号、确认、定时器、缓冲区管理等逻辑消耗 CPU。
内存: 发送方需缓存已发送未确认的消息,接收方需缓存乱序到达的消息。
网络: ACK 产生额外的流量,重传增加流量。
时钟: 需要高精度定时器用于重传超时检测。

CPU: 消息收发服务器需要处理海量并发的连接和消息序列。内存: 发送和接收缓冲区内存消耗与窗口大小和连接数成正比。网络: 可靠传输协议(如 TCP)本身已提供此能力,应用层实现用于业务层消息的可靠投递。时钟: 需要大量定时器管理重传。

Chat-0056

后端服务模型

弹性伸缩

基于时序预测的自动扩缩容模型

Holt-Winters 季节性预测与反应式伸缩

目标:根据应用负载(如 QPS、CPU 使用率)预测未来需求,提前自动调整实例数量,平衡性能和成本。
1. 指标收集:收集历史负载指标时间序列 y_t(如过去几天的 QPS)。
2. 负载预测:使用时间序列预测模型(如 Holt-Winters 三次指数平滑)预测未来一段时间(如下一个小时)的负载 ŷ_{t+1}, ..., ŷ_{t+H}。Holt-Winters 公式:
- 水平分量:L_t = α (y_t - S_{t-s}) + (1-α)(L_{t-1} + T_{t-1})
- 趋势分量:T_t = β (L_t - L_{t-1}) + (1-β) T_{t-1}
- 季节性分量:S_t = γ (y_t - L_t) + (1-γ) S_{t-s}
- 预测:ŷ_{t+h} = L_t + h T_t + S_{t+h-s}
其中 s为季节周期(如 24 小时),α, β, γ为平滑参数(0~1),通过优化历史数据拟合得到。
3. 实例数计算:根据预测负载 ŷ和单个实例的处理能力 capacity_per_instance(如 1000 QPS),计算所需实例数:desired_instances = ceil( ŷ / capacity_per_instance )。考虑缓冲:desired_instances = ceil( ŷ / capacity_per_instance * (1 + buffer_percent) )
4. 执行伸缩:通过云平台 API 或容器编排平台(如 K8s HPA)调整实例副本数。缩容时需考虑连接耗尽、任务完成等优雅终止。

预测准确度:MAPE(平均绝对百分比误差)。
伸缩及时性:从预测到实例 ready 的时间。
成本效益:资源利用率与 SLO(服务等级目标)的平衡。

时间序列分析、预测、自动控制、资源管理

微信后台无状态服务(如 API 网关、业务逻辑服务)的自动扩缩容。特征:负载波动有规律(日周期)、需提前准备资源、避免过度配置。

y_t: 时间 t 的观测负载(如 QPS)
ŷ_{t+h}: 时间 t+h 的预测负载
L_t: t 时刻的水平分量(基值)
T_t: t 时刻的趋势分量(斜率)
S_t: t 时刻的季节性分量
s: 季节周期长度(如 24 * 60/5=288,若5分钟一个点)
α, β, γ: 平滑参数(0~1)
H: 预测步长(如 12 步,未来 1 小时)
capacity_per_instance: 单实例容量
buffer_percent: 缓冲百分比(如 0.2)
desired_instances: 期望实例数

时间序列、指数平滑、季节分解、预测、上取整

预测算法步骤、扩缩容决策逻辑

1. 数据预处理:收集历史负载时间序列,清洗异常值,可能进行对数变换以稳定方差。
2. 模型初始化:使用前 2-3 个季节周期的数据初始化 L, T, S
3. 模型训练:遍历历史数据,迭代更新 L_t, T_t, S_t。使用网格搜索或梯度下降优化 α, β, γ,最小化预测误差(如 SSE)。
4. 滚动预测:在时间 t,使用最新观测值 y_t更新 L_t, T_t, S_t,然后计算未来 H步的预测值 ŷ_{t+1}, ..., ŷ_{t+H}
5. 决策:取未来一段时间(如 [t+1, t+6],即未来30分钟)预测值的最大值 ŷ_max,计算 desired_instances = ceil( ŷ_max / capacity_per_instance * (1+buffer_percent) )
6. 执行:比较 desired_instances与当前实例数 current_instances。如果差值超过阈值(如10%),则触发扩容或缩容操作,通过调用云平台 API 调整实例组大小。
7. 反馈循环:持续监控实际负载与预测负载的偏差,定期(如每天)重新训练模型参数。

负载指标时间序列流 {y_t}流入预测模型。模型内部维护状态流 (L_t, T_t, S_t),每流入一个新的 y_t,状态流更新一次,并输出未来预测流 {ŷ_{t+h}}。预测流进入“决策器”,决策器根据最大值和容量计算产生“期望实例数”流。此流与“当前实例数”流比较,产生“扩缩容动作”流(扩容或缩容指令)。该动作流被发送到资源编排系统,驱动实例集群规模的调整,进而影响未来的实际负载流,形成一个闭环。

预测控制、时间序列分析、云计算资源管理

电商大促资源准备、在线教育峰值预测

CPU: 预测模型训练和滚动预测需要计算,但可离线或在低频率进行,CPU 消耗不大。
内存: 存储历史时间序列数据和模型状态。
网络/API: 与云平台或容器编排系统交互,执行扩缩容动作。
数据源: 从监控系统(如 Prometheus)拉取负载指标。

CPU: 预测服务需要一定的计算资源,但非密集型。存储盘: 存储历史监控数据用于训练。网络: 与监控系统和资源管理平台通信。时钟: 依赖于精确的定时触发预测和伸缩动作。

Chat-0057

后端服务模型

实时推荐

深度学习排序与多任务学习模型

DeepFM 与 Multi-gate Mixture-of-Experts (MMoE)

目标:在推荐系统精排阶段,使用深度学习模型同时预测点击率 (CTR)、转化率 (CVR)、停留时长等多个目标,并共享特征学习。
1. DeepFM 模型结构:结合因子分解机 (FM) 和深度神经网络 (DNN),自动学习低阶和高阶特征交互。
- FM 部分y_FM = w_0 + Σ_i w_i x_i + Σ_i Σ_{j>i} <v_i, v_j> x_i x_j,其中 w_i为一阶权重,v_i为特征 embedding,<·,·>为内积,捕获二阶特征交互。
- DNN 部分:特征 embedding 向量拼接后输入多层全连接网络:a^{(0)} = [e_1, e_2, ..., e_m], a^{(l+1)} = σ(W^{(l)} a^{(l)} + b^{(l)}),输出 y_DNN
- 最终输出ŷ = sigmoid(y_FM + y_DNN),用于 CTR 预测。
2. 多任务学习 (MMoE):共享底层 embedding 和专家网络 (Expert),每个任务有独立的门网络 (Gate) 和塔网络 (Tower)。
- 专家网络:E_k(x) = f_k(x), k=1,...,K,共享输入。
- 任务 t 的门网络:g_t(x) = softmax(W_t x),输出对 K 个专家的权重。
- 任务 t 的输入:h_t = Σ_{k=1}^K g_{t,k}(x) E_k(x)
- 任务 t 的塔网络:ŷ_t = f_t^{(tower)}(h_t),输出任务 t 的预测(如 CTR, CVR)。
3. 训练与损失:总损失为各任务损失的加权和:L = Σ_t λ_t L_t(ŷ_t, y_t),其中 L_t常为交叉熵或均方误差。

离线评估:AUC、LogLoss 对于 CTR/CVR;RMSE 对于回归任务如时长预测。
在线 A/B 测试:CTR、CVR、人均时长等业务指标提升。

深度学习、推荐系统、多任务学习、特征交互

微信视频号、看一看信息流的精排。特征:稀疏特征(用户 ID、物品 ID)与稠密特征(统计特征)混合,需同时优化多个业务目标。

x_i: 第 i 个特征的值(one-hot 或数值)
e_i: 第 i 个特征的 embedding 向量
w_i: FM 一阶权重
v_i: FM 二阶特征隐向量
W^{(l)}, b^{(l)}: DNN 第 l 层的权重和偏置
σ: 激活函数(如 ReLU)
E_k: 第 k 个专家网络(共享)
g_t: 任务 t 的门网络
ŷ_t: 任务 t 的预测输出
λ_t: 任务 t 的损失权重

向量、内积、矩阵乘法、激活函数、softmax、加权和、梯度下降

神经网络前向传播、多任务损失计算

1. 特征处理:输入特征包括用户特征(画像、历史行为)、物品特征(属性、统计)、上下文特征。稀疏特征通过 embedding 层转换为稠密向量 e_i,数值特征直接输入或分桶后 embedding。
2. DeepFM 前向传播
- FM 部分:计算一阶线性项和二阶交互项 y_FM
- DNN 部分:将所有特征的 embedding 拼接,输入 DNN,得到 y_DNN
- 结合:ŷ_ctr = sigmoid(y_FM + y_DNN)
3. MMoE 多任务扩展
- 将 DeepFM 的 DNN 部分替换为 MMoE 结构。共享的专家网络 E_k可以看作是多个 DNN。
- 对于任务 t(如 CTR),计算门控权重 g_t(x),加权求和专家输出得到 h_t
- h_t输入任务特定的塔网络(可能是一个浅层 MLP),输出 ŷ_t
4. 训练:使用批量梯度下降(如 Adam),计算总损失 L的梯度,反向传播更新所有参数(embedding、FM 权重、专家网络、门网络、塔网络)。

用户、物品、上下文特征流合并成特征向量流 xx流入共享的 embedding 层,产生 embedding 向量流。该流同时流入 FM 组件和 MMoE 组件。FM 组件产生低阶特征交互分数流 y_FM。MMoE 组件内部,特征流被多个专家网络并行处理,产生多个专家输出流。每个任务的门网络根据特征流产生权重流,对专家输出流进行加权融合,得到任务特定的隐藏表示流 h_t,再经过任务塔网络,产生最终的预测分数流 ŷ_t(CTR, CVR 等)。多个任务的预测流用于计算损失流,驱动模型参数更新。

深度学习、推荐算法、多目标优化

电商商品推荐、内容信息流推荐

CPU/GPU: 在线推理需要 GPU 加速(如 NVIDIA T4/A10)以满足高吞吐低延迟。离线训练需要大规模 GPU 集群(如 NVIDIA A100)。
内存: 模型参数,特别是 embedding 表,可能非常大(数十 GB 到数百 GB),需要分布式存储或缓存。
网络: 在线推理时,从特征服务器获取实时特征需要低延迟网络。
存储: 存储训练数据、模型参数、特征字典。

CPU/GPU: 在线推理集群需要数千张 GPU 卡,进行毫秒级预测。训练集群需要数百至数千张高端 GPU 卡。内存: Embedding 表需要 TB 级内存或高性能 SSD 缓存。网络: 特征获取和模型服务间需超高带宽 RDMA 网络。存储盘: 训练数据达 PB 级。

Chat-0058

后端服务模型

内容安全

多媒体内容审核模型

多模态深度学习与联邦学习

目标:对用户生成的图片、视频、文本进行自动化审核,识别色情、暴恐、违规广告等内容,结合人工复审。
1. 多模态特征融合
- 图像/视频:使用 CNN(如 ResNet, EfficientNet)提取视觉特征 f_v。对于视频,可提取关键帧或使用 3D CNN。
- 文本:使用 NLP 模型(如 BERT)提取文本特征 f_t
- 融合:将 f_vf_t拼接或通过注意力机制融合,得到联合特征 f_joint = Attention(f_v, f_t)f_joint = [f_v; f_t]
2. 多标签分类:将审核任务建模为多标签二分类问题(色情、暴恐、广告...)。联合特征 f_joint输入一个多层感知机 (MLP),输出多个分数 s_i = σ(W_i f_joint + b_i),每个分数对应一个违规类别的概率。
3. 联邦学习:由于用户数据隐私,原始数据不出设备。在客户端(如手机)使用本地数据训练模型,只将模型更新(梯度或参数差值)加密上传到服务器聚合,更新全局模型。FedAvg 算法:w_{global}^{t+1} = Σ_{k=1}^K (n_k / n) w_k^{t+1},其中 w_k是客户端 k 的本地模型参数,n_k是其数据量,n是总数据量。
4. 主动学习与人工复审:模型对置信度低的样本(如概率在阈值附近)提交给人工审核。人工标注的结果反馈回模型,进行增量学习。

准确率/召回率:在各违规类别上的检测性能。
误杀率:正常内容被误判为违规的比例。
审核速度:每秒可审核的内容数量。

计算机视觉、自然语言处理、联邦学习、多模态学习

微信朋友圈、群聊、视频号的图片、视频、文字内容审核。特征:数据量大、类型多、时效性要求高、需保护隐私。

I: 输入图像/视频帧
T: 输入文本
f_v: 视觉特征向量
f_t: 文本特征向量
f_joint: 融合后的联合特征向量
s_i: 第 i 个违规类别的预测概率
σ: sigmoid 函数
w: 模型参数
n_k: 客户端 k 的数据样本数
K: 参与训练的客户端数

卷积、自注意力、特征拼接、多标签分类、联邦平均

审核流程、联邦学习更新规则

1. 内容上传:用户上传图片/视频/文本。
2. 特征提取
- 视觉模型提取 f_v = CNN(I)
- 文本模型提取 f_t = BERT(T)
3. 多模态融合与分类:融合 f_vf_t,输入多标签分类器,得到概率向量 s = [s_1, ..., s_C]
4. 决策:对于每个类别 i,如果 s_i > threshold_i,则判定为违规。如果任何类别违规,则内容被拦截或进入人工复审队列。
5. 联邦学习训练(周期性):
- 服务器下发当前全局模型 w_global给部分客户端。
- 客户端在本地数据上训练若干 epoch,得到本地更新 w_k
- 客户端上传加密的模型更新 Δw_k = w_k - w_global到服务器。
- 服务器聚合更新:w_global = w_global + η * Σ_k (n_k/n) Δw_k,其中 η为聚合学习率。
6. 人工复审与模型迭代:人工审核结果作为新增标注数据,用于后续模型微调或增量学习。

用户上传的多媒体内容流(图像、文本)进入审核管道。内容流被拆分为视觉流和文本流,分别经过特征提取器,转换为视觉特征流和文本特征流。这两个特征流在融合节点合并为联合特征流。联合特征流经过多标签分类器,产生违规概率流。决策节点根据概率流和阈值,产生审核结果流(通过/拒绝/需复审)。人工复审结果流作为监督信号反馈给模型训练流。在联邦学习设置下,模型训练流分布在客户端本地进行,只有模型更新流被安全地传输到服务器进行聚合。

内容安全、多模态 AI、隐私计算

社交平台内容治理、云相册敏感内容检测

CPU/GPU: 视觉和文本模型推理需要 GPU 加速(如 NVIDIA T4)。联邦学习的训练在客户端进行,消耗用户设备算力(可能用 NPU)。
内存: 模型参数占用内存,多模态模型较大。
网络: 上传内容、下载模型更新需要网络带宽。联邦学习减少原始数据上传。
存储: 存储模型参数、审核日志、样本库。

CPU/GPU/NPU: 审核服务器集群需要大量 GPU 进行实时推理。联邦学习涉及海量客户端设备(手机)的 NPU/GPU/CPU 算力。内存: 服务器端模型参数内存。网络: 内容上传和模型更新分发网络带宽巨大。存储盘: 样本库和模型存储。

Chat-0059

后端服务模型

金融对账

分布式事务最终一致性对账模型

双向核对与差错处理

目标:在支付、清算等金融场景,确保参与方(如银行、商户、微信支付)之间的资金记录一致,发现并处理不一致(差错)。
1. 数据采集:各参与方按约定格式(文件或接口)提供对账文件,包含流水号、金额、状态、时间等关键字段。文件通常按日期(如 T+1)生成。
2. 双向核对:以支付方(微信支付)和收款方(银行)为例。将支付方记录集 P和银行方记录集 B进行比对。核心是找到两边都能匹配的记录(对平)和不能匹配的记录(差错)。匹配键通常是流水号 trade_no或订单号。
- 对平P.trade_no == B.trade_no and P.amount == B.amount and P.status matches
- 支付方有,银行方无P.trade_no not in B,可能为支付成功但银行未成功(需补单或调查)。
- 银行方有,支付方无B.trade_no not in P,可能为银行异常多出交易(需调查)。
- 金额/状态不一致P.trade_no == B.trade_no but (P.amount != B.amount or P.status != B.status)
3. 差错处理:对不平的记录生成差错单,进入差错处理流程。可能操作:自动重试(如重新发起银行调用)、人工核查、调账(在支付方内部账务中做调整)。
4. 准实时对账:除了 T+1 日终对账,还有准实时对账,基于消息流。每笔交易成功后,双方异步发送消息到对账中心,进行实时或近实时比对,更快发现问题。

对账准确率:正确识别不一致交易的比例。
对账时效性:从数据就绪到完成对账的时间。
自动处理率:差错中能自动处理(如重试成功)的比例。

数据一致性、差错处理、金融结算

微信支付与银行/商户的每日资金对账、交易明细核对。特征:数据量大、准确性要求极高、涉及资金安全。

P: 支付方交易记录集合,元素为 (trade_no, amount, status, ...)
B: 银行方交易记录集合,格式类似
trade_no: 交易唯一流水号
amount: 交易金额(分)
status: 交易状态(如 SUCCESS, FAIL)
match_key: 匹配键,通常为 trade_no
discrepancy: 差错记录

集合、比较、匹配、差集、对称差

对账核对规则、差错处理流程

1. 文件获取:在约定时间(如次日凌晨2点),从支付方和银行方系统拉取前一日(T日)的全量交易对账文件 file_Pfile_B
2. 数据加载与清洗:解析文件,加载到内存或数据库表 PB。清洗数据格式。
3. 核心核对
- 以 trade_no为连接键,执行 PB的 FULL OUTER JOIN。
- 对 JOIN 结果逐行判断:
- 若 P.trade_noB.trade_no均非空,且 P.amount == B.amountP.statusB.status逻辑一致,则标记为“对平”。
- 若 B.trade_no为空,则标记为“支付方有银行方无”。
- 若 P.trade_no为空,则标记为“银行方有支付方无”。
- 若 P.amount != B.amount或状态不一致,则标记为“金额/状态不符”。
4. 生成对账报告:统计对平笔数、金额,以及各类差错的笔数、金额、明细。
5. 差错处理:对于“支付方有银行方无”且状态为成功的交易,触发自动重试查询银行状态或补单。其他差错转入人工处理平台。
6. 调账:确认差错后,在支付方内部账务系统进行资金调整,确保账实相符。

支付方交易流水流和银行方交易流水流每日汇聚到对账中心。这两股数据流在“核对引擎”中进行合并和比对操作。核对引擎输出三股流:1) 对平记录流,直接归档;2) 各类差错记录流,流入“差错处理流水线”;3) 汇总报告流。差错处理流水线根据差错类型,可能触发“自动重试流”(如调用银行接口流)或流入“人工处理平台”。处理结果流最终反馈回账务系统,触发“调账流”使资金状态恢复一致。

金融信息系统、差错处理、数据对账

银行间清算、电商平台与物流对账

CPU: 对账核心的 JOIN 和比较操作消耗 CPU,特别是数据量大时。可使用分布式计算框架(如 Spark)加速。
内存: 加载对账文件到内存进行快速比对,需要较大内存。
存储: 存储历史对账文件、对账结果、差错单。
网络: 拉取对账文件需要网络传输。

CPU: 对账作业运行在分布式计算集群(如 Spark),需要大量 CPU 核心进行批量数据处理。内存: 对账数据需加载到内存,规模达 TB 级。存储盘: 历史交易数据和对账结果存储量巨大(PB 级)。网络: 从各参与方拉取对账文件需要高带宽。

Chat-0060

后端服务模型

数据库中间件

分库分表路由与分布式查询模型

基因法与哈希取模分片

目标:将单表数据水平拆分到多个数据库分片,支持跨分片查询和事务,对应用透明。
1. 分片键选择:选择查询最频繁的字段作为分片键 shard_key。如用户表选 user_id
2. 分片算法
- 哈希取模shard_id = hash(shard_key) mod N。优点:数据均匀。缺点:扩容需重新哈希,数据迁移量大。
- 基因法:在 shard_key(如 user_id)中嵌入分片信息。例如,user_id的后几位表示分片 ID。扩容时,只需迁移部分数据(如后两位从 00-99 扩展到 000-999)。
3. SQL 解析与路由:中间件解析 SQL,提取 shard_key的条件。
- 直接路由:如果 WHERE条件包含 shard_key = specific_value,可直接路由到对应分片。
- 广播路由:如果 SQL 不包含 shard_key条件(如全表查询)或条件无法定位到具体分片(如 shard_key IN (v1, v2)),则需广播到所有分片,然后合并结果。
4. 跨分片聚合:对于 `COUNT

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0060

前端模型

消息同步

多端消息同步与冲突解决模型

操作转换 (OT) 与状态向量 (State Vector)

目标:在用户多个设备(手机、PC、平板)同时在线时,保证消息的发送、接收、已读状态等在所有设备上最终一致,并解决编辑、删除等操作的冲突。
1. 状态向量 (SV):每个设备维护一个状态向量 SV = {server_id: seq},表示该设备已同步到的各服务器消息的最大序列号。服务器为每个会话维护一个全局递增的序列号 seq,每条消息分配一个 (server_id, seq)对。
2. 操作转换 (OT):对于文本消息的编辑操作,将其建模为操作 op(如 insert(pos, text), delete(pos, length))。当两个设备并发编辑同一消息时,收到服务器转发的对方操作 op'后,需要将其转换以适用于本地状态。OT 函数:op'' = transform(op, op', side),其中 side表示操作优先级或时间戳。
3. 已读状态同步:已读状态 read_seq表示用户已读到的最大 seq。多端同步时,取各端 read_seq的最大值作为最终已读状态:final_read_seq = max(read_seq_device1, read_seq_device2, ...)。服务器广播最终状态给所有设备。
4. 最终一致性:通过状态向量比较确定缺失消息,通过 OT 解决编辑冲突,通过最大值合并解决已读状态冲突。所有操作可交换、可结合,最终收敛。

同步延迟:操作从一端发出到另一端可见的时间。
冲突解决正确性:最终状态符合预期(如后编辑覆盖先编辑)。
数据一致性:所有设备最终状态一致。

分布式一致性、操作转换、状态同步

微信多端消息同步、消息编辑与删除。特征:多设备实时同步、操作可能冲突、需保证最终一致。

SV: 状态向量,字典 {server_id: seq}
seq: 消息序列号(单调递增)
op: 编辑操作(类型、位置、内容)
transform(op, op', side): OT 转换函数
read_seq: 已读序列号
final_read_seq: 最终已读序列号

向量、最大值、操作转换、序列号

同步协议、冲突解决规则

1. 消息发送:设备 A 发送消息 M,分配本地临时 ID,同时携带其当前状态向量 SV_A
2. 服务器处理:服务器收到 M,分配全局唯一 (server_id, seq),存储消息,并递增 seq。然后向所有在线设备(包括 A)广播消息及新 seq
3. 设备同步:设备 B 收到消息,检查 seq是否等于其 SV_B[server_id] + 1。若是,则应用消息,并更新 SV_B[server_id] = seq。若不是,则向服务器请求缺失的消息(通过 SV比较)。
4. 编辑冲突解决:设备 A 和 B 几乎同时编辑同一条消息,产生操作 op_Aop_B。服务器先收到 op_A,分配 seq_A并广播。设备 B 收到 op_A时,本地已有未提交的 op_B。设备 B 调用 transform(op_B, op_A, 'B')得到 op_B',使其能在应用了 op_A的文本上正确执行。然后提交 op_B'到服务器。
5. 已读状态同步:设备 A 阅读消息,更新本地 read_seq_A = max(read_seq_A, seq),并上报服务器。服务器更新该用户的全局 final_read_seq = max(final_read_seq, read_seq_A),并广播给该用户的所有设备。

消息流从设备发出,携带状态向量流 SV。服务器接收消息流,分配序列号流 seq,并产生广播消息流。广播流到达各设备,触发状态向量更新流和可能的缺失消息请求流。编辑操作流可能产生冲突,通过操作转换函数流进行转换,产生可应用的操作流。已读状态流从各设备上报,在服务器端通过最大值合并产生最终已读状态流,再广播回设备。这是一个多源同步、操作转换和状态合并的复杂数据流系统。

分布式系统、协同编辑、最终一致性

协同文档、多端笔记应用

CPU: 设备端和服务器端进行 OT 转换和状态比较需要 CPU 计算。
内存: 设备端缓存未同步的消息和操作历史,用于冲突解决。
网络: 消息和状态同步产生持续的网络流量。
存储: 服务器存储消息和序列号状态。

CPU: 服务器需要处理海量并发的同步请求和 OT 转换。内存: 服务器需要维护大量会话的状态向量和消息缓存。网络: 多端同步产生大量信令和消息流量,需高带宽低延迟。存储盘: 消息历史存储需 EB 级容量。

Chat-0061

前端模型

图片加载

渐进式图片加载与缓存模型

懒加载与 LRU-K 缓存淘汰

目标:在朋友圈、聊天等场景快速加载图片,优先加载可视区域图片,并利用多级缓存(内存、磁盘、网络)减少流量和延迟。
1. 视窗检测与懒加载:监听滚动事件,计算图片元素是否进入视窗(Viewport)。判断条件:element.top < window.innerHeight + threshold && element.bottom > -threshold。只有进入视窗或即将进入的图片才触发加载。
2. 渐进式加载:先加载低分辨率或模糊的缩略图(Base64 内嵌或小图 URL),然后异步加载原图。原图加载完成后替换缩略图。使用 Intersection Observer API更高效检测可见性。
3. 多级缓存策略
- 内存缓存:使用 Map 或 LRU 缓存最近使用的图片对象(解码后的 Bitmap)。键为图片 URL,值为图片对象。限制总内存占用,超出时淘汰最久未使用的。
- 磁盘缓存:使用 Cache API 或 IndexedDB 存储已下载的图片 Blob。采用 LRU-K 策略:记录每个缓存项最近 K 次访问时间,淘汰时优先淘汰“最近 K 次访问时间”最早的项,避免单次突发访问导致常用项被淘汰。
4. 缓存查找顺序:1) 内存缓存;2) 磁盘缓存;3) 网络请求。网络请求成功后,依次存入磁盘缓存和内存缓存。

图片加载时间:从触发到完整显示的时间(P95)。
缓存命中率:内存和磁盘缓存命中比例。
内存占用:图片缓存占用的内存大小。

缓存算法、懒加载、资源加载优化

微信朋友圈图片流、聊天图片。特征:大量图片、滚动加载、需快速首屏展示、节省流量。

viewport: 视窗矩形 {top, bottom, left, right}
element: 图片元素矩形
threshold: 预加载阈值(像素)
memory_cache: LRU 内存缓存,最大条目数 M
disk_cache: LRU-K 磁盘缓存,最大容量 C,K 值(如 2)
access_history: 记录每个缓存项最近 K 次访问时间戳的列表

几何判断、缓存淘汰、最近最少使用

懒加载触发条件、缓存读写逻辑

1. 初始化:页面加载时,所有图片元素设置 data-src属性存储真实 URL,src属性为占位图或低质量缩略图。
2. 视窗检测:使用 Intersection Observer监听图片元素。当元素进入视窗(带阈值),触发回调。
3. 加载图片:回调中,获取 data-src的 URL。
- 检查 memory_cache.has(url),若有,直接使用缓存图片,更新 src
- 否则,检查 disk_cache.has(url),若有,从磁盘读取 Blob,解码为图片,存入 memory_cache,更新 src
- 否则,发起网络请求 fetch(url)。请求成功后,将响应 Blob 存入 disk_cache,解码图片,存入 memory_cache,更新 src
4. 缓存淘汰
- 内存缓存:当条目数超过 M,淘汰最久未访问的条目。
- 磁盘缓存:当总大小超过 C,计算每个条目的“最近 K 次访问的最早时间” t_k,淘汰 t_k最小的条目。
5. 滚动优化:防抖处理滚动事件,避免频繁检查。

图片 URL 流(来自数据绑定)进入懒加载管理器。管理器根据视窗位置流,过滤出需要加载的 URL 子集流。该子集流进入缓存查询管道:先查询内存缓存流,命中则输出图片数据流;未命中则查询磁盘缓存流,命中则输出并回写内存缓存流;均未命中则触发网络请求流。网络响应流写入磁盘缓存流和内存缓存流,最终输出图片数据流用于渲染。缓存淘汰流根据访问模式定期清理缓存。

前端性能优化、缓存系统、资源管理

图片密集型网站、移动端应用

CPU: 图片解码(JPEG/WebP 解码)消耗 CPU,特别是在低端设备上。
内存: 内存缓存占用 RAM,需控制大小防止 OOM。
网络: 懒加载减少不必要的网络请求,节省带宽。
存储: 磁盘缓存占用本地存储空间。

CPU: 客户端设备(手机)的 CPU 用于图片解码和缓存管理。内存: 内存缓存占用设备 RAM,需根据设备能力动态调整。网络: 节省用户流量,但服务器需提供多分辨率图片。存储盘: 磁盘缓存占用设备本地存储(如 SQLite)。

Chat-0062

前端模型

动画流畅

时间轴动画与物理动画模型

贝塞尔曲线与弹簧动力学

目标:实现用户交互(如下拉刷新、滑动删除)的流畅动画,符合物理直觉,不掉帧。
1. 贝塞尔曲线缓动:对于预设动画(如页面切换),使用三次贝塞尔曲线定义缓动函数 cubic-bezier(x1, y1, x2, y2)。动画进度 p(0 到 1)映射到时间 t:通常使用数值近似求解 p = f(t)的反函数 t = f^{-1}(p)。CSS 中常用 ease, ease-in-out等预定义曲线。
2. 弹簧动力学动画:对于交互式动画(如松手后列表回弹),使用弹簧模型模拟。微分方程:m * x'' + c * x' + k * x = 0,其中 x为位移,m为质量(常设为1),c为阻尼系数,k为刚度系数。解为阻尼振荡:x(t) = A * e^{-βt} * cos(ωt + φ),其中 β = c/(2m), ω = sqrt(k/m - β^2)。根据初始条件(初始位移 x0,初始速度 v0)求解 A, φ
3. 帧同步与降级:使用 requestAnimationFrame同步到浏览器刷新率(通常 60Hz)。计算每帧的时间差 deltaTime,更新动画状态。若计算耗时过长导致帧率下降,则采用“跳帧”或降低动画精度保持响应。
4. 手势识别与动画联动:触摸事件(touchstart, touchmove, touchend)驱动动画。touchmove时,根据手指位移直接设置元素位置(跟随手势)。touchend时,根据结束时的速度 v0和位置 x0,启动弹簧动画。

帧率:动画保持 60 FPS 的能力。
响应延迟:从触摸到动画反馈的时间。
动画平滑度:无卡顿、跳跃。

动画原理、物理模拟、微分方程、交互设计

微信下拉刷新、左滑删除、页面转场。特征:需跟随手势、松手后自然动画、高性能要求。

p: 动画进度(0~1)
t: 时间(通常归一化 0~1)
cubic-bezier(x1,y1,x2,y2): 贝塞尔曲线参数
x(t): 时间 t 时的位移
m, c, k: 弹簧模型的质量、阻尼、刚度参数
x0, v0: 初始位移和速度
β, ω: 阻尼系数和角频率
A, φ: 振幅和初相
deltaTime: 每帧时间差(秒)

贝塞尔曲线、微分方程、指数衰减、三角函数、帧时间

动画更新循环、手势与动画状态机

1. 贝塞尔缓动动画
- 设定动画总时长 T,目标属性变化量 Δvalue
- 在 requestAnimationFrame回调中,计算当前时间 currentTime(从动画开始)。
- 计算归一化时间 t = currentTime / T,若 t >= 1则结束。
- 通过贝塞尔曲线函数计算缓动进度 p = bezier(t)
- 设置当前属性值 value = startValue + p * Δvalue
2. 弹簧动画
- 设定弹簧参数 m=1, c, k,计算 β = c/(2m), ω0 = sqrt(k/m), ω = sqrt(ω0^2 - β^2)(欠阻尼情况)。
- 根据初始条件 x0, v0求解:A = sqrt(x0^2 + ((v0+β*x0)/ω)^2), φ = atan2( x0, (v0+β*x0)/ω )
- 在每帧中,计算当前时间 t,代入 x(t) = A * e^{-βt} * cos(ωt + φ)得到位移。
- 当位移 `

x(t)

小于阈值(如 0.5 像素)且速度很小时,结束动画。<br>3. **手势联动**:<br> -touchstart: 记录起始位置startX,捕获元素当前位移currentX。<br> -touchmove: 计算手指位移deltaX = touch.pageX - startX,设置元素位置x = currentX + deltaX(可能带有阻力系数)。<br> -touchend: 计算松手瞬间速度v0 = (deltaX - prevDeltaX) / deltaTime,设置x0 = x`,启动弹簧动画。

用户手势事件流(触摸开始、移动、结束)驱动动画状态机。手势移动事件流直接映射为元素位置流。松手事件流触发弹簧动画初始化,产生初始条件流 (x0, v0)。弹簧动画系统根据微分方程,在每一帧的定时器流触发下,计算出新的位移流 x(t)。位移流被应用到 UI 元素上,产生视觉动画流。贝塞尔缓动动画则由时间流 t通过缓动函数映射为进度流 p,再映射为属性值流。

计算机图形学、交互设计、物理引擎

移动端 UI 交互、游戏动画

Chat-0063

后端模型

会话管理

海量在线会话状态管理模型

一致性哈希与分片缓存

目标:管理数亿用户的在线状态(是否在线、最后活跃时间、连接所在网关服务器),支持快速查找和广播。
1. 会话状态结构:每个用户会话状态 Session = {userId, gatewayId, lastActiveTime, deviceType, ...}。关键操作:根据 userId查找 gatewayId(用于消息路由);更新 lastActiveTime;用户上线/下线时设置/清除。
2. 分片存储:使用一致性哈希将用户 ID 映射到多个会话状态分片节点。哈希环上有多个虚拟节点,每个物理节点承载多个虚拟节点。shard_index = hash(userId) % N(或一致性哈希环查找)。每个分片节点使用内存数据库(如 Redis)存储 userId -> Session的映射。
3. 读写策略
- :直接访问对应分片节点获取 Session
- (用户上线):在对应分片节点设置 Session,并设置过期时间(如 30 分钟)。
- (用户活跃):更新 lastActiveTime,并刷新过期时间。
- (用户下线):删除 Session
4. 容灾与复制:每个分片设置主从复制。主节点处理写,从节点提供读。主节点故障时,从节点提升为主。使用哨兵或集群模式管理故障转移。

查找延迟:根据 userId找到 gatewayId的 P99 延迟。
可用性:会话服务可用性(如 99.999%)。
数据一致性:主从之间数据同步延迟和一致性。

分布式缓存、一致性哈希、会话管理

微信在线状态管理、消息路由寻址。特征:读写比例高、需要低延迟、高可用、数据可丢失(会话可重建)。

userId: 用户唯一标识
gatewayId: 用户当前连接的网关服务器 ID
lastActiveTime: 最后活跃时间戳
hash(): 一致性哈希函数(如 MurmurHash)
N: 分片节点数量(虚拟节点数更多)
TTL: 会话过期时间(秒)
Session: 会话状态对象

哈希、映射、键值存储、过期

会话读写流程、分片路由逻辑

1. 用户上线:用户通过网关 G 登录,网关向会话服务发起写请求:SET session:userId {gatewayId: G, lastActiveTime: now(), ...},并设置过期时间 TTL
2. 会话查找:消息需要路由给用户 U,发送者查询会话服务:GET session:U。会话服务计算 shard = hash(U) % N,将请求路由到对应分片节点,返回 Session中的 gatewayId
3. 心跳更新:网关定期(如每 30 秒)代表用户发送心跳到会话服务,更新 lastActiveTime并刷新 TTL
4. 用户下线:网关检测连接断开,或会话过期(TTL到期),删除 session:U
5. 故障转移:如果某个分片主节点故障,监控系统检测到后,将其从节点提升为主,并更新一致性哈希环的映射。

用户连接事件流(上线、下线、心跳)流入会话服务。根据 userId的哈希值,事件流被分流到不同的分片节点流。每个分片节点流处理其负责的用户会话状态更新流(设置、更新、删除)。查询请求流同样根据 userId哈希被路由到对应的分片节点流,读取状态后返回结果流。这是一个基于哈希的分片数据流系统,状态存储在内存中,支持高吞吐低延迟访问。

分布式系统、缓存设计、负载均衡

在线游戏状态管理、即时通讯在线状态

CPU: 会话服务节点处理读写请求,计算哈希和路由。
内存: 所有会话状态存储在内存中,数据量巨大(数亿用户 * 每个会话几百字节),需要 TB 级内存。
网络: 网关与会话服务之间 RPC 调用,内部节点间复制数据。
存储: 会话数据可丢失,通常不持久化,或异步持久化到数据库。

CPU: 会话服务集群需要大量 CPU 处理请求和哈希计算。内存: 存储所有在线用户会话状态,需要数 TB 到数十 TB 内存(使用 Redis 集群)。网络: 内部复制和客户端查询需要高带宽低延迟网络。存储盘: 可配置持久化,但非必需。

Chat-0064

后端模型

消息扩散

群聊消息扩散与写扩散优化模型

读扩散与写扩散混合、消息扇出

目标:在万人大群中,一条消息需要高效地扩散给所有在线成员,同时考虑离线消息存储。
1. 纯写扩散 (Fan-out-on-write):发送者将消息写入自己的发件箱,同时写入每个收件人的收件箱(或时间线)。适用于小群,写放大严重,但读简单。
2. 纯读扩散 (Fan-out-on-read):发送者将消息写入一个全局的群消息序列(如 Timeline)。每个成员读时,从该序列中拉取新消息。适用于大群,写一次,但每个成员读都需要查询。
3. 混合模式:在线成员使用读扩散(实时推送),离线成员使用写扩散(存储到个人收件箱)。当用户上线时,从个人收件箱拉取离线消息,然后切换到读扩散模式。
4. 在线推送优化:对于在线成员,消息通过长连接推送。网关服务器维护用户与连接的关系。消息发送时,查询在线成员列表,通过其所在的网关连接推送。使用多级缓存和批量推送减少开销。

消息延迟:从发送到接收者收到的延迟(P99)。
写放大系数:一条消息产生的写入操作数(平均每个收件人)。
系统吞吐量:每秒可处理的消息数。

消息队列、发布订阅、推拉结合

微信群聊(尤其是大群)消息分发。特征:一对多广播、在线离线状态混合、需低延迟高吞吐。

M: 消息内容
sender: 发送者 ID
group_id: 群 ID
member_list: 群成员 ID 列表
online_members: 在线成员 ID 集合(及其 gatewayId
offline_members: 离线成员 ID 集合
timeline: 群消息序列(读扩散存储)
inbox: 个人收件箱(写扩散存储)

集合、广播、推拉、缓存

消息分发决策流程、在线离线处理

1. 消息接收:发送者发送消息 M到群 G。服务器验证权限。
2. 在线成员推送:查询群 Gonline_members列表及其连接的网关。对于每个在线成员 U,通过其 gatewayId找到连接,直接推送 M。此步骤为实时推送。
3. 离线成员存储:对于 offline_members中的每个成员 U,将消息 M的指针(或完整消息)写入 Uinbox(写扩散)。设置过期时间(如 7 天)。
4. 全局存储:将消息 M追加到群 Gtimeline(读扩散存储),用于历史消息拉取和在线成员补漏。
5. 成员上线同步:用户 U上线时,首先从自己的 inbox拉取所有离线期间的消息(写扩散部分)。然后,从 inbox中最后一条消息的时间点开始,从群的 timeline拉取更新的消息(读扩散部分),确保消息连续。之后,U进入在线状态,后续消息通过推送接收。
6. 消息去重:通过消息 ID 去重,防止在线推送和离线拉取重复。

消息流从发送者进入系统。系统根据群成员列表,将消息流拆分为在线成员流和离线成员流。在线成员流通过网关连接映射,直接转换为推送流到各个在线用户的连接。离线成员流则被写入每个离线用户的个人收件箱存储流。同时,消息流被写入群的全局时间线存储流。用户上线事件触发离线消息拉取流,从个人收件箱和时间线中读取消息流,合并后推送给用户。这是一个典型的分流-合并流处理模式。

分布式消息系统、社交网络

聊天室、直播弹幕

CPU: 消息扇出(查询在线列表、网关映射)消耗 CPU。写扩散时,写入多个收件箱增加写入负载。
内存: 在线用户连接状态、群成员列表缓存。
网络: 消息推送产生大量出向流量,特别是大群。
存储: 时间线和收件箱需要持久化存储,写扩散增加存储成本。

CPU: 消息路由服务器需要高性能 CPU 处理海量消息扇出逻辑。内存: 缓存在线用户列表和连接信息。网络: 大群消息推送会产生广播风暴,需要优化(如组播)。存储盘: 消息历史存储量巨大,需分库分表和冷热分离。

Chat-0065

后端模型

附近的人

地理位置索引与范围查询模型

GeoHash 与 R 树

目标:根据用户实时地理位置,快速查找附近(如 1 公里内)的其他用户,并支持按距离排序。
1. 地理位置编码:使用 GeoHash 将经纬度 (lat, lon)编码为字符串。GeoHash 将二维空间递归划分为网格,每个字符表示一次划分。编码越长,精度越高。例如,wx4g0是一个约 1.2km×0.6km 的矩形。
2. 索引存储:将用户 ID 和其 GeoHash 编码(如前 6 位)作为索引存储在数据库(如 Redis GEO 或 PostgreSQL PostGIS)。Redis GEO 使用有序集合(Sorted Set),成员为用户 ID,分数为经度、纬度转换成的 52 位整数(通过 Geohash)。
3. 范围查询:给定中心点 (lat0, lon0)和半径 R,计算中心点的 GeoHash 编码,并获取其相邻的 8 个格子(九宫格)的编码前缀,因为这些格子内的点可能也在半径内。然后查询这些格子内的所有用户位置,再计算精确的大圆距离(Haversine 公式)进行过滤和排序。
4. 距离计算与排序:Haversine 公式:a = sin²(Δlat/2) + cos(lat1) * cos(lat2) * sin²(Δlon/2); c = 2 * atan2(√a, √(1−a)); distance = R_earth * c。在内存中计算过滤,按距离排序返回 Top-K。

查询延迟:从请求到返回结果的 P95 时间。
精度:返回的用户确实在指定半径内。
索引更新延迟:用户位置更新到可查询的延迟。

计算几何、空间索引、地理信息系统

微信“附近的人”、“摇一摇”。特征:实时位置更新、高并发查询、距离排序。

(lat, lon): 纬度、经度(弧度)
geohash: GeoHash 编码字符串
R: 查询半径(米)
R_earth: 地球半径(约 6371000 米)
Δlat, Δlon: 纬度差、经度差(弧度)
a, c: Haversine 公式中间变量

地理编码、网格划分、距离公式、排序

索引更新与查询算法

1. 位置更新:用户 U 上报新位置 (lat, lon)。计算其 GeoHash 编码 geohash(如 6 位精度)。在 Redis GEO 中执行 GEOADD key lon lat member,其中 member为用户 ID。
2. 范围查询
- 输入中心点 (lat0, lon0)和半径 R
- 计算中心点的 GeoHash 前缀(精度根据 R选择,例如半径 1km 可用 6 位)。
- 获取该前缀对应的格子及周围 8 个格子的 GeoHash 前缀列表 neighbor_geohashes
- 对于每个前缀,在 Redis 中查询该 GeoHash 有序集合中所有成员(用户 ID 和经纬度)。可以使用 GEORADIUS命令直接完成,其内部实现类似。
- 对查询到的每个用户位置,使用 Haversine 公式计算与中心点的精确距离 d
- 过滤掉 d > R的用户,剩下的按 d升序排序,返回 Top-K。
3. 索引维护:用户位置频繁更新,Redis GEO 会自动更新有序集合中的分数(位置)。可设置过期时间清理不活跃用户。

用户位置更新流 (userId, lat, lon)流入系统,被实时编码为 GeoHash 流,并更新到空间索引流中。查询请求流 (center, radius)进入后,被转换为 GeoHash 前缀流,并扩展为邻居格子前缀流。这些前缀流用于从索引中检索出候选用户位置流。候选流经过精确距离计算流的过滤,产生最终在半径内的用户流,并按距离排序流输出。

地理位置服务、空间数据库

共享单车、外卖配送

CPU: GeoHash 编码解码、Haversine 距离计算消耗 CPU,特别是高并发查询时。
内存: Redis GEO 使用有序集合存储,全部在内存中,数据量大时内存消耗高。
网络: 位置更新和查询请求的网络 I/O。
存储: 位置数据可持久化到磁盘,但查询主要依赖内存索引。

CPU: 位置服务后端需要大量 CPU 进行地理计算。内存: Redis GEO 集群需要大量内存存储全球活跃用户位置(数十亿级)。网络: 用户设备频繁上报位置,产生大量上行流量。存储盘: 持久化存储位置历史,用于轨迹分析。

Chat-0066

后端模型

朋友圈存储

社交图谱时间线混合存储模型

推拉结合与分片存储

目标:高效存储和查询朋友圈动态(Feed),支持发布、浏览好友动态、分页拉取。
1. 写扩散 (Fan-out-on-write):用户发布动态时,将该动态 ID 写入其所有好友的“时间线收件箱”(Timeline Inbox)。这样,每个好友读取自己的时间线时,只需读取自己的收件箱,时间复杂度 O(好友数)。但写放大严重:发布者好友数 N,则写入 N 次。
2. 读扩散 (Fan-out-on-read):用户发布动态时,只写入自己的“发件箱”(Outbox)。好友读取时间线时,遍历所有好友的发件箱,合并排序。读放大严重:好友数 M,则读取 M 次。
3. 混合策略:结合两者。对于活跃用户(发布频繁)或大 V(好友极多),采用读扩散;对于普通用户,采用写扩散。或者,近期动态(如 3 天内)使用写扩散,存储在收件箱;更早的动态使用读扩散,从发件箱拉取。
4. 分片与缓存:用户时间线按用户 ID 分片存储。热门动态和活跃用户的时间线缓存到 Redis 或 CDN。使用 LRU 或 LFU 缓存策略。

发布延迟:动态发布到所有好友可见的时间。
读取延迟:打开朋友圈刷新的 P95 延迟。
存储成本:写扩散带来的存储放大倍数。

社交网络、Feed 流、推拉模型、缓存

微信朋友圈动态的存储与读取。特征:读写均高频、社交关系复杂、需按时间排序、存储成本敏感。

user_id: 用户 ID
post_id: 动态 ID
friend_list: 用户的好友列表
outbox: 用户的发件箱,存储自己发布的动态 ID 列表
inbox: 用户的时间线收件箱,存储好友发布的动态 ID 列表
threshold_active: 活跃用户阈值(如每天发布 > 5 条)
threshold_friends: 好友数阈值(如 > 5000)

集合、列表、排序、分片、缓存

动态发布与读取流程、推拉决策逻辑

1. 动态发布:用户 A 发布动态,生成 post_id
- 策略决策:如果 A 是活跃用户或好友数 > threshold_friends,则采用读扩散:仅将 post_id写入 A 的 outbox
- 否则,采用写扩散:遍历 A 的 friend_list,对于每个好友 F,将 post_id写入 F 的 inbox
- 同时,动态内容(文本、图片)存储到全局内容存储,键为 post_id
2. 读取时间线:用户 B 刷新朋友圈,请求第 page页(每页 size条)。
- 如果 B 使用写扩散(即其 inbox有数据),则直接从 inbox按时间倒序分页获取 post_id列表。
- 如果 B 使用读扩散,或 inbox数据不足(如只存了 3 天),则需要聚合:获取 B 的 friend_list,从每个好友的 outbox中读取近期动态 ID,合并后按时间排序,再分页。
- 根据 post_id列表,从内容存储中获取动态详情。
3. 缓存加速:热门动态内容和活跃用户的时间线结果集缓存到 Redis,设置过期时间。

动态发布流经过“发布处理器”,根据发布者属性(好友数、活跃度)被分流为写扩散流和读扩散流。写扩散流被扇出到所有好友的收件箱存储流。读扩散流仅写入发布者的发件箱存储流。时间线读取请求流根据用户配置,决定是从收件箱存储流中读取(写扩散),还是从多个好友的发件箱存储流中聚合读取(读扩散)。读取结果流经过合并排序和分页,再通过内容存储流获取详情,最终返回给用户。

社交网络架构、数据分发

微博、Facebook News Feed

CPU: 写扩散时,遍历好友列表并写入多个收件箱消耗 CPU。读扩散时,聚合多个发件箱消耗 CPU。
内存: 收件箱和发件箱索引存储在内存数据库(如 Redis)中,数据量巨大。
网络: 发布和读取涉及多次数据库访问,网络 I/O 高。
存储: 动态内容存储(图片、视频)占用大量存储空间。

CPU: Feed 服务需要大量 CPU 进行动态分发和聚合。内存: 收件箱/发件箱索引需要 TB 级内存缓存。网络: 内部服务间 RPC 调用频繁。存储盘: 动态内容(图片、视频)存储达 EB 级,需 CDN 分发。

Chat-0067

后端模型

实时音视频

自适应码率与抗丢包模型

实时传输协议 (RTP) 与前向纠错 (FEC)

目标:在实时音视频通话中,根据网络状况动态调整视频码率、分辨率、帧率,并使用抗丢包技术保证流畅性。
1. 带宽估计:使用基于延迟的拥塞控制(如 Google Congestion Control, GCC)。通过测量数据包到达间隔的延迟变化 d_i = t_i - t_{i-1} - (T_i - T_{i-1}),其中 t_i是到达时间,T_i是发送时间。估计可用带宽 A:当延迟增长时,减少发送码率;当延迟低且稳定时,增加发送码率。
2. 自适应码率:根据估计的带宽 A和当前丢包率 loss_rate,调整视频编码参数。决策逻辑:
- 如果 loss_rate > threshold_high,则降低码率 bitrate = bitrate * (1 - α)
- 如果 loss_rate < threshold_lowbitrate < A * β,则增加码率 bitrate = min(bitrate * (1 + γ), A * β)
其中 α, β, γ为调优参数,β为带宽利用率(如 0.8)。
3. 前向纠错 (FEC):发送冗余数据,允许接收方在丢包时恢复原始数据。对于每 k个媒体数据包,生成 n - k个冗余包(如使用 Reed-Solomon 编码),发送总共 n个包。只要收到任意 k个包,即可恢复原始 k个包。冗余度 r = (n - k) / k根据丢包率动态调整。
4. 丢包重传 (NACK):接收方检测到丢包(序列号不连续),发送 NACK 请求重传特定包。发送方在缓冲区保留已发送包一段时间,收到 NACK 后重传。权衡延迟与带宽。

视频质量:PSNR、SSIM 或主观质量评分。
端到端延迟:从采集到渲染的延迟(P95)。
卡顿率:因缓冲或丢包导致的播放卡顿时间占比。

网络拥塞控制、信息论、编码理论

微信语音通话、视频通话、视频会议。特征:实时性要求高、网络波动大、需平衡质量与流畅度。

A: 估计的可用带宽(bps)
loss_rate: 当前丢包率(0~1)
bitrate: 当前视频编码码率(bps)
threshold_high, threshold_low: 丢包率阈值(如 0.1, 0.01)
α, β, γ: 调整参数(如 0.2, 0.8, 0.1)
k, n: FEC 参数,k原始包数,n总包数
r: 冗余度 r = (n-k)/k
d_i: 延迟变化

带宽估计、码率控制、冗余编码、概率

码率自适应决策、FEC 编码/解码流程

1. 带宽估计:发送方持续发送探测包,接收方计算包间延迟变化 `

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0068

前端模型

资源调度

移动端资源(电、流量、存储)智能管控模型

多目标约束下的动态策略调度

目标:在移动设备上,根据用户行为、设备状态(电量、网络)、应用场景,动态管理后台服务(如消息同步、位置上报)的执行频率和资源消耗,优化用户体验与设备续航。
1. 状态建模:定义系统状态向量 S = (battery_level, network_type, charging_state, app_foreground, user_activity)。定义任务集合 T = {t_i},每个任务有基础频率 f_i_base,功耗 p_i,流量 d_i
2. 效用函数:定义任务执行的效用 U_i,表示执行该任务对用户体验的正面价值。例如,消息同步的效用高,而日志上报的效用低。效用可随时间衰减:U_i(t) = U_i0 * exp(-λ_i * t)t为距上次执行的时间。
3. 约束优化:在每个决策周期(如1分钟),求解优化问题:max Σ_i x_i * U_i(t),约束条件:Σ_i x_i * p_i ≤ P_max(S), Σ_i x_i * d_i ≤ D_max(S), x_i ∈ {0,1}(是否执行)。P_maxD_max是随状态 S变化的动态上限(如低电量时 P_max降低)。
4. 学习与适应:通过强化学习(如Contextual Bandit)学习不同状态下各任务的最优调度策略。根据用户反馈(如是否手动刷新)调整效用函数 U_i

续航影响:后台任务导致的额外电池消耗百分比。
流量节省:节省的非必要后台流量比例。
功能满足度:核心功能(如消息及时性)的SLA达成率。

资源约束优化、强化学习、上下文感知计算

微信后台消息拉取、位置更新、日志上报等任务的智能调度。特征:设备资源有限、用户场景多变、需平衡体验与功耗。

S: 系统状态向量
t_i: 第i个后台任务
f_i_base: 任务i的基础执行频率
p_i, d_i: 任务i执行一次的估计功耗和流量
U_i(t): 任务i在时间t的效用值
λ_i: 效用衰减系数
P_max(S), D_max(S): 当前状态下的功耗和流量预算
x_i: 二元决策变量

向量、指数衰减、0-1整数规划、约束优化

策略决策逻辑、状态感知规则

1. 状态收集:周期性地收集设备状态 S
2. 效用计算:对每个任务 t_i,计算自上次执行以来的时间间隔 Δt_i,代入 U_i(Δt_i) = U_i0 * exp(-λ_i * Δt_i)
3. 预算计算:根据 S查询预定义规则表,得到当前允许的最大功耗 P_max和流量 D_max。例如:if battery_level < 20% then P_max = 0.5 * P_normal
4. 优化求解:构造0-1背包问题:最大化 Σ x_i * U_i,满足 Σ x_i * p_i ≤ P_maxΣ x_i * d_i ≤ D_max。使用动态规划或启发式贪婪算法求解 {x_i}
5. 任务执行:对于 x_i = 1的任务,提交到执行队列。更新其上次执行时间。
6. 策略更新:记录 (S, {x_i}, 用户显式操作)作为样本,用于离线训练更新效用权重 U_i0和衰减系数 λ_i

设备状态传感器流(电量、网络)和用户交互流汇聚成系统状态流 S(t)。任务生成器根据业务逻辑产生待执行任务流 {t_i}。状态流 S(t)和任务流输入“智能调度器”,调度器内部运行优化算法,输出任务执行决策流 {x_i(t)}。决策流控制任务执行引擎的实际执行流。用户显式操作流(如下拉刷新)作为监督信号流反馈给调度器,用于调整其内部模型参数。

移动计算、能耗优化、上下文感知系统

物联网设备节能策略、移动应用后台管理

CPU: 调度决策计算消耗少量CPU,主要在移动设备SoC的应用处理器上运行。
传感器: 读取电量、网络状态等传感器数据。
内存: 存储任务状态和历史数据。
数据流: 传感器数据 -> 状态评估 -> 效用计算 -> 约束优化 -> 任务执行控制。

CPU: 集成在客户端,消耗设备算力,需轻量级算法。时钟: 用于周期性触发决策和计算时间间隔。传感器: 依赖设备电池、网络传感器。

Chat-0069

前端模型

网络优化

弱网与多路传输智能择优模型

多路连接探测与智能选路

目标:在移动网络不稳定或切换时(如Wi-Fi与蜂窝网络),自动选择最优网络路径进行数据传输,并支持多路并发与无缝切换,提升连接成功率和速度。
1. 路径探测:维护多个可用网络接口(如Wi-Fi, 4G/5G)。对每条路径 p,周期性发送探测包,测量其质量指标:延迟 latency_p、丢包率 loss_p、带宽 bw_p(通过小文件下载测算)。计算综合分数:score_p = α * norm(latency_p) + β * norm(1/loss_p) + γ * norm(bw_p),其中 norm为归一化,α+β+γ=1
2. 智能选路:根据请求类型选择路径。小消息、实时性要求高的走低延迟路径;大文件下载走高带宽路径。决策函数:p_selected = argmax_p (score_p * weight_type)weight_type根据请求类型调整(如即时消息权重偏向低延迟)。
3. 多路并发:对于大文件下载,可同时通过Wi-Fi和蜂窝网络分块下载。将文件分为 N个块,为每个块分配下载路径,分配策略可基于各路径当前可用带宽比例。
4. 无缝切换:当检测到当前路径质量严重下降(loss_p > thresholdlatency_p突增),且存在更优路径时,将新建连接或后续请求切换到新路径。对于TCP长连接,可通过MPTCP(多路径TCP)协议在传输层实现无缝切换。

连接成功率:首次连接或重连的成功率。
传输速度:文件下载或消息发送的端到端速度。
切换平滑度:网络切换时业务是否中断、卡顿。

网络测量、多路径传输、决策理论

微信消息发送、朋友圈图片/视频加载、文件传输。特征:网络环境复杂多变、需高连接成功率、提升传输体验。

p: 网络路径标识(Wi-Fi, Cellular)
latency_p: 路径p的当前平均RTT(毫秒)
loss_p: 路径p的当前丢包率(0~1)
bw_p: 路径p的当前估计带宽(bps)
score_p: 路径p的综合质量分
α, β, γ: 各指标权重系数
weight_type: 业务类型权重
threshold: 路径质量恶化阈值

测量、加权和、归一化、最大值、分块

路径探测协议、选路决策逻辑

1. 初始化与探测:启动时,枚举所有可用网络接口,为每条路径启动独立的探测线程。探测线程定期(如30秒)发送Ping包和小容量HTTP请求,更新 latency_p, loss_p, bw_p
2. 请求前决策:当应用层发起网络请求时,根据请求的元数据(大小、实时性要求)确定 weight_type。计算每条可用路径的 score_p,选择 p_selected = argmax_p (score_p * weight_type)
3. 连接建立:使用 p_selected对应的网络接口建立Socket连接,进行数据传输。
4. 传输中监控:在传输过程中,持续监控当前路径的质量。如果检测到 loss_p > 0.1latency_p增加超过50%,且存在另一路径 p_alt满足 score_p_alt > score_p * 1.2,则触发切换。
5. 多路下载:对于大文件,启动多线程下载,每个线程绑定到不同的路径。根据各路径的 bw_p动态分配要下载的字节范围。
6. MPTCP支持:如果系统和网络支持MPTCP,则在建立连接时启用,由内核自动管理多路径传输和切换。

网络探测包流从客户端周期性发出,经不同网络接口流,产生网络质量指标流 (latency, loss, bw)。这些指标流汇聚成实时的路径质量视图。应用请求流携带元数据(类型、大小)到达网络库。网络库根据质量视图和请求元数据,通过决策函数产生路径选择流。数据流根据选择流被导向特定的网络接口流。传输过程中,质量监控流持续反馈,可能触发路径切换流,将后续数据流重定向到更优的接口流。

移动网络、传输优化、软件定义网络

移动办公、车联网

CPU: 路径探测、质量计算和决策逻辑消耗CPU。
网络接口: 同时维护多个网络接口的连接和状态。
内存: 存储各路径质量历史和数据缓冲区。
数据流: 探测包发送/接收 -> 计算指标 -> 决策 -> 绑定Socket到指定接口 -> 数据传输 -> 监控与切换。

CPU: 客户端网络库逻辑,消耗可接受。网络: 多路传输可能增加整体吞吐,但也增加连接数。操作系统: 需要系统支持多网络接口绑定和MPTCP。

Chat-0070

前端模型

小程序

小程序代码包动态加载与分包模型

按需加载与依赖分析

目标:加快小程序启动速度,降低首次下载代码包大小,实现功能的按需加载。
1. 代码包拆分:将小程序代码划分为一个主包(包含启动页面和公共代码)和多个分包(对应不同功能模块)。构建工具进行静态依赖分析,确定模块划分边界。分包大小限制(如2MB)。
2. 依赖图构建:构建模块依赖有向图 G = (V, E)V是模块(JS文件、模板、样式等),E表示模块间的引用关系。从入口页面开始进行深度优先遍历,将直接和间接引用的模块划入同一分包。
3. 按需加载策略:用户访问主包页面时,只下载主包。当用户触发进入某个分包页面时(如点击Tab),客户端异步下载该分包的代码,下载并解析执行后,再跳转页面。预加载:在空闲时或预测用户可能进入时,提前下载分包。
4. 缓存与版本管理:下载的代码包缓存在本地存储。每个包有版本号,当服务器发布新版本时,客户端下次启动或进入时检测并更新。采用差异更新(bsdiff)减少下载量。

启动时间:从点击到首屏渲染完成的时间(P90)。
下载体积:主包和关键分包的总大小。
加载成功率:分包下载和加载的成功率。

编译优化、图论、懒加载、缓存

微信小程序启动、页面跳转。特征:代码体积敏感、网络加载耗时、需快速启动。

主包: 包含 app.js, app.json, 公共库和首页资源
分包: 独立的功能模块,包含其自身的页面和资源
G=(V,E): 模块依赖图
入口模块: 小程序启动的初始模块(如首页)
预加载时机: 如 onIdle, 路由预判
缓存键: {appid}_{分包名}_{版本号}

图、遍历、依赖分析、缓存、版本

构建配置、运行时加载逻辑

1. 构建分析:开发者配置 app.json中的分包信息。构建工具扫描项目文件,构建模块依赖图 G。根据配置将 G的顶点划分到不同的包中,确保无循环依赖跨包。
2. 主包加载:用户点击小程序,下载主包(包含运行时框架和主包代码)。解析执行 app.js,初始化小程序实例,加载首页。
3. 路由触发加载:用户点击按钮跳转到分包A的页面 /subA/page1。客户端检查是否已缓存分包A的代码包且版本最新。若是,直接加载;否则,显示加载中状态,并发起网络请求下载分包A。
4. 分包加载与执行:下载完成后,解析分包中的 subA.js(分包独立逻辑),注册其页面和组件。然后执行页面 page1Page()函数,渲染页面。
5. 预加载:在适当的时机(如小程序启动后空闲时,或根据用户行为预测),后台静默下载可能用到的分包,存入缓存。
6. 版本更新:每次请求包时,携带本地版本号。服务器比较版本,返回最新包或304 Not Modified。

用户访问请求流触发主包下载流。主包代码流被加载解析,初始化应用流。页面路由事件流触发时,检查分包缓存流。若未缓存或过期,触发分包下载流。下载完成后,分包代码流被注入JS执行环境,扩展应用能力流,然后渲染目标页面流。预加载策略基于用户行为流或系统空闲事件流,产生预下载任务流,提前填充缓存流。

前端工程化、模块化、性能优化

大型Web应用拆包、插件化架构

CPU: 客户端JS引擎解析和执行代码消耗CPU,特别是大型分包。
网络: 分阶段下载减少首次加载流量,但总体流量可能增加(预加载)。
存储: 本地缓存代码包,占用存储空间。
内存: 同时加载多个分包的代码可能增加内存占用。

CPU: 客户端JS引擎性能影响解析速度。网络: CDN需支撑海量小程序包分发,带宽要求高。存储盘: 客户端本地缓存空间管理,需LRU等策略。

Chat-0071

前端模型

AI推理

移动端轻量级AI模型推理框架

模型量化、裁剪与硬件加速

目标:在手机等边缘设备上高效运行AI模型(如人像分割、语音识别),降低延迟和功耗,保护用户隐私。
1. 模型压缩
- 量化:将模型权重和激活值从32位浮点(FP32)转换为8位整数(INT8)甚至更低精度。量化公式:real_value = scale * (quantized_value - zero_point)。通过校准数据集确定每层张量的 scalezero_point
- 裁剪:移除模型中不重要的权重或通道。基于权重的L1范数或基于激活值的贡献度排序。裁剪后微调以恢复精度。
2. 硬件加速:利用移动SoC的专用硬件(NPU、GPU、DSP)进行矩阵运算。通过硬件厂商提供的推理引擎(如Android NNAPI, Core ML)调用,编写适配层将压缩后的模型转换为硬件支持的格式(如TFLite, ONNX)。
3. 动态调度:根据模型复杂度、输入大小和设备当前负载(CPU/GPU温度、电量),动态选择执行后端(CPU、GPU、NPU)。目标是最大化性能/功耗比。
4. 内存与缓存优化:模型权重常驻内存或映射到内存文件。中间激活张量使用内存池复用,避免频繁分配释放。实现算子融合减少内存搬运。

推理速度:单次推理耗时(P95)。
模型精度损失:压缩后模型相对于原模型的准确度下降(如<1%)。
功耗:单次推理消耗的电量(焦耳)。

模型压缩、硬件加速、边缘计算

微信视频通话背景虚化、语音转文字、扫一扫识物。特征:低延迟、高能效、数据不离设备。

W_fp32: FP32权重矩阵
W_int8: INT8量化后权重矩阵
scale, zero_point: 量化参数
threshold_prune: 裁剪阈值(如权重绝对值小于该值则置零)
backend: 推理后端 {CPU, GPU, NPU}
latency, power: 各后端在当前设备上的预估延迟和功耗

量化、裁剪、矩阵运算、调度

模型转换流程、运行时调度逻辑

1. 离线准备:在服务器上使用训练后量化或量化感知训练得到INT8模型。进行通道裁剪,微调。转换为目标硬件格式(如.tflite)。
2. 模型加载:客户端下载或预置模型文件。解析模型结构,根据硬件能力选择最优的算子实现(如选择NPU的卷积核)。
3. 资源评估:推理前,评估当前可用硬件状态。查询各后端的性能配置文件(如 latency_backend = f_backend(model_size, input_size)),结合设备温度、电量,选择 backend = argmin (α * latency + β * power)
4. 推理执行:将输入数据(如图像张量)转换为模型要求的格式(如归一化, NHWC布局)。调用选定后端的推理接口,执行前向传播,获得输出张量。
5. 结果后处理:对输出张量进行解析,如对人像分割的输出掩码进行阈值化和轮廓提取。
6. 内存管理:使用内存池预先分配输入、输出和中间张量所需内存。多次推理间复用。

训练好的模型流经过压缩流水线(量化、裁剪),产生轻量级模型流。模型流与输入数据流(如图像帧流)在移动端汇合。资源调度器根据设备状态流,为每次推理任务选择硬件后端流。数据流被送入选定的后端硬件(NPU/GPU/DSP)进行张量计算流,产生推理结果流。内存管理器负责在计算过程中高效地分配和复用内存块流。

深度学习、模型压缩、边缘AI

移动端视觉处理、智能语音助手

NPU/GPU/DSP: 专用AI硬件执行卷积、矩阵乘等密集型运算,能效比高。
CPU: 负责调度、数据预处理和后处理,以及运行不支持硬件的算子。
内存: 模型参数和中间张量占用内存,需优化布局减少占用。
存储: 模型文件存储在设备本地。

NPU/GPU: 高端手机SoC集成专用AI处理器,提供数TOPS算力。CPU: 辅助处理和调度。内存: 模型常驻内存,大小在几MB到几十MB。存储盘: 模型文件存储。

Chat-0072

后端模型

社交匹配

“摇一摇”与“附近的人”实时匹配模型

地理空间索引与实时事件匹配

目标:基于用户实时动作(摇手机)或位置,快速匹配附近同时进行该动作的其他用户,建立临时连接。
1. 动作事件建模:用户摇动手机产生一个事件 E = (user_id, geohash, timestamp, action_type)geohash为摇动发生时的大致位置编码(精度可较低,如5位,约2.4km精度)。
2. 时空窗口匹配:定义匹配时间窗口 Δt(如2秒)和空间范围(同一geohash格子或相邻格子)。在时间窗口 [t-Δt, t]内,收集所有同类型动作的事件。将这些事件按 geohash分组,对每组内的用户进行两两随机匹配或全匹配。
3. 负载均衡与排队:为防止热点区域(如演唱会)事件洪峰,采用分桶排队。将时间窗口细分为更小的时隙,用户被随机散列到某个时隙中进行匹配,平滑峰值。
4. 结果推送与会话建立:为匹配成功的用户对生成一个临时的会话ID或房间号,通过消息推送将匹配结果(对方信息)分别推送给双方。双方可基于此会话进行即时聊天。

匹配延迟:从摇动到收到匹配结果的P95时间。
匹配成功率:在有效时空窗口内找到至少一个匹配对象的概率。
系统吞吐:每秒可处理的动作事件数。

实时事件处理、空间索引、随机匹配

微信“摇一摇”(朋友、歌曲)、基于位置的随机社交。特征:瞬时高并发、时空强相关、结果需实时推送。

E: 用户动作事件
geohash: 事件发生地的GeoHash编码(字符串)
timestamp: 事件时间戳(毫秒)
Δt: 匹配时间窗口长度(秒)
匹配半径: 空间匹配范围,用GeoHash精度或距离表示
user_pair: 匹配成功的用户对 (uid_A, uid_B)
session_id: 临时会话标识

时间窗口、空间分组、随机配对、哈希

事件接收与匹配流程、结果分发逻辑

1. 事件上报:用户摇动手机,客户端捕获动作,获取粗略位置(不精确定位),生成事件 E,上报到服务器。
2. 事件缓冲:服务器将事件按 action_typegeohash前缀写入不同的内存队列或 Kafka Topic,每个队列对应一个时空单元。
3. 窗口触发匹配:每个队列由一个消费者处理。消费者以固定频率(如每秒)拉取队列中时间在最近 Δt内的事件列表 L
4. 匹配计算:对列表 L中的事件,如果 `

L

≥ 2,则进行匹配。简单随机匹配:将L中的user_id随机打乱,然后两两配对。如果

L

为奇数,最后一人轮空或进入下一轮。<br>5. **生成结果**:为每个配对成功的user_pair生成唯一的session_id,并记录匹配信息。<br>6. **推送结果**:向配对双方的在线设备推送匹配通知,包含对方昵称、头像(脱敏)和session_id`。如果一方不在线,则匹配失效。
7. 会话生命周期:临时会话设置有效期(如30分钟),过期后自动解散。

用户动作事件流从海量设备涌入,根据地理位置和动作类型被分流到不同的“匹配队列”流中。每个匹配队列流由一个时间窗口滑动切割,产生一批批的候选事件流。匹配处理器对每批候选事件流进行随机配对操作,产生匹配成功的用户对流。用户对流触发通知推送流,分别发送给匹配双方。匹配成功后,双方的消息流可以基于临时会话流进行交换。

Chat-0073

后端模型

开放平台

第三方授权与API调用频控模型

OAuth 2.0 与令牌桶算法

目标:安全地授权第三方应用(小程序、公众号)访问微信用户数据,并严格控制其API调用频率,防止滥用和过载。
1. OAuth 2.0 授权码流程
- 第三方应用引导用户到微信授权页,携带 appid, redirect_uri, scope, state
- 用户同意授权,微信重定向到 redirect_uri,附带 code
- 第三方应用用 codeappsecret向微信交换 access_tokenrefresh_token
- 第三方应用使用 access_token调用API。
2. 令牌管理access_token有有效期(如2小时),过期后需用 refresh_token刷新。服务器存储令牌与用户的绑定关系,并验证令牌有效性、范围和状态(是否被用户撤销)。
3. API频控:为每个 appidaccess_token设置调用频率限制。使用令牌桶算法:每个键有一个容量为 B的桶,以速率 R填充令牌。每次API调用消耗1个令牌。如果桶空,则拒绝请求(返回 429 Too Many Requests)。可设置多级限流:全局、用户、IP等维度。
4. 配额与计费:对高级API或高调用量,设置每日/每月调用配额。记录每次调用,扣减配额。配额用完则拒绝。支持购买扩充包。

安全性:防止令牌泄露、伪造、越权访问。
可用性:保证合法调用不被误限流。
配额准确性:调用次数统计准确,不超卖。

授权协议、流量控制、配额管理

微信开放平台API(获取用户信息、发送模板消息等)。特征:第三方应用多、需精细权限控制、防止API被刷。

appid: 第三方应用标识
code: 授权临时票据
access_token: 访问令牌
refresh_token: 刷新令牌
scope: 授权权限范围列表
B: 令牌桶容量(次)
R: 令牌填充速率(次/秒)
quota_daily: 每日调用配额(次)

授权流程、令牌桶、计数、配额

OAuth协议交互、限流判断逻辑

1. 授权请求:用户访问第三方应用,应用重定向用户到微信授权页 https://.../authorize?appid=xx&redirect_uri=xx&scope=snsapi_userinfo&state=xxx
2. 用户同意:用户扫码或点击同意,微信重定向到 redirect_uri?code=CODE&state=xxx
3. 换取令牌:第三方应用服务器用 code, appid, appsecret请求 https://api.weixin.qq.com/sns/oauth2/access_token,获取 access_tokenrefresh_token
4. API调用:第三方应用在请求头携带 Authorization: Bearer ACCESS_TOKEN调用API。
5. 令牌验证与限流:API网关拦截请求:
- 验证 access_token有效性、是否过期、scope是否包含该API。
- 对 appid和API接口组合键,检查令牌桶:tokens = min(B, tokens + R * Δt)。如果 tokens ≥ 1,则 tokens -= 1,放行请求;否则返回429。
- 检查全局配额:查询该 appid今日已调用次数 count,如果 count ≥ quota_daily,则拒绝;否则 count++
6. 刷新令牌:当 access_token过期,第三方应用用 refresh_token请求刷新接口获取新的 access_token

用户授权请求流经第三方应用,导向微信授权端点。用户同意流产生授权码流返回给第三方。第三方用授权码流和密钥换取访问令牌流。后续的API调用流携带访问令牌流入网关。网关验证令牌流有效性,并根据 appid和接口将请求流导入对应的限流器(令牌桶)。令牌桶以恒定速率生成令牌流,请求消耗令牌流。通过的请求流继续向后端服务流,并被配额计数器流记录。失败的请求流(令牌不足或配额耗尽)被转换为错误响应流。

身份认证与授权、API管理、微服务网关

企业API开放、云服务API管理

CPU: API网关进行令牌验证、限流计算消耗CPU。
内存: 存储令牌桶状态、有效令牌集合、配额计数缓存。
存储: 持久化存储授权关系、令牌信息、调用日志。
网络: 处理海量API请求。

CPU: API网关集群需要强大CPU进行密集的加密验证和限流计算。内存: 令牌和限流状态缓存需要大量内存。网络: 面向公网的API网关需要高带宽和DDoS防护。存储盘: 调用日志和审计记录存储量巨大。

Chat-0074

后端模型

企业通讯

已读回执与组织架构同步模型

读扩散状态同步与增量更新

目标:在企业微信等场景,高效同步消息的已读未读状态,以及庞大的企业组织架构(部门、成员)变更。
1. 已读回执扩散:消息发送后,发送方需要知道哪些人已读。采用读扩散:每个收件人阅读消息后,向服务器发送回执。服务器维护每条消息的已读用户列表 read_set。当查询消息已读状态时,直接返回 read_set。优化:对于群消息,可维护一个计数器,只同步已读人数,详细列表按需拉取。
2. 组织架构存储:企业组织架构是一棵树 T,节点为部门,叶子节点关联成员。使用闭包表(Closure Table)存储节点间的祖先-后代关系,便于查询子树。每个成员有属性(姓名、职位等)。
3. 增量同步:客户端本地缓存组织架构。每次同步时,携带本地数据版本号 local_version(如最后更新时间戳)。服务器返回所有 last_modified > local_version的变更记录(增、删、改)。客户端应用这些补丁更新本地缓存。
4. 变更通知:当组织架构变更(如成员离职),服务器向所有在线员工推送增量变更通知,触发客户端拉取增量数据。

同步延迟:从变更发生到所有客户端同步的延迟。
数据一致性:各客户端缓存的组织架构最终一致。
同步流量:增量同步减少的数据传输量。

最终一致性、增量同步、树形数据同步

企业微信消息已读状态、通讯录同步。特征:读状态需扩散、组织架构大且变更多、需高效增量同步。

message_id: 消息唯一标识
read_set: 已读该消息的用户ID集合
reader_counter: 已读人数计数器
T: 组织架构树
closure_table: 闭包表,记录 (ancestor, descendant, depth)
local_version: 客户端本地数据版本号
delta_changes: 增量变更记录列表

集合、计数、树、闭包表、版本、增量

回执上报流程、增量同步协议

1. 消息已读:用户U阅读消息M,客户端发送回执:POST /receipt {msg_id: M, reader: U}
2. 更新已读状态:服务器收到回执,将U加入消息M的 read_set,并递增 reader_counter。可选地,向消息发送者推送“U已读”的通知。
3. 查询已读状态:发送者查询消息M的已读情况。服务器返回 reader_counterread_set(或分页返回)。
4. 组织架构变更:管理员在后台修改组织架构(如移动部门)。服务器记录变更操作,生成新的全局版本号 new_version,并更新闭包表和数据表。
5. 客户端增量同步:客户端启动或收到通知,携带 local_version请求同步。服务器查询变更日志,返回所有版本号大于 local_version的变更记录 delta_changes,以及最新的 new_version
6. 客户端应用变更:客户端解析 delta_changes,依次应用(增加节点、删除节点、更新属性)到本地缓存树。更新本地 local_version = new_version
7. 全量兜底:如果 local_version太旧或增量丢失,客户端可以触发全量同步。

消息阅读事件流产生已读回执流,汇聚到服务器,更新对应消息的已读状态流。组织架构变更操作流产生增量变更记录流,并更新全局版本流。客户端同步请求流携带版本号流入服务器,服务器比较版本流,产生增量数据流(或全量数据流)返回。客户端应用增量流更新本地缓存。服务器也会主动将重要的变更通知流推送给在线客户端,触发同步流。

企业协同软件、数据同步协议

OA系统、CRM系统

CPU: 处理回执、计算增量、维护闭包表消耗CPU。
内存: 缓存活跃消息的已读状态、组织架构热点数据。
存储: 持久化消息已读关系、组织架构全量数据和变更日志。
网络: 回执和增量同步产生网络流量。

CPU: 处理海量已读回执和增量同步计算。内存: 组织架构缓存和已读状态缓存。存储盘: 组织架构历史变更日志存储。网络: 企业内部大量客户端的同步流量。

Chat-0075

后端模型

电商交易

库存防超卖与高并发扣减模型

乐观锁与令牌桶限流

目标:在秒杀、抢购等高并发场景下,准确扣减商品库存,防止超卖,并保证系统可用性。
1. 库存分层校验
- 缓存库存:在Redis中存储商品可售库存 stock_redis,用于快速预扣减,抵御大部分流量。
- 数据库库存:在数据库中存储真实库存 stock_db,用于最终一致性校验。
2. 乐观锁扣减:用户下单时,先检查 stock_redis > 0。然后执行 DECR stock_redis,如果返回结果 ≥ 0,表示预扣成功。接着异步或同步地更新数据库:UPDATE item SET stock = stock - 1 WHERE id = ? AND stock > 0,利用数据库行锁保证原子性。如果更新影响行数为0,说明数据库库存不足,需要回滚Redis库存(INCR)。
3. 令牌桶限流:对秒杀接口,使用令牌桶进行限流,将请求控制在系统处理能力内。令牌桶容量为预估的最大并发处理能力。
4. 排队与降级:对于超出处理能力的请求,返回“排队中”或“已售罄”。可引入消息队列缓冲请求,后端 workers 顺序处理扣减。

数据一致性:最终售出数量 ≤ 实际库存,不超卖。
系统吞吐:每秒成功处理的订单数(TPS)。
用户感知:抢购成功/失败的响应速度。

并发控制、缓存策略、限流、排队论

微信小程序商城秒杀、抢红包。特征:瞬时极高并发、库存有限、需绝对准确。

stock_redis: Redis中的可售库存(整数)
stock_db: 数据库中的真实库存(整数)
DECR: Redis原子减1命令
UPDATE...WHERE: 数据库乐观锁更新语句
token_bucket: 接口限流令牌桶
queue: 订单处理队列

原子操作、比较、扣减、限流、队列

下单扣库存流程、限流与排队逻辑

1. 预检查:用户请求秒杀接口,先经过令牌桶限流,无令牌则直接返回“活动太火爆”。
2. 缓存预扣:通过限流后,执行Redis Lua脚本:if redis.call('get', stock_key) > 0 then return redis.call('decr', stock_key) else return -1 end。如果脚本返回 ≥ 0,进入下一步;否则返回“已售罄”。
3. 创建订单:生成临时订单记录,状态为“待确认”。
4. 数据库最终扣减:异步任务或同步调用数据库,执行:UPDATE items SET stock = stock - 1 WHERE id = item_id AND stock > 0。检查 rows_affected
- 如果为1,扣减成功,更新订单状态为“已确认”。
- 如果为0,扣减失败(数据库库存不足),回滚Redis库存:INCR stock_key,并将订单状态置为“失败”。
5. 结果返回:如果是同步流程,等待数据库扣减结果后返回用户;如果是异步,先返回“抢购中,请稍后查看结果”,再通过推送通知结果。
6. 超时回滚:设置预扣库存的锁定时间(如15分钟),如果订单未在规定时间内完成支付,则定时任务回滚Redis和数据库库存。

用户抢购请求流经过令牌桶过滤器,超限部分被拦截。通过的请求流进入库存预扣服务,尝试扣减Redis库存流。扣减成功的请求流产生订单创建流,并进入数据库最终扣减队列流。数据库 worker 消费队列流,执行数据库扣减流,并根据结果更新订单状态流(成功/失败)。失败的订单流会触发库存回滚流,增加Redis库存。整个流程中,库存状态流(Redis和DB)被多个服务节点消费和更新,通过最终一致性达到平衡。

高并发系统设计、库存管理、分布式事务

电商大促、票务系统

CPU: Redis执行Lua脚本和数据库更新消耗CPU。
内存: Redis存储库存和令牌桶状态。
数据库: 承受最终扣减的写压力,需优化(如合并更新)。
消息队列: 缓冲下单请求,异步处理。

CPU: Redis集群和数据库需要极高QPS处理能力。内存: Redis集群需要大内存存储热点库存和令牌桶。网络: 前端请求洪峰需要高带宽入口和内部网络。存储盘: 数据库需要高性能SSD支撑高TPS更新。

Chat-0076

后端模型

系统保障

混沌工程与故障演练模型

故障注入与系统韧性评估

目标:通过主动注入故障(如网络延迟、服务宕机),验证分布式系统的容错能力和恢复能力,提前发现脆弱点。
1. 故障模型库:定义一系列可注入的故障类型 F,如:网络丢包(loss_rate, duration)、网络延迟(latency_ms, jitter_ms)、服务宕机(target_service, kill_method)、CPU满载、内存耗尽等。
2. 实验编排:定义实验 E = (scope, fault, hypothesis, metrics)scope指定故障注入范围(如特定服务实例、机房)。hypothesis是实验假设(如“注入数据库延迟后,服务应降级,不应雪崩”)。metrics是要监控的系统指标(错误率、延迟、吞吐量)。
3. 安全机制:设置熔断条件,当监控指标超过安全阈值(如错误率 > 5%)时,自动停止故障注入。确保演练可控,不影响线上核心业务(通常在非高峰时段或隔离的预发环境进行)。
4. 韧性评估:比较故障注入期间与基线期间的监控指标,验证 hypothesis。计算系统韧性分数,如服务可用性 A = (1 - error_rate) * 100%,恢复时间 T_recovery

实验安全性:故障注入未造成不可控影响或业务损失。
问题发现率:通过演练发现的潜在系统缺陷数量。
恢复能力:故障停止后,系统指标恢复正常的时间。

混沌工程、故障注入、系统可靠性、监控

微信后台微服务常态化的故障演练,提升系统韧性。特征:主动制造故障、需精细控制、强依赖监控和应急流程。

F: 故障类型集合
E: 混沌实验定义
scope: 实验范围(如 pod_label=svc-a
fault: 具体故障参数
hypothesis: 实验假设(字符串)
metrics: 监控指标列表
safety_threshold: 安全阈值(如错误率上限)
A: 可用性指标
T_recovery: 恢复时间

故障模型、实验设计、指标比较、安全边界

实验执行流程、安全控制规则

1. 实验设计:工程师在控制台创建实验 E,选择故障类型、范围、持续时间和监控指标。
2. 前置检查:系统检查实验范围是否包含核心服务,是否在业务低峰期。检查监控系统是否正常。
3. 故障注入
- 对于网络故障,通过 sidecar 或网络设备规则注入丢包或延迟。例如,在目标 Pod 的网络命名空间中执行 tc qdisc add dev eth0 root netem delay 100ms 20ms
- 对于服务杀除,调用 Kubernetes API 删除目标 Pod。
4. 监控与观察:实验期间,持续采集 metrics中的指标。控制台实时展示指标变化,并与基线对比。告警系统保持开启。
5. 安全熔断:实时计算错误率等关键指标。如果任何指标超过 safety_threshold,自动触发中止程序,停止故障注入,并尝试恢复(如重启被杀服务)。
6. 实验分析:实验结束后,生成报告。对比故障前后指标,验证假设。记录发现的问题和后续改进项。
7. 复盘与改进:针对演练暴露的问题,优化系统架构、配置或应急预案。

混沌实验控制流启动,根据实验定义,生成故障注入指令流,作用于目标系统组件(网络、服务实例)。系统在故障影响下,其内部状态流和外部请求处理流发生变化,反映在各项监控指标流上。监控流被实时采集并与基线流比较。安全监控流持续判断是否触发熔断,若触发则发送停止注入流。实验分析模块收集所有相关数据流,产出韧性评估报告流。这是一个典型的“刺激-观测-反馈”控制流。

可靠性工程、实验科学、系统测试

金融系统容灾演练、云服务SLA验证

CPU: 故障注入代理(如 chaosd)和执行器消耗少量CPU。
网络: 网络故障注入可能修改网络包路径或延迟。
监控系统: 承载实验期间的高频指标采集和查询压力。
控制平面: 实验编排和安全管理需要可靠的服务。

CPU: 混沌工程控制平台和代理需要计算资源,但非密集型。网络: 需隔离的实验环境网络。监控系统: 需要强大的实时监控和告警系统支持。

Chat-0077

后端模型

全链路压测

数据隔离与流量影子模型

流量复制与影子数据存储

目标:模拟真实的生产流量,对系统进行全链路压力测试,准确评估系统容量和瓶颈,而不影响线上真实数据。
1. 流量复制:在生产环境入口(如网关)复制一份实时流量到压测集群。复制比例可调(如10%)。复制时,对请求进行标记(如添加 HTTP 头 X-Test: shadow)。
2. 数据隔离:压测流量使用“影子”存储。在中间件和数据库层面,通过识别流量标记,将压测流量的读写操作路由到独立的影子表或影子库。影子库结构与生产库一致,但数据可清理。
3. 中间件识别:RPC框架、消息队列、缓存客户端需支持流量标记的传递和识别。例如,Dubbo的 attachment 传递标记;Redis客户端将压测键添加前缀 shadow_
4. 结果评估:压测过程中,监控压测集群的各项资源指标(CPU、内存、IO、网络)和应用指标(QPS、延迟、错误率)。通过逐步增加流量,绘制系统性能曲线,找到瓶颈点。

数据隔离性:压测流量零污染生产数据。
流量真实性:复制的流量能代表真实用户行为模式。
容量评估准确性:找出的系统瓶颈与实际相符。

压力测试、流量仿真、数据隔离

微信重大活动(如春晚红包)前的全链路压测。特征:需模拟真实负载、不能影响线上、需全面覆盖。

λ: 流量复制比例(0~1)
X-Test: shadow: 压测流量标记
影子库/表: 用于承载压测数据的数据存储副本
shadow_prefix: 缓存等存储的压测键前缀
性能曲线: 负载(QPS)与延迟/错误率的关系曲线

流量复制、标记传递、路由、性能建模

压测流量标记与路由规则、数据隔离配置

1. 流量标记:在网关上,对流入的每个请求,以概率 λ复制一份,并在复制的请求头上添加 X-Test: shadow。原始请求正常处理,复制件发往压测环境入口(可能相同物理集群,但逻辑隔离)。
2. 标记传递:压测流量进入服务A,A在处理过程中发起的对服务B的RPC调用、对消息队列的生产/消费、对缓存的读写,都需要将 X-Test: shadow标记传递下去。
3. 数据路由
- 数据库:在ORM或数据库连接池层面,根据标记选择数据源。如果标记为shadow,则使用连接影子库的DataSource。
- 缓存:缓存客户端在生成key时,如果请求为压测流量,则在原始key前添加 shadow_prefix,使其访问独立的缓存空间。
- 消息队列:生产者将标记放入消息属性;消费者根据属性决定是否处理(压测消费者单独部署)。
4. 压测执行:逐步调整复制比例 λ,增加负载。通过监控平台观察各服务实例的资源使用率和应用性能指标。
5. 瓶颈分析:当某个服务的延迟显著上升或错误率增加时,定位该服务的资源瓶颈(CPU、内存、数据库连接等)或代码瓶颈(慢SQL、锁竞争)。
6. 清理:压测结束后,清理影子库和缓存中的测试数据。

生产流量流在入口被“流量复制器”节点复制,产生影子流量流。影子流量流携带标记流过整个系统。各个中间件(RPC、DB、Cache、MQ)节点根据标记,将影子流量流的数据操作导向影子存储流,而与生产存储流完全隔离。监控系统同时采集生产流量流和影子流量流下的系统指标流,用于对比分析。通过调节复制比例控制旋钮,可以控制影子流量流的压力大小,从而绘制出系统性能曲线。

软件测试、性能工程、容量规划

云服务容量评估、金融系统投产前压测

CPU/网络: 流量复制和标记传递带来额外开销,但比例可控。
存储: 需要一套与生产隔离的影子存储(数据库、缓存),增加成本。
中间件: 需要中间件支持流量标记和路由功能,可能需定制开发。

基础设施: 需要一套与生产环境硬件配置相似的压测集群(或利用生产集群空闲资源+逻辑隔离)。存储盘: 影子数据库和缓存需要额外存储资源。网络: 复制流量会产生内部网络流量。

Chat-0078

后端模型

配置管理

大规模配置灰度发布与回滚模型

多维度灰度与渐进式交付

目标:将新配置安全、可控地推送到海量服务器,支持按多种维度(如IP、用户ID、流量百分比)灰度发布,并能快速回滚。
1. 配置版本化:每个配置项有唯一标识 key和版本号 version(单调递增)。客户端缓存当前版本 local_ver
2. 灰度规则:定义规则集 R,每条规则是一个条件表达式,例如:`(user_id % 100 < 10)

(ip in [“10.0.0.1”, “10.0.0.2”])`。规则引擎评估每个客户端的请求上下文,决定是否应用新配置。
3. 渐进式发布:发布计划定义多个阶段,每个阶段扩大灰度范围。例如:阶段1:内部员工(1%);阶段2:5%随机用户;阶段3:20%用户;阶段4:全量。每个阶段持续观察监控指标,无异常则进入下一阶段。
4. 快速回滚:当监控到异常(如错误率上升),可立即将配置版本回退到上一稳定版本。回滚操作本质上是一次新的发布,将旧版本作为目标版本推送给受影响的灰度范围。客户端有本地缓存,即使配置中心暂时不可用也能使用旧配置。

发布成功率:配置成功推送到目标客户端的比例。
问题发现速度:从发布异常到触发回滚的平均时间(MTTD)。
回滚速度:从决定回滚到所有客户端生效的时间。

版本控制、灰度发布、功能开关、渐进式交付

微信后台所有微服务的配置、功能开关、业务参数动态变更。特征:配置项多、影响面广、需精细控制、快速止血。

key: 配置项标识
version: 配置版本号
local_ver: 客户端本地版本
R: 灰度规则集合,规则为布尔表达式
release_plan: 发布计划,包含多个阶段 [stage1, stage2, ...]
stage_i: 发布阶段,包含目标版本和灰度范围

版本、条件表达式、流量百分比、集合

灰度规则定义语法、发布阶段推进条件

1. 配置准备:管理员在控制台创建新配置 key的新版本 V_new,并编写灰度规则 R
2. 发布启动:开始第一阶段发布。配置中心将 (key, V_new, R_stage1)下发给所有客户端。
3. 客户端决策:客户端收到更新,用当前请求上下文(如 user_id, ip)评估规则 R_stage1。如果为真,则加载 V_new并应用;否则继续使用旧版本 V_old
4. 监控观察:监控系统比较灰度组(使用 V_new)和对照组(使用 V_old)的业务指标(错误率、延迟、吞吐)。如果灰度组指标在正常范围内,并持续稳定一段时间(如5分钟),则进入下一阶段。
5. 阶段推进:管理员或自动化系统触发,更新灰度规则为 R_stage2(扩大范围),并推送。重复步骤3-4。
6. 全量与回滚:如果所有阶段通过,则发布全量规则(100%流量)。如果在任何阶段监控到异常,立即触发回滚:将全量或当前阶段的规则目标版本改为 V_old,并紧急推送。
7. 客户端容错:客户端定期与配置中心同步,失败时使用本地缓存。支持配置本地降级规则。

新配置版本流从管理员发布点产生。发布计划控制流将版本流与分阶段的灰度规则流相结合,产生分阶段的发布指令流。发布指令流被推送给所有客户端。客户端对每个请求,结合请求上下文流和本地规则流,决策出应使用的配置版本流,并应用到业务处理流中。监控系统从业务处理流中采集指标流,并根据灰度标签进行分组比较。比较结果流驱动发布控制流决策是推进到下一阶段,还是触发回滚流。回滚流本质上是发布一个旧版本的指令流。

持续交付、功能发布、A/B测试

互联网产品功能灰度、微服务配置管理

Chat-0079

后端模型

服务网格

边车代理流量拦截与治理模型

Envoy 代理与 xDS 协议

目标:通过在每个服务实例旁部署一个轻量级代理(sidecar),透明地提供流量管理、可观测性、安全等功能,无需修改应用代码。
1. 流量拦截:通过 iptables 规则或透明代理,将进出服务容器的所有网络流量重定向到 sidecar 代理(如 Envoy)。Envoy 监听一个端口,接收所有流量,然后根据规则转发到目标服务。
2. 动态配置:控制平面(如 Istio Pilot)通过 xDS 协议(LDS, RDS, CDS, EDS)向 sidecar 动态下发监听器、路由、集群和端点配置。例如,当服务B的实例列表变化时,Pilot 将新的端点列表下发给所有订阅了服务B的 sidecar。
3. 流量治理:在 sidecar 中实现高级路由(如按版本分流、金丝雀发布)、重试、超时、熔断、限流等策略。这些策略通过自定义资源(如 VirtualService, DestinationRule)描述,由控制平面转换并下发给 sidecar。
4. 可观测性:Sidecar 自动收集流量指标(请求数、延迟、错误码)并上报到遥测系统(如 Prometheus),同时生成请求追踪 span。

性能开销:Sidecar 代理引入的额外延迟和CPU消耗。
配置生效延迟:控制平面配置变更到 sidecar 生效的时间。
功能覆盖度:支持的治理功能完整性。

服务网格、代理、流量管理、微服务治理

微信内部微服务间的通信治理、多环境路由。特征:对应用透明、统一治理、可观测性增强。

sidecar: 边车代理进程(如 Envoy)
iptables: Linux 内核数据包过滤规则,用于流量重定向
xDS: 发现服务协议,包括 LDS, RDS, CDS, EDS
VirtualService: 虚拟服务资源,定义路由规则
DestinationRule: 目标规则资源,定义负载均衡、熔断策略
控制平面: 负责配置管理和下发的组件(如 Istio)

流量拦截、配置下发、策略执行、指标收集

流量拦截规则、xDS 协议交互

1. 流量劫持:Pod 启动时,init 容器配置 iptables 规则,将所有出站流量(除与控制平面通信外)重定向到 Envoy 的监听端口(如15001)。
2. 启动与发现:Envoy 启动,向控制平面发起 gRPC 长连接,订阅 xDS 资源。
3. 配置接收:控制平面根据服务注册信息和治理规则,生成 xDS 配置,通过流式推送给 Envoy。
4. 流量处理:应用发起 HTTP 请求,被 iptables 重定向到 Envoy。Envoy 根据收到的路由配置,匹配请求的 Host/Path,决定目标集群。再根据集群的负载均衡策略和端点列表,选择一个后端实例,将请求转发出去。
5. 治理策略应用:在转发过程中,应用配置的超时、重试、熔断策略。记录访问日志和指标。
6. 指标上报:Envoy 定期将指标数据推送到遥测适配器,再进入监控系统。
7. 配置更新:管理员在控制平面修改 VirtualService。控制平面将更新后的路由配置下发给相关的 Envoy 实例,Envoy 热更新配置,无需重启。

应用产生的网络请求流被 iptables 规则强制导入 sidecar 代理流。Sidecar 作为中间人,根据从控制平面接收的配置流(xDS 流),对请求流进行路由、策略处理,然后转发到真实的上游服务流。响应流逆向经过 sidecar 流返回给应用。同时,sidecar 会生成访问日志流和指标流上报给可观测性系统。控制平面的配置变更流会实时地下发给 sidecar,改变其内部处理逻辑流。

云原生、微服务架构、网络代理

混合云流量管理、多集群服务治理

CPU: Sidecar 代理(Envoy)处理所有流量的解析、路由和转发,增加 CPU 消耗(估计增加 0.5-2ms 延迟)。
内存: Envoy 占用额外内存(几十MB到百MB)。
网络: Sidecar 增加了网络跳数,但通常在同一节点,影响较小。控制平面与 sidecar 间的 xDS 流需要网络。
控制平面: 需要资源运行 Istio 等组件。

CPU: 每个服务 Pod 都需要额外的 CPU 运行 sidecar,总体资源消耗增加显著。内存: Sidecar 内存开销累加巨大。网络: 内部服务间流量翻倍(进出都经 sidecar),对网络带宽和延迟有影响。控制平面需处理海量 sidecar 的连接。

Chat-0080

后端模型

数据备份

跨地域多活与数据同步模型

双向复制与冲突解决

目标:在多个地理区域部署独立的数据中心,每个中心都可读写,数据异步双向同步,实现异地多活和容灾。
1. 数据分片与路由:将数据按分片键(如用户ID)划分,每个分片有一个主地域。写请求路由到主地域处理,保证分片内强一致。通过全局路由表(如user_id -> home_region)实现路由。
2. 双向异步复制:每个地域的数据库将变更(binlog)异步复制到其他地域。使用消息队列或专用复制通道。复制延迟通常在秒级到分钟级。
3. 冲突检测与解决:由于异步复制,可能在不同地域对同一行数据并发更新,产生冲突。常见解决策略:
- 最后写入获胜:基于时间戳,latest_timestamp的更新胜出。
- 业务规则:如账户余额取最大值,或向用户提示冲突由人工解决。
- 避免冲突:通过路由将同一用户请求固定到其主地域,减少跨地域写冲突。
4. 最终一致性:系统保证在没有新更新的情况下,经过一段时间后,所有地域的数据副本最终一致。

复制延迟:数据从一个地域同步到另一个地域的P99延迟。
数据一致性:最终一致性的收敛时间。
冲突率:发生写冲突的请求比例。

分布式数据库、数据复制、冲突解决、多活架构

微信用户数据、关系链的跨地域多活部署,保障高可用和异地容灾。特征:地域分散、网络延迟大、需容忍脑裂、保证最终一致。

region: 地域标识(如sh, sz, bj
shard_key: 数据分片键(如user_id
home_region: 分片的主地域
binlog: 数据库变更日志
replication_lag: 复制延迟(秒)
conflict: 冲突记录,包含冲突的版本和值
resolution_policy: 冲突解决策略(last_write_wins, max_value, etc.)

分片、路由、异步复制、冲突检测、最终一致性

数据读写路由规则、冲突解决流程

1. 写请求:用户请求到来,网关根据 user_id查询全局路由表,得到其 home_region,将请求转发到该地域的数据中心。
2. 本地写:主地域数据中心执行写操作,生成 binlog。
3. 异步复制:主地域的数据库将 binlog 事件发布到消息队列(如 Kafka)。其他地域的消费者消费这些事件,并在本地应用变更。应用时检查本地版本,如果发现冲突(版本号不连续或数据已被修改),则触发冲突解决流程。
4. 冲突解决:冲突解决器根据预定义的 resolution_policy决定获胜值。例如,last_write_wins:比较 binlog 事件中的时间戳和本地行的时间戳,保留最新的。然后将解决后的值写入本地,并可能生成一条补偿日志同步回源地域。
5. 读请求:读请求可路由到任意地域。由于复制延迟,可能读到旧数据。对一致性要求高的读,可指定读主地域(home_region)。
6. 路由表更新:用户迁移(如出国)时可更改 home_region。迁移过程中需双写,确保数据同步完成后再切换路由。

用户请求流根据路由规则流被导向其主地域的数据中心流。主地域的数据库写操作流产生 binlog 事件流。该事件流被发布到全局消息总线流。其他地域的数据中心订阅该总线流,消费事件流并应用到本地数据库流,可能产生冲突事件流。冲突解决器处理冲突流,产生决议后的写操作流。最终,所有地域的数据库状态流在异步延迟后趋于一致。读请求流可以从任意地域的数据库流中读取,可能读到稍旧的状态流。

分布式系统、数据库复制、异地多活

全球化应用部署、金融跨数据中心容灾

CPU: 数据库复制、冲突解决消耗CPU。
网络: 跨地域的数据同步产生持续的、大量的网络流量,延迟和带宽成本高。
存储: 每个地域都有全量或部分数据副本,存储成本增加。
消息队列: 需要高可靠、高吞吐的全局消息总线。

网络: 跨地域数据中心间需要超高带宽、低延迟的专线网络,年费用高昂。存储盘: 数据多副本存储,总容量倍增。CPU: 每个数据中心的数据库集群需要处理本地读写和远程同步。

Chat-0081

后端模型

智能客服

意图识别与对话状态管理模型

基于BERT的意图分类与槽位填充

目标:理解用户自然语言查询的真实意图,提取关键参数,并管理多轮对话状态,提供准确的自动应答或转人工。
1. 意图分类:将用户查询 Q分类到预定义的意图集合 I中。使用 BERT 等预训练模型,在领域数据上微调。模型输入为 Q,输出在 I上的概率分布 `P(i

Q)。取概率最大的意图i* = argmax_i P(i

Q)。<br>2. **槽位填充**:对于每个意图,定义需要填写的槽位(参数)集合S_i。例如,查询话费的意图需要{手机号}。使用序列标注模型(如 BERT-CRF)从Q中提取实体,填充到对应槽位。模型输出每个 token 的标签(B-{slot}, I-{slot}, O)。<br>3. **对话状态管理**:维护一个对话状态DS = (intent, filled_slots, missing_slots, context)。每轮用户输入后,更新DS。如果missing_slots非空,则生成澄清问题询问缺失槽位。直到所有必要槽位填满,或用户意图明确,则调用后端 API 获取答案,或触发相应动作。<br>4. **上下文与多轮**:考虑对话历史H = [u1, a1, u2, a2, ...]。将历史与当前查询拼接后输入模型,以理解指代和省略。例如,将最近 K 轮对话拼接为[CLS] u1 [SEP] a1 [SEP] ... u_n [SEP]` 输入 BERT。

意图识别准确率:分类正确的比例。
槽位填充F1值:实体抽取的准确率和召回率调和平均。
任务完成率:无需人工介入成功解决用户问题的比例。

自然语言处理、对话系统、状态机

微信内“腾讯客服”机器人、小程序智能助手。特征:开放域意图、多轮交互、需结合业务系统。

Q: 用户当前轮次查询文本
I: 预定义的意图集合
`P(i

Q): 意图 i 给定 Q 的条件概率<br>i*: 预测的意图<br>S_i: 意图 i 的槽位集合<br>DS: 对话状态结构体<br>H: 对话历史列表<br>BERT`: 预训练语言模型

概率、分类、序列标注、状态转移、上下文编码

对话流程、状态更新规则

1. 用户输入:收到用户消息 Q
2. 上下文编码:获取当前会话的对话历史 H,将 HQ按格式拼接,输入 BERT 模型,得到上下文相关的编码表示 [CLS]向量和 token 向量。
3. 意图分类:取 [CLS]向量,通过全连接层和 softmax,得到意图概率分布 `P(i

Q, H)。选择i。<br>4. **槽位填充**:取 token 向量,通过 CRF 层进行序列标注,识别出Q中属于各个槽位的实体片段,填充到DS.filled_slots中。<br>5. **状态更新**:根据i和填充的槽位,更新DS。检查该意图的必要槽位集合S_required是否都已填充。如果未填充,将缺失的槽位加入DS.missing_slots。<br>6. **对话策略**:<br> - 如果DS.missing_slots非空,则从第一个缺失槽位生成澄清问题(如“请问您的手机号是多少?”)。<br> - 如果所有必要槽位已满,则根据意图和槽位调用后端服务(如查询话费API),将结果组织成自然语言回复。<br> - 如果意图置信度低或无法处理,回复“暂不理解”并建议转人工。<br>7. **回复生成**:将策略决定的回复文本返回给用户,并更新对话历史H.append((Q, reply))`。

用户自然语言消息流进入对话引擎。引擎结合历史对话流,通过意图分类模型流产生意图标签流,通过槽位填充模型流产生槽位键值对流。这些信息流更新内部的对话状态机流。状态机根据当前状态和缺失信息,产生系统动作流(如询问槽位、调用

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0082

前端模型

手势识别

触摸轨迹分析与手势分类模型

动态时间规整 (DTW) 与特征提取

目标:准确识别用户在触摸屏上的单指/多指手势(如滑动、缩放、长按),驱动UI交互。
1. 轨迹预处理:原始触摸点序列 P = [(x_1, y_1, t_1), ..., (x_n, y_n, t_n)],进行平滑滤波(如移动平均)以减少抖动:x_i' = (x_{i-1} + x_i + x_{i+1})/3。计算速度 v_i = sqrt((x_i - x_{i-1})^2 + (y_i - y_{i-1})^2) / (t_i - t_{i-1})和方向角 θ_i = atan2(y_i - y_{i-1}, x_i - x_{i-1})
2. 特征向量提取:对预处理后的轨迹,提取固定长度的特征向量 F,包括:轨迹总长度 L、平均速度 v_avg、方向变化总和 Δθ_sum、起点到终点的直线距离 D、手势持续时间 T。对于缩放(双指),额外计算两指中点轨迹和两指间距变化率。
3. 手势模板匹配:预定义标准手势模板(如“左滑”、“右滑”、“放大”)的特征向量集 {T_k}。使用动态时间规整 (DTW) 或直接计算欧氏距离进行匹配。DTW 距离:D_{dtw}(A, B) = min_π √( Σ_{(i,j)∈π} (a_i - b_j)^2 ),其中 π是规整路径。选择距离最小的模板作为识别结果。
4. 状态机与决策:结合触摸事件(touchstart, touchmove, touchend)和识别出的手势,触发对应的UI操作(如翻页、缩放图片)。设置置信度阈值,低于阈值则视为无效操作。

识别准确率:手势被正确分类的比例。
响应延迟:从 touchend到识别完成的时间(<50ms)。
误触发率:无意识触摸被误判为手势的比例。

信号处理、模式识别、时间序列分析

微信聊天列表左滑删除、图片浏览缩放、网页上下滑动。特征:实时性要求高、需区分意图性手势和无意触摸、支持多指。

P: 原始触摸点序列(坐标+时间戳)
v_i, θ_i: 瞬时速度和方向
F: 特征向量 [L, v_avg, Δθ_sum, D, T, ...]
T_k: 第k个手势模板的特征向量
D_{dtw}: DTW 距离函数
π: 规整路径,满足边界性、单调性、连续性约束
threshold_confidence: 识别置信度阈值

序列、滤波、距离、特征提取、动态规划

手势识别状态机、特征计算规则

1. 触摸开始touchstart事件,记录起始点,初始化轨迹列表 P
2. 触摸移动touchmove事件,将新点加入 P,实时进行平滑滤波。计算当前瞬时速度和方向,可用于实时反馈(如滑动跟随)。
3. 触摸结束touchend事件,轨迹 P完成。执行:
- 轨迹预处理(平滑、重采样到固定长度N)。
- 计算特征向量 F
- 计算 F与每个模板 T_k的 DTW 距离 d_k
- 找到最小距离 d_min及其对应模板 k*。如果 d_min < threshold_confidence,则识别结果为手势 k*;否则,视为无效操作(如点击)。
4. 触发动作:根据识别出的手势类型,调用相应的回调函数,如 onSwipeLeft()onPinchZoom(scale_factor)
5. 多点触控:对于双指手势,分别跟踪两个指头的轨迹,计算中点轨迹和间距序列,作为特征进行类似匹配。

原始触摸事件流(start, move, end)被捕获,形成坐标-时间序列流。该序列流经过预处理节点(平滑、重采样),转化为规整的轨迹流。特征提取节点从轨迹流中计算出一系列几何和运动特征流。特征流与预存的手势模板流在分类器节点中进行相似度比较(DTW距离流),产生识别结果流(手势类型+置信度)。识别结果流触发对应的UI动作流。这是一个从低级传感器事件流到高级语义动作流的转换管道。

人机交互、手势识别、时间序列分类

移动设备触控交互、AR/VR手势控制

CPU: 轨迹平滑、特征计算和DTW匹配消耗CPU,需在UI线程快速完成,避免卡顿。
内存: 存储当前手势轨迹和模板库。
触摸屏: 提供高采样率的触摸点数据。

CPU: 客户端设备CPU处理,现代移动SoC足以胜任。时钟: 依赖于高精度的触摸事件时间戳。

Chat-0083

前端模型

内存管理

复杂单页应用内存泄漏检测与回收模型

引用计数与标记-清除的混合策略

目标:在WebView或小程序等单页应用运行环境中,自动检测和回收不再使用的JavaScript对象和DOM节点,防止内存泄漏导致页面卡顿或崩溃。
1. 垃圾回收基本原理:JavaScript引擎(如V8)使用标记-清除算法。从根对象(全局对象、当前函数局部变量等)出发,递归标记所有可达的对象。标记完成后,遍历整个堆,回收所有未被标记的对象。引用计数是一种辅助策略,每个对象记录被引用的次数,当降为0时立即回收,但无法处理循环引用。
2. 内存泄漏模式:常见原因:
- 意外的全局变量:未声明的变量或this绑定到全局。
- 遗忘的定时器/回调setInterval未清除,闭包引用。
- 脱离的DOM引用:JS中引用了已被移除的DOM节点。
3. 开发者工具监控:利用Chrome DevTools的Memory面板,可拍摄堆快照,对比前后快照,找出未被释放的对象增长。通过Retainers链条定位泄漏源。
4. 编码规范与自动释放:框架(如Vue、React)提供生命周期钩子(beforeDestroy, componentWillUnmount),开发者需在其中手动清除定时器、事件监听器、取消网络请求等。使用WeakMap/WeakSet避免强引用。

内存占用稳定性:长时间运行后,堆内存占用的增长斜率。
GC暂停时间:执行完整标记-清除导致的UI线程暂停时间(应<100ms)。
泄漏检测覆盖率:工具能识别出的泄漏场景比例。

垃圾回收、内存管理、图论

微信小程序、公众号网页、视频号播放页等单页应用。特征:长时间运行、动态内容加载/卸载、需避免内存无限增长。

G: 对象引用有向图,V是对象,E是引用边
roots: 根对象集合
marked: 已标记的对象集合
ref_count: 对象的引用计数(某些引擎)
heap_snapshot: 堆内存快照,包含所有对象及其引用关系

图、遍历、标记、集合、引用计数

垃圾回收算法、内存泄漏排查步骤

1. 分配:代码执行创建对象,在堆上分配内存。
2. 标记阶段(周期性或内存压力触发):
- 暂停主线程(Stop-The-World)。
- 将所有对象标记为未访问(白色)。
- 从roots集合开始深度优先搜索(DFS),将访问到的对象标记为已访问(黑色)。
3. 清除阶段:遍历整个堆,将所有仍为白色(不可达)的对象的内存回收,加入空闲链表。
4. 内存泄漏排查
- 在可疑操作前拍摄堆快照 S1
- 执行操作(如打开/关闭一个组件)多次。
- 拍摄堆快照 S2
- 对比 S1S2,筛选出在 S2中新增且未被释放的对象,查看其引用链,找到不必要的根引用。
5. 预防性编码
- 使用let/const替代var
- 清除定时器:clearInterval(timerId)
- 移除事件监听:element.removeEventListener
- 在框架生命周期销毁钩子中清理。

程序运行过程中,对象创建流不断产生新的内存分配流。垃圾回收器周期性启动,从根集合出发,执行对象可达性分析流,产生“活动对象”标记流。随后,回收器遍历整个堆内存流,将未标记的内存块回收,并入空闲内存流,供后续分配。内存泄漏表现为某些对象流不再被程序逻辑流需要,但始终被根或全局对象流引用,导致其永远存在于活动对象流中,无法进入回收流。开发者工具通过对比不同时间点的堆快照流,可以识别出异常增长的对象流。

编程语言运行时、内存管理、性能分析

大型Web应用内存优化、嵌入式系统资源管理

CPU: 垃圾回收(特别是标记阶段)消耗CPU,会引起应用暂停(Stop-The-World)。
内存: 需要额外内存维护标记位图和引用关系。
JS引擎: 依赖V8、JavaScriptCore等引擎的GC实现和调优。

CPU: 客户端JS引擎的GC开销,需优化减少停顿。内存: 堆内存大小有限,需控制对象数量。

Chat-0084

前端模型

包大小优化

代码分割与 Tree Shaking 模型

静态分析与依赖图剪枝

目标:减少Web应用或小程序最终打包文件的体积,加快下载和解析速度,提升启动性能。
1. 依赖图构建:工具(如Webpack)从入口文件开始,静态分析import/require语句,构建模块依赖有向图 G = (V, E)。每个节点 v ∈ V是一个模块(JS文件、CSS、图片等),边 (u→v) ∈ E表示模块u依赖模块v。
2. Tree Shaking:基于ES6模块的静态结构(import/export)。对图 G进行反向分析,从入口节点出发,标记所有被直接或间接使用的导出(包括语句、函数、类)。将未被标记的导出(“死代码”)从最终打包产物中剔除。形式化:used_exports = reachable_exports(entry_points, G),打包时只包含 used_exports
3. 代码分割:将依赖图 G划分为多个子图(chunk)。划分策略:
- 入口点分割:每个入口文件及其依赖单独打包。
- 动态导入分割import()语法定义的异步加载点自动分割成独立chunk。
- 公共代码提取:将被多个chunk共享的模块提取到单独的“vendor”或“common” chunk,避免重复。
4. 资源优化:对图片、字体等资源进行压缩(WebP、SVGO)、懒加载。CSS使用PurgeCSS移除未使用的样式。

打包体积:主包、分包、vendor包的最终文件大小(gzip后)。
Tree Shaking效率:移除的死代码占原始代码的比例。
缓存利用率:代码分割后,公共chunk的缓存命中率提升。

图论、静态分析、编译优化

微信小程序主包/分包优化、H5页面性能优化。特征:模块数量多、依赖复杂、需极致压缩体积。

G=(V,E): 模块依赖有向图
entry_points: 入口模块集合
used_exports(v): 模块v中被使用的导出集合
dead_code(v): 模块v中未被使用的导出集合
chunk: 打包输出文件块,是 G的一个连通子图
import(): 动态导入语法,触发代码分割点

图、遍历、集合、划分、压缩

构建配置、代码分割规则

1. 依赖收集:从配置的 entry文件开始,递归解析所有import/require,构建完整的依赖图 G
2. Tree Shaking标记
- 初始化 used_exports为空集。
- 从每个入口模块开始,将其所有的 import语句导入的绑定加入 used_exports
- 对于 used_exports中的每个绑定,找到其导出所在的源模块,将该模块中此导出语句标记为“已使用”,并递归将该模块内部依赖的其他模块的导出加入 used_exports(如果涉及重导出)。
3. 代码分割决策
- 对于每个动态 import()调用点,其加载的模块及其依赖(除非已被其他chunk包含)会被分配到一个新的异步chunk。
- 通过 SplitChunksPlugin配置,将满足条件(如最小大小、被多个chunk共享)的模块提取到公共chunk。
4. 代码生成与优化
- 对每个chunk包含的模块,只输出其 used_exports对应的代码。移除 dead_code
- 进行代码压缩(Terser)、作用域提升(Scope Hoisting)、变量名混淆。
5. 资源处理:图片等资源经过loader压缩后,以Data URL或单独文件形式输出。

源代码文件流经构建工具。工具进行静态分析,构建出模块依赖图流。Tree Shaking过程在依赖图上进行可达性分析流,标记出“活的”代码流。代码分割策略将依赖图流切割成多个子图流(chunk)。每个chunk流经过代码转换和压缩流,生成最终的打包文件流。资源文件流被并行处理,经过压缩流后合并到输出流中。整个过程是一个从源码到优化产物的编译流水线。

前端工程化、编译原理、性能优化

大型单页应用构建、微前端架构

CPU: 构建过程(特别是压缩和Tree Shaking分析)消耗大量CPU,通常在开发/构建服务器上运行。
内存: 构建大型应用时,依赖图可能很大,需要足够内存。
磁盘IO: 读取大量源文件和写入打包产物。

CPU: 构建集群需要强大CPU进行并发构建。内存: 构建进程需要大量内存处理大型项目。存储盘: 存储源码和构建产物。

Chat-0085

前端模型

错误监控

客户端异常捕获与聚合上报模型

全局错误监听与样本抽样

目标:实时捕获前端JavaScript运行时错误、资源加载失败、接口异常等,进行聚合、采样后上报到服务端,用于问题排查和监控。
1. 全局错误监听:通过 window.onerrorwindow.addEventListener('error', callback, true)捕获JS运行时错误。通过 window.addEventListener('unhandledrejection')捕获未处理的Promise拒绝。通过 PerformanceObserver监听资源加载错误。
2. 错误信息标准化:提取关键字段:错误类型 type、错误消息 message、错误堆栈 stack、发生页面 url、用户设备信息 ua、发生时间 timestamp、自定义标签 tags
3. 聚合与采样:避免相同错误短时间内大量重复上报。对错误进行指纹计算:fingerprint = hash(type + message + stack的前N行)。相同指纹的错误在时间窗口 T内只上报一次,并记录发生次数 count。采样:对高频错误按比例采样上报,如每100次上报1次。
4. 异步上报:使用 sendBeaconimg.src进行异步上报,避免阻塞页面卸载。合并多条错误日志批量上报。

错误捕获率:实际发生的错误被成功捕获并上报的比例。
数据准确性:错误堆栈、上下文信息的完整性。
上报性能影响:监控脚本对页面加载和运行性能的影响(应<1%)。

异常处理、日志聚合、采样理论

微信内网页、小程序、H5活动的线上错误监控。特征:错误场景多样、需低侵入、不影响用户体验、需去重和降噪。

window.onerror: 全局JS错误事件处理器
error_event: 错误事件对象,包含 message, filename, lineno, colno, error
fingerprint: 错误指纹,用于聚合
hash(): 哈希函数(如MD5前8位)
T: 聚合时间窗口(如60秒)
sampling_rate: 采样率(如0.01)
sendBeacon: 异步上报API

事件监听、哈希、聚合、采样、异步

错误监听器注册、上报决策逻辑

1. SDK加载:在页面 <head>中引入监控SDK脚本,尽早初始化。
2. 全局监听:注册 window.onerrorunhandledrejectionerror(捕获阶段)等事件监听器。
3. 错误捕获:当错误发生时,监听器被触发,收集错误信息,生成标准化的错误对象 errObj
4. 指纹计算与聚合:计算 fingerprint = hash(errObj.type + errObj.message + first3LinesOfStack)。检查内存中是否存在该指纹且上次上报时间在 T内。如果是,则增加该指纹的计数 count++,本次不上报。如果不是,则记录指纹和当前时间,进入下一步。
5. 采样决策:对于低频错误(如首次出现),直接上报。对于高频错误(指纹计数高),生成随机数 r ~ U(0,1)。如果 r < sampling_rate,则上报,并携带 count信息;否则丢弃。
6. 异步上报:将需要上报的错误数据放入一个队列。定期(如每5秒)或队列达到一定大小时,使用 sendBeaconfetch将批次数据上报到日志收集服务器。在页面 beforeunload时,强制上报队列中所有数据。
7. 服务端处理:日志服务器接收、解析、存储错误日志,接入监控告警和数据分析平台。

页面中产生的各种错误事件流(JS Error, Promise Rejection, Resource Error)被全局监听器捕获,转化为标准化的错误对象流。错误对象流经过指纹计算节点,产生指纹流。聚合器根据指纹流和时间窗口,对重复错误进行计数聚合,输出唯一的错误实例流。采样器对高频错误实例流进行随机过滤,产生最终需要上报的错误流。上报调度器将错误流缓冲、批量,通过异步网络请求流发送到日志收集服务。

可观测性、前端监控、日志收集

应用性能监控、用户体验监控

CPU: 错误捕获、指纹计算、采样决策消耗少量CPU。
内存: 存储错误指纹映射和待上报队列。
网络: 异步上报产生少量网络流量。
存储: 客户端无持久化存储。

CPU: 客户端轻量级计算。网络: 上报流量可控,需考虑用户流量。服务器端: 日志收集服务需高吞吐,处理海量上报。

Chat-0086

后端模型

服务通信

异步消息驱动的服务解耦模型

事件溯源与CQRS

目标:通过事件总线(Event Bus)和消息队列,实现微服务间的松耦合通信,支持事件溯源和读写分离,提高系统扩展性和可靠性。
1. 事件定义:领域事件 Event是不可变的、描述已发生事实的数据结构,如 OrderCreatedEvent(orderId, userId, amount)。每个事件有唯一ID、类型、发生时间、触发者、负载数据。
2. 事件发布/订阅:服务A完成一个业务操作后,不直接调用服务B,而是将产生的事件发布到消息队列(如Kafka)的特定Topic。对事件感兴趣的其他服务(B, C)订阅该Topic,消费事件并触发本地业务逻辑。
3. 事件溯源:将聚合根(如订单)的状态变化存储为一系列有序事件的序列,而不是仅存储最终状态。状态可以通过重放所有事件重建:state_n = apply(event_n, apply(event_{n-1}, ... apply(event_1, state_0)...))。这提供了完整的审计日志和时光回溯能力。
4. CQRS:命令查询职责分离。写模型(命令端)处理更新操作,生成事件并更新事件存储。读模型(查询端)订阅事件,更新物化视图(如数据库表、Elasticsearch索引),专门为查询优化。读写使用不同的数据模型和存储。

最终一致性延迟:从事件发布到所有订阅者处理完成的时间。
系统可扩展性:新增消费者对生产者无影响。
数据追溯能力:可重建任意时间点聚合状态的能力。

事件驱动架构、消息传递、最终一致性、领域驱动设计

微信支付订单状态变更通知、用户资料更新同步。特征:服务间依赖复杂、需审计追踪、读写负载差异大。

Event: 领域事件结构体
event_id: 事件唯一标识
event_type: 事件类型
payload: 事件数据负载
Topic: 消息队列主题
apply(state, event): 状态应用函数
Command: 写操作命令
Query: 读操作查询
MaterializedView: 物化视图

事件序列、状态机、发布订阅、最终一致性

事件发布与处理协议、CQRS架构

1. 命令处理:客户端发送命令 Command到命令服务。命令服务验证业务规则,在聚合根上执行操作,产生一个或多个领域事件 [Event]
2. 事件持久化:将事件追加到事件存储(Event Store),保证原子性和顺序。同时,将事件发布到消息队列的相应Topic。
3. 事件分发:消息队列将事件广播给所有订阅了该Topic的服务。
4. 事件处理:订阅者服务消费事件,根据事件类型更新自己的本地数据(可能是另一个聚合,或更新物化视图)。处理需幂等。
5. 查询服务:客户端查询直接访问读模型的物化视图(如SQL数据库),这些视图已由事件处理程序更新,数据可能略有延迟。
6. 状态重建:当需要时(如新服务上线、数据修复),可以从事件存储中重放所有相关事件,重建聚合状态或物化视图。

客户端命令流进入命令服务,命令服务执行业务逻辑,产生领域事件流。事件流被持久化到事件存储流,并同时发布到消息总线流。消息总线将事件流复制多份,分发给各个订阅者服务流。每个订阅者消费事件流,更新其本地状态流(可能是另一个聚合状态流或物化视图流)。查询请求流直接访问物化视图流,获得最终一致的数据。这是一个典型的“写-事件-读”分离的数据流。

微服务架构、事件驱动、CQRS/事件溯源

电商订单系统、银行交易系统

CPU: 事件处理、状态应用消耗CPU。
消息队列: 需要高吞吐、持久化的消息中间件(如Kafka)。
存储: 事件存储需要支持大量追加写和高性能按序读取。读模型的物化视图存储需针对查询优化。
网络: 事件发布和订阅产生网络流量。

CPU: 事件处理服务集群。消息队列: Kafka等集群需支撑海量事件吞吐。存储盘: 事件存储和物化视图存储容量巨大。网络: 服务间事件流量大。

Chat-0087

后端模型

连接池管理

数据库连接动态分配与健康检查模型

基于负载预测的连接池调优

目标:高效管理应用服务器与数据库之间的连接池,避免连接泄露和耗尽,根据负载动态调整池大小,并剔除无效连接。
1. 连接池状态:连接池维护一组活跃连接 connections,包含空闲连接 idle_conns和忙碌连接 busy_conns。关键参数:最小连接数 min_conn、最大连接数 max_conn、最大等待时间 max_wait、连接空闲超时 idle_timeout
2. 连接获取:当应用需要连接时,先尝试从 idle_conns获取。若无空闲连接且 busy_conns.size() < max_conn,则创建新连接。若已达 max_conn,则请求进入等待队列,超时 max_wait后抛出异常。
3. 连接回收与健康检查:应用使用完连接后归还到池中。定期(如每30秒)对 idle_conns中的连接执行健康检查(如发送SELECT 1)。如果检查失败或连接空闲超过 idle_timeout,则关闭连接。忙碌连接如果执行SQL超时,也会被强制回收。
4. 动态调优:根据历史负载(QPS、平均查询时间)预测未来需求,动态调整 min_connmax_conn。例如,使用滑动窗口计算平均并发需求 C_avg,设置 min_conn = C_avg * α, max_conn = C_avg * β,其中 α<1, β>1为缓冲系数。

连接获取延迟:P99获取连接的时间。
连接利用率busy_conns / total_conns的平均值。
连接泄露检测:未能归还的连接数量。

资源池、排队论、健康检查、预测

微信后台服务与MySQL/Redis等数据源的连接管理。特征:高并发、连接是稀缺资源、需防止雪崩。

connections: 连接集合
idle_conns, busy_conns: 空闲/忙碌连接子集
min_conn, max_conn: 连接池上下界
max_wait: 获取连接最大等待时间(毫秒)
idle_timeout: 连接空闲超时时间(秒)
health_check_sql: 健康检查语句(如SELECT 1
C_avg: 平均并发连接需求估计

集合、队列、超时、预测、动态调整

连接获取/归还流程、健康检查定时任务

1. 初始化:启动时创建 min_conn个连接,加入 idle_conns
2. 获取连接
- 如果 idle_conns非空,弹出第一个连接 conn,移入 busy_conns,返回给应用。
- 如果 idle_conns为空且 busy_conns.size() < max_conn,创建新连接,加入 busy_conns,返回。
- 如果 busy_conns.size() == max_conn,将请求放入等待队列,启动计时器。如果在 max_wait时间内有连接释放,则分配给等待者;否则抛出超时异常。
3. 归还连接:应用调用 conn.close()(实际是归还池),连接从 busy_conns移出。如果连接仍有效,则放入 idle_conns;否则直接关闭。
4. 健康检查:后台线程周期性遍历 idle_conns,对每个连接执行 health_check_sql。失败则关闭连接。同时检查连接空闲时间是否超过 idle_timeout,超时也关闭。
5. 动态调整:监控 busy_conns的历史大小,计算滚动平均值 C_avg。定期(如每5分钟)调整:min_conn = max(1, floor(C_avg * 0.8)); max_conn = min(hard_limit, ceil(C_avg * 1.5))。关闭多余的空闲连接或创建新连接以满足新的 min_conn

应用请求流需要数据库连接时,产生连接获取请求流。连接池管理器接收请求流,首先尝试从空闲连接流中分配。如果空闲流为空且未达上限,则创建新连接流。如果已达上限,请求流进入等待队列流。应用使用完连接后,产生连接归还流,连接流回到空闲池或根据健康状态被销毁。后台健康检查流定期扫描空闲连接流,剔除无效连接。监控流实时观测负载,动态调整连接池参数流。

数据库中间件、资源管理、自适应系统

应用服务器数据库访问、分布式连接池

CPU: 连接创建、健康检查、池管理消耗少量CPU。
内存: 存储连接对象和状态信息。
网络: 每个连接对应一个TCP连接,占用文件描述符和内存。
数据库: 连接池大小影响数据库的并发连接数。

CPU: 每个应用服务器都需要连接池管理,总开销大。内存: 每个连接占用内存。网络: 大量TCP连接消耗端口和内存。数据库: 需支撑数十万甚至百万级来自应用服务器的连接。

Chat-0088

后端模型

缓存防护

缓存穿透/击穿/雪崩综合防护模型

布隆过滤器、互斥锁与随机过期

目标:防止恶意或异常请求穿透缓存击穿数据库,防止热点Key失效引起大量请求击穿数据库,防止缓存服务宕机或大批Key同时过期导致雪崩。
1. 缓存穿透:针对数据库中也不存在的数据,请求绕过缓存直接查询数据库。解决方案:布隆过滤器。将所有可能存在的Key的哈希映射到一个位数组。查询前先检查布隆过滤器,如果不存在则直接返回空。布隆过滤器误判率:P_fp ≈ (1 - e^{-k*n/m})^k,其中m是位数组大小,n是元素数量,k是哈希函数个数。
2. 缓存击穿:某个热点Key过期瞬间,大量请求同时击穿到数据库。解决方案:互斥锁。第一个发现缓存失效的线程获取分布式锁,然后查询数据库并回填缓存,其他线程等待或返回旧值。使用SETNX(set if not exist)实现。
3. 缓存雪崩:大量缓存Key在同一时间过期,或缓存服务宕机,导致所有请求涌向数据库。解决方案:随机过期时间。为Key的过期时间增加一个随机值,如 TTL = base_ttl + random(-300, 300)秒。多级缓存:本地缓存(如Guava Cache) + 分布式缓存(Redis)。熔断与降级:当数据库压力过大时,对查询进行熔断,返回默认值或错误。

数据库保护:异常情况下数据库QPS的增长幅度(应<50%)。
系统可用性:在缓存故障或攻击下,核心功能是否可用。
误判率:布隆过滤器将存在Key判为不存在的概率(应为0),及将不存在Key判为存在的概率(可接受较低值)。

概率数据结构、分布式锁、容错设计

微信热点资讯、用户信息、配置等缓存场景。特征:高并发读取、数据一致性要求可放宽、需防止级联故障。

BloomFilter: 布隆过滤器,位数组 bits[m]k个哈希函数
P_fp: 误判率(假阳性)
SETNX: Redis原子命令,键不存在时设置
mutex_key: 分布式锁的键名,如 lock:{key}
TTL: 缓存过期时间
base_ttl, random_offset: 基础过期时间和随机偏移量
circuit_breaker: 熔断器状态

概率、哈希、锁、随机、熔断

缓存查询与回填流程、防护策略触发条件

1. 查询请求:请求查询Key为 k的数据。
2. 布隆过滤器检查(针对穿透):如果启用布隆过滤器,先检查 BloomFilter.mightContain(k)。如果返回false,则直接返回空值/默认值,流程结束。如果返回true,继续下一步。
3. 缓存读取:从缓存(如Redis)中读取Key k的值 v
- 如果 v存在且非空,则返回 v
- 如果 v为空(缓存中存储的空对象,用于防止穿透),则返回空值。
- 如果 v不存在(缓存未命中),进入下一步。
4. 防击穿锁:尝试获取分布式锁 mutex_key = "lock:" + k(如Redis SETNX)。
- 如果获取成功,当前线程负责查询数据库 db_v = query_db(k)。如果 db_v不为空,则回填缓存并设置随机TTL。如果 db_v为空,则在缓存中设置一个空值对象(短TTL)防止后续穿透,并可选地更新布隆过滤器。最后释放锁。
- 如果获取锁失败,说明有其他线程正在回填,可以等待片刻后重试缓存读取,或直接返回一个旧的默认值(如果业务允许)。
5. 返回结果:将查询到的值(或空)返回给调用方。
6. 雪崩预防:在设置缓存TTL时,使用 expire = base_ttl + rand(-300, 300)。定期检查缓存服务健康,如有宕机,启用本地缓存或直接熔断,返回降级结果。

查询请求流首先经过布隆过滤器节点,被过滤掉一部分肯定不存在的请求流(返回空流)。剩余的请求流进入缓存查询节点。缓存命中流直接返回。未命中流触发防击穿逻辑:尝试获取分布式锁流。获得锁的请求流才会访问数据库流,并回填缓存流(设置随机TTL)。其他并发的未命中请求流在锁等待期间可能重试缓存查询流或返回降级结果流。整个缓存系统外部有熔断器节点保护,当数据库压力过大时,熔断器打开,将部分或全部请求流转为降级流。

缓存设计、高并发系统、容错模式

电商商品详情页、社交热点Feed

CPU: 布隆过滤器哈希计算、分布式锁操作消耗少量CPU。
内存: 布隆过滤器位数组占用内存,本地缓存占用JVM堆。
网络: 缓存和锁操作增加Redis网络往返。
数据库: 防护的核心目标是保护数据库。

CPU: 应用服务器和缓存服务器CPU开销。内存: 布隆过滤器和本地缓存内存。网络: 防护逻辑增加了与Redis的交互次数。数据库: 有效降低穿透流量,保护数据库。

Chat-0089

后端模型

任务调度

分布式定时任务调度与负载均衡模型

时间轮与一致性哈希分片

目标:在分布式集群中,可靠、精准地调度海量定时任务,支持任务分片、故障转移和负载均衡。
1. 时间轮调度:多层时间轮(秒、分、时)用于管理未来任务。任务被放入未来触发时间对应的时间槽。一个指针随时间推进,触发当前槽中的任务。对于长间隔任务,使用“层级时间轮”或“任务链表”。
2. 分片与负载均衡:将任务标识(如任务名+参数)哈希到 N个分片。每个工作节点(Worker)负责处理一个或多个分片。通过一致性哈希,当节点增减时,只有少量分片需要迁移。任务分配策略:shard_id = hash(task_key) mod Nworker_id = mapping[shard_id]
3. 故障转移:主节点(Leader)或协调者(如ZooKeeper)监控Worker健康。如果Worker失联,其负责的分片会被重新分配给其他存活的Worker。任务状态(进行中、已完成)需持久化,以便故障恢复后继续或重试。
4. 精准调度:使用高精度定时器(如hashed wheel timer)减少误差。考虑时钟同步(NTP)。对于绝对时间敏感的任务,可以提前一些触发,加入就绪队列,由Worker在准确时间点执行。

调度精度:任务实际执行时间与预期时间的偏差(P99 < 1s)。
任务执行成功率:任务成功完成的比例(排除业务逻辑错误)。
系统吞吐:每秒可调度和执行的任务数。

分布式调度、时间轮、一致性哈希、容错

微信红包过期处理、日志清理、报表生成、消息推送等后台定时任务。特征:任务种类多、触发时间分散、需高可靠、支持水平扩展。

Wheel: 多层时间轮数据结构
tick: 时间轮滴答间隔(如1秒)
slot: 时间轮上的槽,存储任务列表
task_key: 任务唯一标识
shard_id: 任务分片ID (0..N-1)
N: 总分片数
hash(): 一致性哈希函数
Worker: 工作节点,执行任务
Leader: 调度主节点,推进时间轮

时间轮、哈希、分片、一致性哈希、容错

任务注册与触发流程、故障检测与恢复

1. 任务注册:客户端提交任务,指定cron表达式或触发时间。调度器解析时间,计算下一次触发时间 next_fire_time,将任务放入时间轮对应的未来槽中。同时持久化任务元信息。
2. 时间推进:Leader节点维护一个高精度定时器,每tick时间前进一格。取出当前槽中的所有就绪任务。
3. 任务分派:对每个就绪任务,计算其shard_id = hash(task_key) mod N。查询分片到Worker的映射表,得到负责的worker_id。将任务通过RPC发送给该Worker。
4. 任务执行:Worker收到任务,从持久化存储加载任务详情,执行业务逻辑。执行完成后,上报结果给调度器。如果任务是周期性的,调度器计算下一次触发时间,重新放入时间轮。
5. 故障处理:Leader通过心跳检测Worker存活。如果Worker W_i失联,Leader将其负责的所有分片标记为“待分配”,并根据一致性哈希环,将这些分片分配给W_i的后继节点。新Worker接管分片后,可能需要从持久化存储中恢复该分片下未完成的任务状态。
6. 负载均衡:Leader定期收集各Worker的负载(CPU、内存、任务队列长度),如果负载不均,可以动态调整分片映射关系,迁移部分分片。

任务创建请求流进入调度器,被持久化并根据触发时间注入时间轮未来的槽流中。时间流驱动时间轮指针流动,当指针到达某个槽时,该槽中的任务流被释放。任务流经过分片计算节点,被哈希到不同的分片流。分片流根据映射表被路由到对应的工作节点流执行。执行结果流反馈回调度器。Worker故障事件流触发分片重分配流,改变后续任务的路由。监控流用于动态调整负载均衡。

分布式系统、任务调度、容错

大数据作业调度、云计算任务调度

CPU: 调度器推进时间轮、分派任务消耗CPU。Worker执行业务逻辑消耗CPU。
内存: 时间轮数据结构、任务缓存占用内存。
网络: 调度器与Worker间任务分派和心跳通信。
存储: 持久化任务元数据和状态,用于故障恢复。

CPU: 调度集群(Leader+Worker)需要大量CPU核心。内存: 时间轮和任务缓存需要大内存。网络: 内部任务分发网络需要高吞吐。存储盘: 任务元数据数据库需高TPS。

Chat-0090

后端模型

流处理

复杂事件流处理与模式检测模型

Apache Flink CEP (Complex Event Processing)

目标:在无界数据流上,检测符合特定时间序列模式的事件组合,用于实时风控、异常行为检测等。
1. 事件定义:数据流中的每个元素是一个事件 e,带有类型、时间戳、属性。例如,用户登录事件 {type: "login", userId: "u1", ip: "x.x.x.x", ts: 12345}
2. 模式定义:使用类正则的表达式描述事件序列模式。例如,检测“短时间内多次登录失败”:Pattern.<LoginEvent>where(e -> e.success==false).times(3).within(Time.minutes(5))。模式可以包含顺序、循环、可选、直到等操作符。
3. 状态机匹配:CEP引擎将模式编译为一个非确定性有限状态机(NFA)。每个事件到来时,更新NFA的状态。状态由部分匹配的事件序列(称为PartialMatch)组成。当事件序列使NFA到达接受状态时,产生一个完整匹配(CompleteMatch)。
4. 时间窗口与乱序:模式通常限定在时间窗口内(within)。支持事件时间,处理乱序事件通过水印机制。水印 watermark(t)表示时间 < t的事件已基本到齐,可触发窗口计算和超时部分匹配的清理。

检测延迟:从模式对应的事件序列发生到产生告警的延迟。
处理吞吐:每秒可处理的事件数。
准确性:误报率和漏报率。

复杂事件处理、有限状态机、流处理、模式匹配

微信支付风控(如盗刷行为序列)、用户异常操作监控。特征:实时检测、模式复杂、事件可能乱序。

e: 事件,包含 type, attributes, timestamp
Pattern: 模式定义,由基本事件条件、操作符(next, followedBy, times, within)组成
NFA: 非确定有限状态机,状态集合 Q,转移函数 δ
PartialMatch: 部分匹配,包含已匹配的事件序列和当前NFA状态
CompleteMatch: 完整匹配,满足模式的事件序列
watermark: 水印,单调递增的时间戳,表示事件时间进展

事件流、状态机、模式匹配、时间窗口、水印

CEP模式定义语法、匹配状态更新规则

1. 模式编译:将用户定义的 Pattern编译成一个NFA状态图。每个状态对应模式中的一个位置,转移由事件条件谓词和时间约束触发。
2. 事件摄入:数据流源持续产生事件流,分配事件时间戳和水印。
3. 状态机处理:对每个输入事件 e,遍历当前所有活跃的 PartialMatch状态集合 S。对每个部分匹配 pm ∈ S,检查其当前NFA状态 q的所有出边,如果事件 e满足某条边的条件且时间在窗口内,则创建新的部分匹配 pm'(将 e加入序列,状态转移到 q')。如果 q'是接受状态,则输出一个 CompleteMatch
4. 新匹配开始:同时,事件 e也可能作为新模式匹配的起点,从NFA的初始状态开始尝试转移。
5. 超时清理:维护一个计时器,基于水印。当水印时间超过某个部分匹配的起始时间加上窗口长度,则该部分匹配超时,从状态集合 S中移除。
6. 结果输出:输出的完整匹配事件序列,可触发告警或下游处理。

原始事件流进入CEP引擎。引擎内部为每个活跃的模式维护一个匹配状态机流。每个新事件流会尝试推进所有活跃的状态机流,可能产生新的部分匹配状态流,或完成匹配产生告警事件流。水印流驱动超时清理流,移除过期的部分匹配状态。这是一个典型的有状态流处理过程,状态是动态创建和销毁的部分匹配。

流处理、复杂事件检测、状态机

金融交易监控、物联网传感器异常检测

CPU: 模式匹配(状态转移计算)消耗CPU,特别是模式复杂、并发匹配多时。
内存: 存储所有活跃的部分匹配状态,可能占用大量内存,取决于数据流速和模式窗口长度。
网络: 事件流输入和结果输出占用网络带宽。
存储: 通常不需要持久化状态,除非需要故障恢复(通过checkpoint)。

CPU: 流处理集群(如Flink)需要大量CPU进行实时模式匹配。内存: 状态后端需要巨大内存存储部分匹配状态。网络: 事件流摄入和结果输出网络。存储盘: Checkpoint存储用于容错。

Chat-0091

后端模型

模型部署

机器学习模型在线服务与A/B测试模型

模型服务网格与动态流量路由

目标:将训练好的机器学习模型部署为在线服务,支持高并发、低延迟推理,并能够进行A/B测试、金丝雀发布等实验。
1. 模型标准化:将模型(TensorFlow, PyTorch, XGBoost等)转换为统一的服务格式,如ONNX或特定引擎格式(TensorFlow SavedModel, TorchScript)。模型包含计算图和权重。
2. 服务化:将模型加载到推理引擎(如TensorFlow Serving, TorchServe, Triton Inference Server)中,暴露gRPC/REST接口。服务支持批量推理以提高吞吐。优化:使用模型预热、图优化、算子融合、量化推理。
3. 流量路由:在API网关或服务网格层面,根据请求特征(如用户ID、设备类型)将流量按比例路由到不同版本的模型服务。例如,90%流量走基线模型A,10%流量走新模型B。路由规则可动态配置。
4. 实验与监控:为每个请求打上实验标签(如exp_group: "model_b")。收集推理结果和业务指标(如点击率、转化率)。在实验平台上对比不同模型版本的指标,进行显著性检验(如t-test),决定是否推广新模型。

推理延迟:P99推理耗时(包括网络+计算)。
服务可用性:模型服务SLA(如99.99%)。
实验灵敏度:能检测到的最小指标提升(MDE)。

机器学习系统、微服务、流量管理、实验设计

微信推荐、广告、风控等AI模型的在线服务。特征:模型体积大、推理计算密集、需快速迭代和实验。

Model: 机器学习模型文件
ONNX: 开放神经网络交换格式
推理引擎: 如TensorFlow Serving
批量大小: 一次推理处理的样本数
流量比例: 路由到不同模型的百分比
exp_group: 实验分组标签
业务指标: 如CTR, CVR
p-value: 统计检验的p值,判断差异是否显著

模型序列化、服务化、流量分配、假设检验

模型部署流程、A/B测试流量分割规则

1. 模型导出:训练完成后,将模型导出为标准格式(如SavedModel),存储在模型仓库。
2. 模型部署:模型服务平台从仓库拉取模型,部署到推理服务器集群。启动多个实例,负载均衡。
3. 服务注册与发现:模型服务实例向服务注册中心注册。网关订阅该服务,获取实例列表。
4. 流量路由:客户端请求到达网关,网关根据配置的路由规则(如user_id % 100 < 10)决定将请求发送到模型A服务还是模型B服务,并在请求头中添加X-Model-Version: B标签。
5. 推理执行:模型服务接收请求,可能将多个请求批处理,调用底层推理引擎(如调用GPU)进行计算,返回结果。
6. 指标收集:业务方在处理推理结果时,将结果和exp_group标签一同上报到指标系统(如点击日志)。
7. 实验分析:实验平台从指标系统查询不同exp_group的业务指标,计算指标差异和置信区间,进行统计检验。如果新模型B的指标显著优于A(p-value < 0.05),则可以逐步扩大B的流量比例,直至全量。

训练好的模型文件流进入模型仓库。部署系统从仓库拉取模型流,启动模型服务实例流。客户端请求流携带特征到达网关,网关根据路由规则流将请求流分发到不同版本的模型服务流。模型服务执行推理计算流,返回结果流。业务处理单元将结果流和实验标签流一同记录到指标日志流。实验分析平台消费指标日志流,进行统计分析,产出实验结论流,用于指导路由规则的调整流。

MLOps、在线实验、服务网格

互联网产品算法迭代、广告系统优化

CPU/GPU: 模型推理是计算密集型,GPU(如NVIDIA T4, A10)用于加速深度模型,CPU用于轻量级模型或预处理。
内存: 加载模型参数到内存/显存,批量推理需要缓存输入输出。
网络: 模型服务通常部署在离业务服务较近的位置,减少网络延迟。特征数据传递需要网络带宽。
存储: 模型仓库存储模型版本。

GPU: 大规模推理集群需要数千张GPU卡,满足高并发低延迟需求。CPU: 用于预处理、后处理和轻量模型。内存: 模型参数常驻显存/内存。网络: 特征传输和模型服务内部通信需高带宽。存储盘: 模型仓库存储。

Chat-0092

后端模型

自动化测试

智能测试用例生成与执行模型

基于代码覆盖引导的模糊测试

目标:自动生成测试用例,覆盖代码分支和边界条件,执行自动化测试(UI、接口),并报告缺陷。
1. 测试用例生成
- 基于代码覆盖:工具(如JUnitQuickCheck)通过分析源代码,生成输入数据以覆盖不同分支。使用符号执行或随机生成(模糊测试)。遗传算法优化输入以增加覆盖率。
- 基于模型:对系统行为建模(如状态机),生成覆盖状态转移的测试序列。
2. 测试执行
- 单元测试:在JVM等运行时执行,模拟依赖(Mock)。
- 接口测试:发送HTTP请求,验证响应状态码、数据结构和业务逻辑。
- UI测试:通过Selenium等控制浏览器,模拟用户操作,截图对比。
3. 覆盖率收集:在测试执行时,通过插桩收集代码覆盖信息(行覆盖、分支覆盖)。覆盖率目标:coverage = (covered_elements / total_elements) * 100%
4. 缺陷定位:当测试失败时,收集错误堆栈、输入数据、系统状态。结合代码变更和覆盖信息,辅助定位问题根因。使用差异测试(Differential Testing)比较新旧版本输出。

代码覆盖率:自动化测试达到的代码行/分支覆盖率。
缺陷检出率:自动化测试发现的缺陷数量占总缺陷的比例。
测试执行速度:测试套件完整运行的时间。

软件测试、模糊测试、代码覆盖、遗传算法

微信后台服务接口自动化测试、小程序兼容性测试。特征:代码频繁变更、回归测试量大、需快速反馈。

源代码: 被测系统源代码
测试用例: 输入数据集合
覆盖率: 代码覆盖度量,如行覆盖率、分支覆盖率
插桩: 在代码中插入探针,记录执行路径
模糊测试: 随机生成异常输入进行测试
遗传算法: 用于进化生成更有效的测试输入

代码分析、随机生成、优化、覆盖度量

测试生成与执行流程、覆盖率报告生成

1. 静态分析:工具分析源代码,构建控制流图,识别分支条件和输入参数。
2. 测试生成
- 随机生成初始测试输入集 T_0
- 执行测试,收集覆盖率信息 C
- 使用遗传算法:将测试输入编码为染色体,适应度函数为 fitness(t) = 新覆盖的代码分支数。通过选择、交叉、变异产生下一代测试集 T_{i+1}
- 重复直到覆盖率不再显著提升或达到资源限制。
3. 测试执行:在测试环境中运行生成的测试用例。对于接口测试,构造HTTP请求并发送,断言响应。对于UI测试,通过WebDriver驱动浏览器操作,断言页面元素。
4. 结果收集:记录每个测试用例的执行结果(通过/失败)、耗时、覆盖信息。失败的用例记录错误详情和输入。
5. 报告生成:生成测试报告,包括总体通过率、覆盖率、失败用例列表。将失败用例与代码变更关联,辅助开发定位。
6. 持续集成:将自动化测试集成到CI/CD流水线,每次代码提交后自动触发,快速反馈。

源代码流进入测试生成器,经过静态分析产生代码结构流。测试生成器(如基于遗传算法)产生测试输入流。测试执行引擎消费测试输入流,驱动被测系统运行,产生测试结果流(通过/失败)和代码覆盖流。覆盖反馈流引导测试生成器优化后续的测试输入流。失败结果流触发缺陷报告流。这是一个闭环的反馈优化系统,目标是最大化覆盖流和缺陷发现流。

软件工程、自动化测试、搜索算法

持续集成、DevOps

CPU: 测试执行(特别是UI测试)消耗大量CPU,模糊测试的遗传算法也消耗CPU。
内存: 运行被测系统和测试框架需要内存。
网络: 接口测试产生网络请求。
存储: 存储测试用例、结果和覆盖率报告。

CPU: 测试执行集群需要大量CPU资源并行运行测试。内存: 运行多个被测服务实例需要内存。网络: 内部测试网络。存储盘: 测试结果和日志存储。

Chat-0093

后端模型

安全防护

Web应用防火墙与智能风控模型

规则引擎与机器学习异常检测

目标:防护Web应用和API免受常见攻击(如SQL注入、XSS、DDoS),并结合行为分析识别恶意用户。
1. 规则匹配:维护攻击特征规则库。每条规则是一个正则表达式或字符串匹配模式,针对特定攻击载荷。例如,检测SQL注入:`规则: .*(%27

‘).*。对每个传入的HTTP请求(URL、参数、Header、Body)进行规则匹配,命中则拦截。<br>2. **频率限制**:对客户端IP、用户ID、接口进行请求频率限制,防止DDoS和暴力破解。使用滑动窗口计数器(见Chat-0036)。<br>3. **行为分析**:收集用户请求序列,提取特征(如访问端点、时间间隔、地理跳跃)。使用机器学习模型(如Isolation Forest, One-Class SVM)检测异常行为。模型离线训练正常行为模式,在线实时评分:score = anomaly_detection_model.predict(feature_vector)`,超过阈值则触发二次验证或拦截。
4. 人机验证:对可疑请求弹出验证码(如滑动拼图、点选文字)。验证通过后,发放令牌,允许短期免验证访问。

防护效果:成功拦截的攻击请求比例(召回率)。
误杀率:正常请求被误判为攻击的比例(误报率)。
检测延迟:从请求到做出拦截决策的时间(P99 < 10ms)。

网络安全、规则匹配、异常检测、频率限制

微信开放平台API防护、H5页面安全、账号安全。特征:攻击手段多变、需低误杀、高实时性。

Rule: 防护规则,包含匹配模式和动作(拦截、告警、通过)
regex: 正则表达式,用于模式匹配
滑动窗口计数器: 用于频率限制
feature_vector: 用户行为特征向量
anomaly_score: 异常分数,越高越可疑
threshold: 异常阈值
CAPTCHA: 验证码挑战

正则匹配、频率统计、异常检测、阈值

请求检测流程、规则引擎执行顺序

1. 请求接收:WAF(Web应用防火墙)接收HTTP请求。
2. 规则引擎匹配:提取请求各部分,依次与规则库中的规则进行匹配。如果命中任何一条拦截规则,则直接返回403拦截响应,流程结束。
3. 频率限制:检查该请求的客户端IP(或用户ID)在最近时间窗口内的请求次数是否超过阈值。如果超过,返回429(Too Many Requests)或触发验证码。
4. 行为特征提取:对通过规则和频率检查的请求,实时提取行为特征,如[请求路径, 参数数量, User-Agent, 来源IP地理, 与上次请求时间间隔]
5. 异常评分:将特征向量输入预加载的异常检测模型,得到异常分数 s。如果 s > threshold,则判定为可疑请求,进入下一步;否则,请求放行到后端应用。
6. 挑战响应:对于可疑请求,返回一个验证码挑战(如图片识别)。用户需正确完成挑战,验证通过后,WAF颁发一个短期令牌,该客户端后续请求携带令牌可免验证。如果验证失败或超时,请求被拦截。
7. 日志与审计:所有请求、匹配的规则、拦截动作、异常分数都记录日志,用于安全分析和规则优化。

网络请求流进入WAF。WAF内部是一个多级过滤管道:首先经过规则匹配过滤器流,匹配到的攻击流被拦截。通过的请求流进入频率限制器流,超频部分被限流。再通过的请求流进入行为特征提取节点,转换为特征流。特征流输入异常检测模型流,产生异常分

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0094

前端模型

性能监控

用户体验核心指标采集与计算模型

核心Web指标(LCP, FID, CLS)的自动化采集

目标:自动化采集和计算衡量用户体验的关键性能指标,用于监控和改进Web应用的性能。
1. 最大内容绘制(LCP):测量页面加载过程中最大的可见内容元素(如图像、文本块)渲染完成的时间。算法:通过PerformanceObserver监听largest-contentful-paint条目,记录渲染时间戳。LCP = max(entry.renderTime, entry.loadTime)
2. 首次输入延迟(FID):测量用户首次与页面交互(点击、触摸、按键)到浏览器实际响应该交互的时间。通过监听first-input条目,FID = entry.processingStart - entry.startTime
3. 累积布局偏移(CLS):测量页面整个生命周期中发生的所有意外布局偏移的分数。每个布局偏移的分数 = impact fraction * distance fraction。其中impact fraction是视口中不稳定元素影响的比例,distance fraction是元素移动的最大距离(视口宽度或高度的比例)。CLS是会话窗口内所有布局偏移分数的累加。
4. 数据上报:在页面加载和用户交互过程中收集这些指标,在合适的时机(如页面卸载前)通过sendBeacon上报到监控服务器。

指标准确性:采集的指标值与真实用户体验的吻合度。
上报完整性:在所有页面访问中成功上报数据的比例。
性能开销:监控脚本对页面性能的影响(应<1%)。

性能测量、用户体验、Web标准

微信内H5页面、小程序WebView的性能监控。特征:需在移动端浏览器中精确测量、对性能开销敏感、需跨平台一致性。

LCP: 最大内容绘制时间(毫秒)
FID: 首次输入延迟(毫秒)
CLS: 累积布局偏移分数(无单位)
PerformanceObserver: 性能观察者API
largest-contentful-paint: 最大内容绘制性能条目
first-input: 首次输入性能条目
layout-shift: 布局偏移性能条目
sendBeacon: 异步上报API

时间戳、最大值、分数计算、会话窗口

性能条目监听逻辑、CLS会话窗口管理

1. 初始化监控:在页面<head>中尽早加载监控脚本,注册PerformanceObserver监听largest-contentful-paintfirst-inputlayout-shift
2. LCP测量:在largest-contentful-paint事件触发时,记录当前条目的renderTimeloadTime,取较大值作为候选LCP。由于LCP可能会更新(更大的元素出现),持续监听直到页面进入后台或卸载,取最大的候选值作为最终LCP。
3. FID测量:在first-input事件触发时,立即计算延迟并记录。通常只记录第一次交互。
4. CLS测量:对每个layout-shift条目,计算其分数:score = entry.hadRecentInput ? 0 : entry.value * 0.001(标准API已计算好分数)。维护一个会话窗口:当两次布局偏移的时间间隔>1秒或偏移时间>5秒,则开启新的会话窗口。CLS为所有会话窗口中单个会话的最大累计分数。
5. 数据上报:在visibilitychange(页面隐藏)或beforeunload事件中,将收集到的LCP、FID、CLS等指标通过sendBeacon上报。同时,可以定期(如每30秒)上报一次CLS的当前值,以捕获页面交互期间的布局偏移。
6. 聚合分析:服务端接收上报数据,按页面、设备、网络等维度聚合,计算百分位数(如P75、P95)用于监控和告警。

页面加载和用户交互过程中,浏览器性能时间线流产生各种性能条目流(LCP、FID、CLS等)。监控脚本通过PerformanceObserver订阅这些条目流,并实时计算和更新核心指标流。在页面生命周期合适节点(卸载、隐藏、定时),指标流被批量打包,通过异步网络请求流上报到监控服务器。服务器端对指标流进行聚合、分析和存储,产生性能报告流。

Web性能、可观测性、数据采集

网站性能优化、移动Web体验监控

CPU: 性能条目的监听和计算消耗少量CPU。
内存: 存储性能条目和指标状态。
网络: 异步上报产生少量网络流量。
浏览器: 依赖现代浏览器对性能API的支持。

CPU: 客户端轻量级计算。网络: 上报流量可控。服务器端: 需处理海量性能数据上报。

Chat-0095

移动端模型

省电策略

应用后台活动智能管控模型

基于设备状态的智能任务调度

目标:在Android/iOS系统上,根据设备状态(电量、充电状态、网络)智能管控应用的后台活动(同步、定位、推送),最大限度延长续航。
1. 设备状态建模:定义设备状态向量 S = (battery_level, charging_state, network_type, doze_mode)。其中doze_mode是Android的省电模式状态(ACTIVE, IDLE, DEEP)。
2. 后台任务分类:将后台任务按重要性和延迟容忍度分类:
- 关键任务:如消息推送、安全认证,必须执行。
- 可延迟任务:如日志上报、数据预取,可延迟到充电或Wi-Fi下执行。
- 可跳过任务:如非关键的数据同步,在低电量时可跳过。
3. 调度策略:根据状态S动态调整任务执行策略。定义策略矩阵P[S, task_type] -> action,其中action可以是EXECUTE_NOW, DEFER, SKIP。例如:if battery_level < 20% and not charging: P[*, deferrable] = DEFER
4. 与系统协同:使用Android的WorkManager或iOS的BackgroundTasks框架,将任务委托给系统,系统会根据全局状态优化调度。利用AlarmManager的setAndAllowWhileIdlesetExactAndAllowWhileIdle在Doze模式下唤醒设备执行关键任务。

续航影响:后台任务导致的额外电池消耗百分比(优化目标:降低)。
功能完整性:关键任务(如消息接收)的SLA达成率(应接近100%)。
任务完成及时性:可延迟任务的平均延迟时间。

移动计算、能耗优化、调度算法

微信在Android/iOS上的后台消息同步、位置上报、日志收集等。特征:设备平台差异大、系统限制多、需平衡功能与功耗。

S: 设备状态向量
task_type: 任务类型 {CRITICAL, DEFERRABLE, SKIPPABLE}
P: 调度策略矩阵
action: 调度动作
WorkManager: Android后台任务调度框架
BackgroundTasks: iOS后台任务框架
Doze mode: Android省电模式

状态向量、策略矩阵、分类、调度

状态监听与策略选择、任务排队与执行

1. 状态监听:注册广播接收器监听电池、充电、网络、Doze状态变化,更新S
2. 任务提交:应用内部将后台任务封装为Task对象,指定其task_type,提交到任务调度器。
3. 策略决策:调度器根据当前Stask_type查询P,得到action
4. 任务执行
- 如果actionEXECUTE_NOW,立即将任务提交给线程池或系统调度框架执行。
- 如果actionDEFER,将任务放入延迟队列,并设置触发条件(如连接充电器、切换到Wi-Fi)。当条件满足时,从队列中取出任务执行。
- 如果actionSKIP,丢弃任务或仅记录日志。
5. 系统委托:对于需要系统调度的任务(如周期性同步),使用WorkManager设置约束条件(如充电中、网络 unmetered)。系统会在满足条件时自动调度任务。
6. Doze模式适应:在Android Doze模式下,使用setAndAllowWhileIdle设置闹钟,在维护窗口唤醒设备执行关键任务。网络请求使用JobScheduler的setRequiredNetworkType避免在Doze期间发起。
7. 自适应调整:收集任务执行结果和电量消耗数据,离线分析优化策略矩阵P

设备状态变化事件流(电池、网络等)驱动状态向量流S(t)更新。应用内产生的后台任务流携带类型标签,流入智能调度器。调度器根据当前的S(t)和任务类型,通过策略矩阵产生调度动作流。动作流将任务流分为立即执行流、延迟队列流和丢弃流。延迟队列流在条件满足时(如充电事件流)被释放为执行流。系统调度框架(如WorkManager)也接收部分任务流,并根据系统全局状态进行更底层的调度。

移动操作系统、后台任务管理、能耗优化

移动应用后台服务优化、IoT设备功耗管理

CPU: 状态监听和调度决策消耗极少量CPU。
传感器: 读取电池状态等系统信息。
网络: 合理调度减少蜂窝网络使用,节省射频能耗。
内存: 存储任务队列和状态。

CPU: 客户端轻量级计算。电池: 核心优化目标。操作系统: 深度利用系统提供的省电API和机制。

Chat-0096

移动端模型

安装包优化

Android App Bundle与资源混淆模型

动态功能模块与资源索引优化

目标:减少Android应用安装包(APK)的大小,加快下载和安装速度,并支持按需加载功能模块。
1. Android App Bundle(AAB):将应用拆分为基础模块和多个动态功能模块(Dynamic Feature Module)。Google Play根据目标设备的配置(语言、屏幕密度、ABI)生成优化的APK,只包含该设备需要的代码和资源。
2. 资源混淆:使用AndResGuard等工具对资源文件(图片、XML)名称进行短化混淆,减少resources.arsc的大小。映射关系:原资源名 -> 短名,如ic_launcher.png-> a.png
3. 代码混淆与优化:使用ProGuard或R8进行代码混淆、优化和压缩。移除未使用的代码(通过Tree Shaking),缩短类和成员名称。同时,启用D8编译器的脱糖(desugar)和优化。
4. 资源压缩:对图片进行WebP转换,有损压缩。使用矢量图(SVG, Vector Drawable)替代位图。启用PNG压缩工具(如pngquant)。

包体大小:最终生成的APK文件大小(下载大小和安装大小)。
安装时间:从下载完成到安装启动的时间。
功能模块加载延迟:动态功能模块按需加载的时间。

编译优化、资源管理、模块化

微信Android客户端安装包瘦身。特征:代码和资源庞大、需支持多ABI和多语言、动态功能交付。

AAB: Android App Bundle 包格式
base module: 基础模块,包含必需代码和资源
dynamic feature module: 动态功能模块,可按需下载
resources.arsc: 编译后的资源索引文件
ProGuard/R8: 代码混淆和优化工具
WebP: 图片格式,提供更好的压缩

模块划分、资源映射、代码树摇、图片压缩

构建配置、动态模块加载逻辑

1. 项目模块化:将应用代码重构,划分为一个base模块和多个dynamic feature模块。通过Gradle配置依赖关系。
2. 构建AAB:使用./gradlew bundle构建AAB文件。AAB包含所有代码、资源及其变体。
3. 上传与应用签名:将AAB上传到Google Play Console。Google Play对AAB进行签名,并针对每种设备配置生成优化的APK。
4. 按需交付:用户安装时,只下载基础APK。当用户访问某个动态功能(如“小程序”)时,应用通过Play Core库请求下载该模块:SplitInstallManager.startInstall()。下载完成后,模块代码和资源即可使用。
5. 资源混淆:在构建过程中,通过AndResGuard任务处理资源,生成混淆映射文件。
6. 代码优化:ProGuard/R8在编译过程中进行代码优化、混淆和压缩,生成较小的DEX文件。
7. 资源压缩:在构建流程中集成图片压缩工具,自动将PNG转换为WebP,或压缩PNG。
8. 结果分析:使用bundletool分析AAB,预估不同设备配置下的APK大小。

源代码和资源文件流经模块化构建流水线。基础模块和动态模块被分别编译、处理。资源文件流经过混淆、压缩转换。代码流经过混淆、优化、压缩。最终合并生成AAB流。Google Play服务器根据设备配置流,从AAB流中提取出必要的部分,生成定制化的APK流下发到设备。设备在运行时,根据需要触发动态模块下载流,从Play商店下载缺失的模块流并加载。

Android应用开发、构建优化、模块化

大型Android应用分发、Instant App

CPU: 构建过程中的代码优化和资源压缩消耗大量CPU。
网络: 更小的APK节省用户下载流量和时间。
存储: 设备上安装的应用占用更少存储空间。
内存: 运行时动态加载模块会增加一些内存开销。

CPU: 构建服务器需要强大CPU。网络: Google Play CDN需支持海量AAB拆分和APK分发。存储盘: 设备存储节省。

Chat-0097

后端模型

服务发现

分布式服务注册与健康检查模型

基于心跳的健康检查与负载均衡

目标:在微服务架构中,自动管理服务实例的注册与发现,实时监控实例健康状态,并为客户端提供可用的实例列表。
1. 服务注册:服务实例启动时,向服务注册中心(如Consul, Eureka, Nacos)注册自身信息,包括服务名、IP、端口、健康检查端点、元数据。注册信息通常包含租约(Lease),需要定期续约。
2. 健康检查:注册中心定期(如每5秒)向服务实例的健康检查端点(如/health)发起请求,或依赖客户端上报心跳。如果连续失败次数超过阈值,则将实例标记为不健康并从服务列表中剔除。
3. 服务发现:客户端(或API网关)向注册中心查询指定服务名的健康实例列表。客户端缓存该列表,并定期刷新。客户端使用负载均衡算法(如轮询、随机、最少连接)选择实例进行调用。
4. 变更通知:当服务实例列表变更(实例上线、下线)时,注册中心可以主动推送(如Watch机制)或由客户端定期拉取,确保客户端及时感知。

发现延迟:从实例上线/下线到客户端感知的时间。
健康检查准确性:正确判断实例健康状态的比例。
系统可用性:注册中心自身的高可用性。

服务发现、健康检查、负载均衡、最终一致性

微信内部微服务的服务注册与发现。特征:实例数量巨大、动态扩缩容、网络分区敏感。

ServiceInstance: 服务实例信息 {serviceName, ip, port, healthCheckUrl, metadata}
Lease: 租约,包含TTL(生存时间)
HealthCheck: 健康检查配置 {type: HTTP/TCP, interval, timeout, failuresThreshold}
ServiceRegistry: 服务注册中心
Watch: 监听机制,监听服务实例列表变化

租约、心跳、健康检查、列表、监听

注册/续约协议、健康检查流程

1. 实例启动:服务实例启动,读取配置,向ServiceRegistry发送注册请求,携带ServiceInstance信息和Lease(如TTL=30秒)。
2. 租约维持:实例启动一个后台线程,定期(如每10秒)向ServiceRegistry发送心跳(续约请求),重置租约TTL。
3. 健康检查ServiceRegistry根据配置的健康检查方式,定期对每个实例执行检查。对于HTTP检查,发送GET请求到healthCheckUrl,期望返回200 OK。如果连续失败次数达到failuresThreshold(如3次),则将实例标记为不健康,并从服务列表中移除(或置于隔离状态)。
4. 服务查询:客户端(如API网关)需要调用服务S,向ServiceRegistry查询S的健康实例列表。客户端缓存该列表。
5. 负载均衡调用:客户端从列表中选择一个实例(如轮询),发起RPC调用。
6. 变更感知:客户端在查询时,可以设置一个Watch。当S的实例列表发生变化时,ServiceRegistry会主动通知客户端,客户端更新本地缓存。
7. 实例下线:实例正常关闭时,发送注销请求到ServiceRegistry,从注册表中移除。如果实例异常崩溃,租约到期未续约,ServiceRegistry自动将其移除。

服务实例启动时,产生注册请求流到服务注册中心。注册中心记录实例信息,并启动健康检查流定期探测实例。实例维持心跳流以保持租约。客户端查询服务列表流,获得健康的实例列表流,并可能建立监听流。当实例健康状态变化或上下线时,注册中心产生变更事件流,通知监听客户端。客户端根据列表流,通过负载均衡算法产生具体的实例选择流,进行服务调用流。

微服务治理、服务网格、分布式系统

云原生应用服务发现、容器编排服务发现

CPU: 注册中心处理大量实例的心跳、健康检查和查询请求,消耗CPU。
内存: 存储所有服务实例的注册信息,数据量可能很大。
网络: 心跳、健康检查、变更通知产生持续的网络流量。
存储: 通常注册信息存储在内存中,可持久化到磁盘用于恢复。

CPU: 注册中心集群需要处理数千万实例的心跳和查询,CPU密集型。内存: 存储全量实例状态,需要数百GB内存。网络: 内部服务间发现请求和心跳流量巨大。存储盘: 持久化存储用于容灾。

Chat-0098

后端模型

消息队列

高可用消息队列与事务消息模型

基于分布式事务的消息最终一致性

目标:实现消息队列(如RocketMQ)的高可用和消息的可靠传递,支持事务消息(如分布式事务场景)。
1. 高可用架构:采用多副本(Replica)机制,每个分区(Partition)有多个副本,其中一个Leader负责读写,其他Follower从Leader同步数据。通过Raft等共识算法选举Leader,实现自动故障转移。
2. 消息可靠性:生产者发送消息时,可设置持久化级别(如acks=all),等待所有同步副本确认后才返回成功。消费者采用手动确认(ACK)机制,处理成功后提交消费位移(Offset),确保至少一次(at-least-once)语义。
3. 事务消息:支持分布式事务中的最终一致性。流程:
- 生产者发送“半消息”(Half Message)到Broker,Broker存储但不对消费者可见。
- 生产者执行本地事务,根据结果(提交/回滚)向Broker发送确认。
- 如果生产者未响应,Broker会回查生产者获取事务状态。根据确认或回查结果,将消息提交(对消费者可见)或丢弃。
4. 顺序消息:通过将需要顺序处理的消息发送到同一个分区,并由单个消费者顺序消费来保证。

消息可靠性:消息不丢失的概率(如99.999999%)。
事务消息成功率:事务消息最终成功提交的比例。
顺序消息保序:在分区内消息被顺序消费的比例。

消息队列、分布式事务、共识算法、顺序保证

微信支付交易消息、订单状态变更通知等需要高可靠、事务性的场景。特征:数据一致性要求高、需支持事务、顺序性。

Partition: 消息主题的分区
Replica: 分区副本,包括Leader和Follower
acks: 生产者确认机制(0,1,all)
Offset: 消费位移,表示已消费到的位置
Half Message: 事务消息的半消息状态
Transaction Check: 事务状态回查
Raft: 共识算法,用于副本Leader选举和数据同步

副本复制、共识、事务状态机、顺序消费

消息发送/消费协议、事务消息状态机

1. 生产者发送:生产者发送消息,指定Topic和Key。Broker根据Key哈希选择分区,将消息追加到Leader的日志文件,并同步到所有ISR(同步副本)后,向生产者返回ACK。
2. 消费者拉取:消费者从Broker拉取消息,处理成功后,提交消费Offset到Broker。如果处理失败,不提交Offset,下次可重新拉取。
3. 事务消息流程
- 生产者发送Half Message,Broker存储,返回消息ID。
- 生产者执行本地事务,得到本地事务状态(commit/rollback)。
- 生产者根据本地事务状态,向Broker发送Commit或Rollback请求(携带消息ID)。
- 如果Broker未收到确认,会定期向生产者发起事务回查,查询该消息的最终状态。
- Broker根据收到的确认或回查结果,将消息标记为可投递(提交)或删除(回滚)。
4. 顺序消费:生产者将需要顺序处理的消息设置相同的Key,使其路由到同一分区。消费者以单线程(或锁)顺序处理该分区的消息。
5. 故障转移:当Leader故障时,Raft协议触发选举,从Follower中选出新的Leader,继续提供服务。

生产者产生消息流,根据分区规则被路由到不同分区的Leader节点流。Leader将消息流复制到Follower节点流,达成共识后确认。消费者拉取消息流,处理成功后提交消费位移流。对于事务消息,半消息流先被持久化,然后触发本地事务执行流,根据结果产生确认流。如果缺乏确认,回查流会询问生产者状态。顺序消息需要保证同一键的消息流进入同一分区流,并由同一消费者顺序处理。

消息中间件、分布式系统、事务处理

金融交易消息、物流状态跟踪

CPU: Broker处理消息存储、复制、事务状态机消耗CPU。
内存: 使用PageCache缓存热点消息,提高读写性能。
存储: 消息日志文件需要高性能持久化存储(SSD)。
网络: 副本间数据同步、生产者/消费者与Broker通信消耗网络带宽。

CPU: 消息队列集群(Broker)需要多核高性能CPU处理网络和磁盘IO。内存: 大量PageCache提升吞吐,需数百GB内存。存储盘: 消息日志存储需PB级SSD/HDD,高吞吐。网络: 内部副本同步和外部客户端通信需超高带宽。

Chat-0099

后端模型

配置管理

分布式配置中心与动态刷新模型

配置版本管理与推送机制

目标:集中管理所有微服务的配置,支持配置的动态更新、版本回滚、灰度发布,并实时推送到服务实例。
1. 配置存储:配置以键值对形式存储,组织为命名空间(namespace)、数据ID(dataId)、分组(group)等多级结构。每个配置有版本号,使用Git或数据库存储,支持版本历史。
2. 客户端长轮询:客户端启动时拉取配置并缓存。之后,客户端发起长轮询请求,携带本地配置的MD5值或版本号。服务器比较客户端版本与最新版本,如果相同,则挂起请求(如30秒);如果不同,立即返回最新配置。如果在挂起期间配置有更新,也立即返回。
3. 动态刷新:客户端收到新配置后,解析并更新内存中的配置对象,并触发预先注册的配置变更监听器(Listener),使业务逻辑生效。对于Spring等框架,支持@RefreshScope自动刷新Bean。
4. 灰度发布:配置支持按IP、用户ID、标签等维度灰度发布。定义灰度规则,只有匹配规则的实例才会接收到新配置。

推送延迟:配置更新到所有客户端生效的时间(P99)。
一致性:最终一致,但在灰度发布期间,不同实例可能有不同配置。
可用性:配置中心故障时,客户端可使用本地缓存继续运行。

配置管理、版本控制、发布订阅、灰度发布

微信所有微服务的配置管理,如数据库连接、功能开关、超时时间。特征:配置项多、变更频繁、需精细控制、高可用。

namespace: 命名空间,用于环境隔离(dev, prod)
dataId: 配置的唯一标识
group: 配置分组
version: 配置版本号(如MD5)
长轮询: 客户端发起的挂起式查询
Listener: 配置变更监听器
灰度规则: 基于条件的配置发布规则

版本、长连接、监听、条件匹配

配置拉取/推送协议、灰度规则引擎

1. 客户端初始化:客户端启动,根据namespacedataIdgroup向配置中心发起HTTP请求,获取最新配置和version,并缓存。
2. 长轮询:客户端启动后台线程,循环执行:
- 发送长轮询请求,参数包括dataIdgroup和本地version
- 服务器比较version与最新版本,如果不同,立即返回新配置;否则,将请求挂起在队列中,设置超时时间(如30秒)。
- 如果在挂起期间配置有更新,服务器会查找挂起队列中匹配的请求,立即返回新配置。
- 客户端收到响应(可能是新配置或超时),如果是新配置,则更新本地缓存和version,并触发所有注册的Listener。然后继续下一轮轮询。
3. 管理员发布:在控制台修改配置并发布,生成新版本。
4. 灰度发布:管理员可定义灰度规则(如IP为10.0.0.1的实例)。配置中心在推送时,只将新配置推送给匹配规则的实例(通过长轮询响应)。
5. 回滚:如果需要,管理员可以将配置回滚到历史版本,流程同发布。

客户端启动时,触发配置初始化拉取流。之后,客户端持续发起长轮询请求流。配置变更事件流(管理员发布)到达服务器,服务器比较版本,将新配置流通过长轮询响应流推送给相关客户端。客户端收到新配置流,更新本地配置流,并触发监听器执行流。灰度发布时,配置变更流需要经过灰度规则过滤器,只对匹配的客户端流生效。

微服务配置、功能开关、持续交付

云原生配置管理、多环境配置

CPU: 配置中心处理大量长轮询连接和配置比较,消耗CPU。
内存: 存储配置内容、客户端长轮询上下文。
网络: 客户端与配置中心间的长连接消耗,推送时可能产生突发流量。
存储: 持久化配置数据,可使用数据库或分布式配置存储(如etcd)。

CPU: 配置中心集群需要处理海量长轮询连接。内存: 存储配置和连接上下文。网络: 内部服务与配置中心通信,需稳定。存储盘: 配置持久化存储,数据量不大但需高可用。

Chat-0100

后端模型

数据库优化

分布式数据库查询优化与执行模型

基于代价的查询优化(CBO)

目标:在分布式数据库(如TiDB)中,对复杂SQL查询选择最优的执行计划,最小化查询延迟和资源消耗。
1. 逻辑计划:SQL解析后生成抽象语法树(AST),转换为逻辑查询计划(关系代数表达式),包括选择(σ)、投影(π)、连接(⋈)、聚合(γ)等操作。
2. 物理计划:将逻辑计划转换为物理操作符(如TableScan, IndexScan, HashJoin, Sort)。对于一个逻辑操作,可能有多个物理实现,优化器需要选择。例如,连接操作有HashJoin、MergeJoin、IndexJoin等。
3. 代价模型:估算每个物理操作符的代价,包括CPU代价、I/O代价、网络代价。代价模型依赖于统计信息:表大小(行数)、列基数、数据分布直方图等。例如,HashJoin的代价 ≈ `C_build *

R

+ C_probe *

S

,其中

R

S

是表大小,C_buildC_probe`是单位行处理代价。
4. 搜索最优计划:使用动态规划(DP)或基于规则的搜索,在可能的计划空间中寻找总代价最小的计划。对于分布式数据库,还需考虑数据分区和网络传输。

查询性能:优化后查询的执行时间(P99)。
优化器耗时:生成执行计划的时间(应远小于执行时间)。
计划稳定性:相同查询在不同时间生成的计划是否一致(避免性能抖动)。

查询优化、关系代数、动态规划、统计信息

微信后台复杂报表查询、数据分析查询。特征:SQL复杂、数据量大、分布式环境、需快速响应。

AST: 抽象语法树
逻辑计划: 关系代数表达式树
物理操作符: 具体的执行算子(Scan, Join, Aggregate, Sort)
统计信息: 表的行数、列基数、直方图等
代价模型: 函数 Cost(operator) -> real
动态规划: 用于搜索最优计划的算法

Chat-0101

后端模型

搜索索引

倒排索引压缩与查询优化模型

倒排列表压缩(如FOR, PForDelta)与跳表

目标:对倒排索引进行高效压缩,减少存储空间和内存占用,并支持快速的交集、并集等集合操作。
1. 倒排列表:对于每个词项(term),其倒排列表是包含该词项的文档ID列表,通常按文档ID升序排列。列表可能还包含词频、位置等信息。
2. 压缩算法:利用文档ID的单调递增特性,存储差值(d-gap)而不是原始ID。然后对差值序列进行压缩。常用算法:
- FOR(Frame Of Reference):将差值序列分块(如128个值一块),每块内差值用固定位数存储,位数由块内最大值决定。节省存储和加速解码。
- PForDelta(Patched Frame of Delta):类似FOR,但允许少数异常值(outlier)使用更多位数,其他值使用公共位数,提高压缩率。
3. 跳表:在压缩的倒排列表中插入跳表指针,允许在遍历时跳过一些元素,加速两个列表的交集操作(如AND查询)。跳表间隔为√n,其中n是列表长度。
4. 查询优化:对多个词项的倒排列表求交集时,先对最短的列表进行遍历,并用跳表加速在其他列表中的查找。使用位图(Bitmap)对高频词进行加速。

压缩率:压缩后大小与原大小的比例(如<20%)。
解码速度:从压缩数据中还原出原始ID列表的速度(纳秒/ID)。
查询吞吐:每秒可处理的查询数。

信息检索、数据压缩、算法优化

微信“搜一搜”的倒排索引存储与查询。特征:索引巨大、查询延迟要求低、需高效内存利用。

倒排列表: 文档ID的有序列表 [d1, d2, ..., dn]
d-gap: 文档ID的差值序列 [d1, d2-d1, ..., dn-d_{n-1}]
FOR: 分块存储,每块有公共位数
PForDelta: 分块存储,支持异常值
跳表: 跳跃指针,间隔为k
Bitmap: 位图,用于表示文档存在性

序列、差值、分块、压缩、跳表

压缩与解压算法、交集求交算法

1. 索引构建:对每个词项,收集其出现的文档ID,排序,计算d-gap序列。
2. 压缩:对d-gap序列分块(如128个值一块)。对每块,使用PForDelta算法:
- 选择b位,使得该块中大部分(如90%)的d-gap值可以用b位表示。
- 对每个值,如果值 < 2^b,用b位存储;否则作为异常值,用更多位存储(如32位),并记录异常值的位置。
- 存储块头(包含b、异常值数量等)和压缩后的数据。
3. 添加跳表:在压缩列表上,每隔k = floor(√n)个文档ID插入一个跳表指针,指向下一个跳表节点在压缩数据中的位置。
4. 查询处理:对查询词项,获取其压缩的倒排列表。如果需要求交集,选择最短的列表A,解压(或遍历)其文档ID,同时用跳表加速在另一个列表B中的查找。对于A中的每个ID,在B中利用跳表快速定位到可能的位置,然后顺序查找。
5. 结果合并:对多个列表的交集结果,进行排序、分页等后处理。

文档被索引时,产生词项-文档ID对流。索引构建器按词项聚合,生成倒排列表流。压缩器对每个倒排列表流进行d-gap转换和分块压缩,产生压缩的倒排列表流。查询时,查询词项流触发倒排列表加载流。解压器根据需要解压列表流。求交算法对多个解压后的列表流(或压缩流)进行合并,产生结果文档流。跳表指针流用于加速列表遍历流。

搜索引擎、数据压缩、算法

全文检索引擎、日志分析

CPU: 压缩和解压操作消耗CPU,查询时的交集计算也消耗CPU。
内存: 压缩后的索引可以部分或全部加载到内存,减少I/O。
存储: 压缩索引存储在磁盘或SSD上。
I/O: 如果索引不能完全放在内存,需要磁盘I/O。

CPU: 搜索集群需要大量CPU进行实时解压和求交计算。内存: 索引常驻内存,需TB级内存。存储盘: 全量索引存储在SSD上,容量PB级。网络: 分布式搜索时的网络通信。

Chat-0102

后端模型

推荐系统

多目标排序与混合推荐模型

多臂赌博机(MAB)与上下文感知

目标:在推荐系统中,同时优化点击率、停留时长、转发、评论等多个目标,并处理新物品的冷启动问题。
1. 多目标模型:使用多任务学习(如MMoE)同时预测多个目标 y = [y_ctr, y_vtr, y_share, ...]。每个目标对应一个塔网络,共享底层特征。损失函数为各任务损失的加权和。
2. 分数融合:将多目标预测分融合为最终效用分:U = Σ_i w_i * f_i(y_i),其中w_i为权重,f_i为校准函数(如log)。权重可通过在线学习或人工设定。
3. 探索与利用:使用上下文多臂赌博机(Contextual Bandit)如LinUCB或Thompson Sampling,平衡探索(推荐新物品以收集反馈)和利用(推荐已知高收益物品)。对于新物品,给予更高的探索概率。
4. 混合推荐:结合多种召回策略:协同过滤、基于内容、热门、地理位置等。将各召回通道的结果混合,送入精排模型。

多目标AUC:各预测目标的离线AUC。
在线业务指标:CTR、人均停留时长、互动率等。
探索效率:新物品获得足够曝光以产生准确评估的速度。

推荐系统、多目标学习、Bandit算法、混合推荐

微信视频号、看一看信息流的推荐。特征:多目标、物品更新快、需处理冷启动。

y_i: 第i个目标的预测值
w_i: 第i个目标的融合权重
f_i: 校准函数
Contextual Bandit: 上下文赌博机算法
LinUCB: 线性上置信界算法
召回通道: 多种物品来源(CF, Content-based, Popular)
精排: 精细排序模型

多目标、加权和、探索利用、混合

推荐系统流程、Bandit算法更新

1. 召回:从多个召回通道获取候选物品集合,每个通道返回数百个物品。
2. 精排:对候选物品,提取用户、物品、上下文特征,输入多任务模型,得到多目标预测分。融合得到最终效用分U,排序取Top-K。
3. 探索:对排序后的列表,使用Bandit算法决定是否用新物品替换其中的某些位置。例如,对每个位置,以概率ε随机选择一个新物品(探索),否则选择原物品(利用)。
4. 展示与反馈:将最终的推荐列表展示给用户,收集点击、停留、互动等反馈。
5. 模型更新:使用反馈日志更新精排模型(在线学习或定期离线训练)。同时,更新Bandit算法的参数:对于LinUCB,更新每个物品的特征权重向量。
6. 冷启动处理:新物品通过基于内容的通道召回,或给予较高的探索概率。使用物品的属性特征作为Bandit的上下文。

用户请求流触发多个召回通道流,产生候选物品流。特征工程流为用户和物品提取特征流。多目标模型对每个候选物品产生多目标预测流,融合为效用分流。Bandit探索模块可能对排序后的列表流进行调整,插入探索物品流。最终列表流展示给用户,产生用户反馈流。反馈流用于更新模型参数流和Bandit状态流。

机器学习、推荐算法、在线学习

新闻推荐、电商推荐

CPU/GPU: 精排模型推理需要GPU加速。离线训练需要大规模GPU集群。
内存: 特征存储和模型参数占用大量内存。
网络: 特征获取和模型服务间需低延迟网络。
存储: 存储用户行为日志、模型参数、物品特征。

CPU/GPU: 在线推理集群需要数千张GPU卡。训练集群需要数百张高端GPU。内存: 特征服务和模型服务需要TB级内存。网络: 特征传输需超高带宽RDMA网络。存储盘: 行为日志和特征存储达PB级。

Chat-0103

后端模型

广告系统

实时竞价与广告排序模型

广义第二价格拍卖与点击率预估

目标:在广告拍卖中,根据广告主的出价和预估点击率(CTR)对广告进行排序和计价,最大化平台收入和用户体验。
1. 广告排序:对于每个广告位,候选广告的排序得分通常为 score = bid * pCTR^α,其中bid是广告主出价,pCTR是预估点击率,α是调整参数(如1)。按score降序排序。
2. 计价机制:采用广义第二价格(GSP)拍卖。赢得第i个广告位的广告主,其每次点击支付的价格为:price_i = (bid_{i+1} * pCTR_{i+1}^α) / pCTR_i^α + δ,其中δ为最小加价(如0.01)。确保激励相容和平台收益。
3. 点击率预估:使用机器学习模型(如DeepFM)实时预估广告在特定上下文(用户、页面)下的点击率。特征包括用户画像、广告内容、上下文信息。模型需要在线学习以适应数据分布变化。
4. 预算控制:广告主有每日预算。在拍卖时,需检查广告主剩余预算,如果不足以支付一次点击,则可能不参与竞价或降低展示概率。使用平滑预算控制策略,如Pacing,控制广告展示速度。

平台收入:广告拍卖产生的总收入(RPM)。
用户体验:广告点击率、相关度(避免用户反感)。
广告主ROI:广告主的投入产出比。

拍卖理论、机器学习、预算控制

微信朋友圈广告、公众号广告。特征:实时竞价、需平衡收入与体验、广告主预算约束。

bid: 广告主出价(每次点击费用,CPC)
pCTR: 预估点击率
α: 排序公式中的调权参数
GSP: 广义第二价格拍卖
price_i: 第i位广告的实际每次点击费用
δ: 最小加价
budget: 广告主每日预算
Pacing: 预算平滑控制策略

拍卖、排序、计价、预算控制

广告拍卖流程、预算控制算法

1. 广告请求:当用户打开页面,向广告服务器发送请求,携带用户ID、上下文等信息。
2. 广告检索:根据用户标签和上下文,从广告索引中检索符合条件的候选广告,过滤掉预算不足、已过期的广告。
3. 点击率预估:对候选广告,实时计算pCTR(通过模型推理)。
4. 排序与计价:计算每个广告的score = bid * pCTR,按score降序排序。对前K个广告位,计算其实际点击价格price_i(GSP)。
5. 预算检查与调整:检查赢得展示的广告主剩余预算是否足够支付本次展示的期望成本(price_i * pCTR)。如果不足,可能将其移出获胜列表。使用Pacing算法调整广告的参拍概率,使其预算平滑消耗。
6. 广告返回:将获胜的广告创意、价格等返回给前端展示。
7. 计费与反馈:当用户点击广告时,按price_i对广告主计费,并扣除预算。点击和展示日志反馈给CTR模型用于在线学习。

广告请求流触发广告检索流,产生候选广告流。CTR预估模型对候选广告流产生pCTR流。结合出价流,计算排序分流,排序选出胜出广告流。计价模块根据GSP规则计算实际扣费流。预算控制模块检查广告主流预算,可能过滤掉部分广告流。最终胜出广告流返回给前端展示。用户行为(展示、点击)流反馈回系统,用于更新CTR模型流和预算状态流。

计算广告、拍卖机制、机器学习

搜索引擎广告、展示广告

CPU/GPU: CTR模型推理需要GPU加速,高并发时需求大。
内存: 广告索引、模型参数、预算状态常驻内存。
网络: 广告请求和返回需要低延迟,内部特征获取也需要网络。
存储: 存储广告创意、日志、预算数据。

CPU/GPU: 广告引擎需要大量GPU进行实时CTR预估。内存: 广告索引和模型需要TB级内存。网络: 高并发广告请求处理需要高带宽。存储盘: 广告日志存储巨大。

Chat-0104

后端模型

支付系统

分布式账本与对账模型

双缓冲区事务与异步对账

目标:在支付系统中,保证跨账户转账的原子性和一致性,并通过异步对账确保数据最终一致。
1. 双缓冲区事务:每个账户有balance(余额)和pending(在途金额)两个字段。转账时,从付款方balance扣除,并添加到收款方pending。事务提交后,将收款方pending移动到balance。如果在中间步骤失败,可以通过冲正事务回滚。
2. 事务日志:所有转账操作记录到事务日志(WAL),包含事务ID、账户、金额、状态(进行中、已提交、已冲正)。用于故障恢复和审计。
3. 异步对账:每日(T+1)将支付系统的流水与银行/第三方支付机构的流水进行比对。对账文件包含交易号、金额、状态。对账核心是找到两边都能匹配的记录(对平),和不能匹配的记录(差错)。
4. 差错处理:对不平的记录生成差错单,可能的原因包括:支付成功但银行未成功(需补单)、银行成功但支付系统未成功(需补录)、金额不一致等。自动或人工处理。

数据一致性:转账后账户余额总和不变(原子性)。
对账准确率:正确识别不一致交易的比例。
差错处理效率:自动处理差错的比例。

分布式事务、账务系统、对账

微信支付转账、红包、商户结算。特征:资金安全第一、高并发、强一致性要求。

balance: 账户可用余额
pending: 在途金额(已收到但未入账)
事务日志: 转账操作记录,用于原子性和持久性
对账文件: 支付方和银行方提供的交易流水文件
差错单: 对账不一致的记录,需要处理

事务、日志、对账、差错处理

转账事务流程、对账比对逻辑

1. 转账开始:生成全局事务ID txid,写入事务日志,状态为BEGIN
2. 扣款:对付款方A,执行balance_A = balance_A - amount,如果balance_A不足则失败。将amount记录到A的pending(表示资金转出中)。
3. 收款:对收款方B,执行pending_B = pending_B + amount
4. 提交:更新事务日志状态为COMMIT。然后,将B的pending_B清零,balance_B = balance_B + amount。A的pending清零。
5. 冲正:如果在步骤2-4任何一步失败,将事务日志状态置为ROLLBACK,并执行冲正操作:恢复A的balance(如果已扣款),清零pending
6. 对账:每日凌晨,从支付系统导出交易流水文件F_pay,从银行获取对账文件F_bank。逐行比对F_payF_bank,以交易号为主键,匹配金额和状态。对平记录标记为成功。未能匹配的记录生成差错单。
7. 差错处理:对于“支付成功银行失败”的差错,尝试向银行查询确认,如确实失败则冲正。对于“银行成功支付失败”的差错,在支付系统补录交易。

转账请求流进入支付系统,生成事务日志流。系统对付款账户执行扣款流,对收款账户执行待入账流,然后提交事务流,完成余额更新流。对账任务定时触发,拉取支付系统流水流和银行流水流,进行比对流,产生对平记录流和差错记录流。差错记录流进入差错处理流水线,可能触发冲正流或补录流。

金融系统、账务核心、对账系统

银行核心系统、第三方支付

CPU: 转账事务处理、对账比对消耗CPU。
内存: 账户余额和事务状态缓存。
存储: 事务日志、账户流水、对账文件需要持久化存储。
网络: 与银行接口通信。

CPU: 支付核心系统需要高TPS处理能力。内存: 热点账户缓存。存储盘: 事务日志和流水存储需高可靠,容量大。网络: 与银行专线网络。

Chat-0105

后端模型

安全防护

入侵检测与异常行为分析模型

基于机器学习的异常检测

目标:实时检测服务器上的异常行为(如恶意登录、异常文件访问、可疑进程),防止黑客入侵和数据泄露。
1. 数据采集:从服务器采集多种日志和数据源:系统日志(syslog)、认证日志(auth.log)、网络连接(netstat)、进程列表(ps)、文件完整性监控(AIDE)。
2. 特征工程:从原始日志中提取特征,例如:
- 登录特征:失败次数、来源IP地理异常、非工作时间登录。
- 进程特征:陌生进程、进程命令行参数异常。
- 网络特征:异常出向连接、端口扫描模式。
3. 异常检测模型:使用无监督学习算法(如Isolation Forest, One-Class SVM)对正常行为建模,检测偏离模型的异常。Isolation Forest通过随机划分隔离样本,异常点容易被隔离,路径长度较短。异常分数:s(x, n) = 2^{-E(h(x))/c(n)},其中h(x)是样本x在树中的路径长度,c(n)是平均路径长度。
4. 告警与响应:对检测到的异常生成告警,并自动或人工触发响应动作,如封锁IP、终止进程、通知安全人员。

检测率:正确识别入侵行为的比例(召回率)。
误报率:正常行为被误判为异常的比例。
响应时间:从异常发生到告警的时间。

网络安全、异常检测、机器学习

微信服务器安全监控、内部网络入侵检测。特征:数据源多、需低误报、实时性要求高。

日志源: 系统日志、认证日志、网络日志等
特征向量: 从日志中提取的数值特征表示
Isolation Forest: 隔离森林算法,用于异常检测
h(x): 样本x在随机树中的路径长度
c(n): 给定样本数n时的平均路径长度
s(x, n): 异常分数,越接近1越异常
告警阈值: 判定异常的最低分数

特征提取、隔离森林、异常分数、阈值

日志收集与特征提取流程、异常检测与告警

1. 日志收集:通过Agent或中心式日志收集器(如Fluentd)实时收集服务器各类日志,发送到安全分析平台。
2. 特征提取:对日志进行解析,提取预定义的特征。例如,对登录日志,统计每个IP在过去1小时的失败登录次数;对进程日志,检查进程名是否在白名单外。
3. 模型推理:将特征向量输入已训练的Isolation Forest模型,得到异常分数s。如果s > threshold,则标记为异常。
4. 告警生成:对异常事件,根据严重程度(分数)生成不同等级的告警。告警信息包含时间、主机、异常类型、证据(相关日志)。
5. 自动响应:对于高危告警(如暴力破解成功),自动触发响应脚本,封锁来源IP,并通知安全人员。
6. 模型更新:定期使用新的正常样本重新训练模型,适应环境变化。对于误报和漏报,进行样本标注,加入训练集优化模型。

服务器各类日志流被实时收集,汇聚到安全分析平台。平台对日志流进行解析和特征提取,产生特征向量流。特征向量流输入异常检测模型流,产生异常分数流。分数流与阈值比较,产生异常事件流。异常事件流触发告警流和可能的自动响应流(如封锁IP流)。安全人员处理告警流,反馈结果用于模型优化流。

安全信息与事件管理、威胁检测

企业安全运营中心、云安全

CPU: 特征提取和模型推理消耗CPU,特别是高日志量时。
内存: 存储模型和特征状态。
网络: 日志收集产生内部网络流量。
存储: 存储历史日志用于调查和模型训练。

CPU: 安全分析平台需要大量CPU进行实时检测。内存: 模型和特征缓存。网络: 日志收集网络带宽大。存储盘: 日志存储量巨大,需长期保留。

Chat-0106

后端模型

运维管理

智能告警压缩与根因分析模型

告警聚类与时间序列相关性分析

目标:在监控系统中,对大量告警进行压缩、去重、关联,减少告警风暴,并自动分析根因,加速故障定位。
1. 告警压缩:对相似告警进行聚类。定义告警相似度:`sim(A, B) = w1 * Jaccard(label_A, label_B) + w2 * exp(-

t_A - t_B

/τ),其中label是告警标签(如host, service, metric),t是时间,τ`是时间衰减常数。使用层次聚类将相似告警聚为一组,对外只展示一个聚合告警,并注明数量。
2. 告警抑制:定义抑制规则,如“如果主机宕机,则抑制该主机上的所有服务告警”。通过规则引擎匹配,减少冗余告警。
3. 根因分析:对告警涉及的时间序列指标(如CPU、内存、错误率)进行相关性分析。计算两两指标之间的相关系数(如Pearson)。构建指标相关图,找到可能的核心故障指标(通常是与最多其他指标相关的那个)。
4. 告警派发:根据根因分析结果,将告警派发给合适的负责人(如服务Owner),并附上可能的根因和建议操作。

告警压缩率:压缩后告警数量与原数量比例(目标<10%)。
根因准确率:自动分析的根因与实际根因一致的比例。
MTTD:平均故障发现时间(Mean Time To Detect)。

运维、告警管理、聚类、相关性分析

微信后台监控告警处理,避免告警风暴,加速故障定位。特征:告警量大、需降噪、关联分析。

告警A: 包含时间、标签、指标、值等信息
相似度函数sim: 计算两个告警的相似度
聚类: 将相似告警分组
抑制规则: 条件-动作规则,用于抑制冗余告警
相关系数: 指标间相关程度,如Pearson系数
根因指标: 可能引发其他指标异常的核心指标

相似度、聚类、抑制、相关性、图

告警处理流水线、根因分析算法

1. 告警接收:监控系统(如Prometheus Alertmanager)接收到原始告警流。
2. 告警分组:根据标签(如cluster, service)将告警预分组,同一组的告警进入后续处理。
3. 告警压缩:对每组内的告警,计算两两相似度,进行层次聚类。将距离小于阈值的告警合并为一个聚合告警,记录数量、最早和最晚时间。
4. 告警抑制:运行抑制规则引擎。例如,如果存在host_down告警,则删除同一主机上的high_cpuhigh_memory等告警。
5. 根因分析:对压缩后的告警,获取其关联的指标时间序列(如告警前1小时)。计算这些指标间的相关系数矩阵。构建图,节点是指标,边是相关系数(绝对值>阈值)。找到度数最高的节点作为候选根因指标。
6. 告警丰富:将聚合告警与根因分析结果结合,生成富化告警,包含可能的原因和建议。
7. 通知派发:根据告警标签(如service)找到对应的负责人(on-call),通过多种渠道(短信、电话、IM)发送告警。

原始告警流从监控系统流入告警处理引擎。引擎首先对告警流进行分组流。每组内的告警流经过相似度计算和聚类,被压缩为聚合告警流。抑制规则引擎对聚合告警流进行过滤,产生抑制后告警流。根因分析模块获取相关指标流,计算相关性,输出根因分析结果流。最终,告警流与根因结果流合并,被派发给相应的负责人流。

可观测性、事件管理、故障排除

IT运维、云监控

Chat-0107

后端模型

测试部署

蓝绿部署与金丝雀发布模型

流量切分与渐进式交付

目标:实现应用新版本的无缝发布,最小化发布风险,支持快速回滚。
1. 蓝绿部署:维护两套完全独立的生产环境:蓝环境(当前版本)和绿环境(新版本)。发布时,将流量从蓝环境切换到绿环境。如果绿环境运行正常,则发布成功;如果发现问题,将流量切回蓝环境,实现快速回滚。
2. 金丝雀发布:将新版本先部署到一小部分用户(如2%),监控其性能和错误率。如果一切正常,逐步扩大流量比例(如10%、50%、100%)。如果有问题,只影响少量用户,并快速回滚。
3. 流量切分:在负载均衡器(如Nginx, Envoy)层面,根据请求特征(如Cookie、Header、用户ID哈希)将流量按比例路由到不同版本。例如,user_id % 100 < 5的用户路由到新版本。
4. 监控与决策:发布过程中,密切监控新版本的业务指标(错误率、延迟、吞吐)和系统指标(CPU、内存)。如果指标异常,自动或手动触发回滚。

发布成功率:新版本成功全量发布的比例。
回滚时间:从决定回滚到流量全部切回旧版本的时间(目标<1分钟)。
用户影响:发布过程中受影响用户的比例和时长。

部署策略、流量管理、渐进式交付

微信后台服务、小程序后端的发布。特征:服务多、用户量大、需保证高可用、快速迭代。

蓝环境: 当前生产版本的环境
绿环境: 新版本的环境
流量比例: 路由到新版本的请求百分比
金丝雀: 小部分用户流量用于测试新版本
监控指标: 用于判断发布健康度的指标(错误率、延迟等)
回滚: 将流量切回旧版本的操作

环境、流量比例、监控、决策

发布流程、流量切换规则

1. 环境准备:搭建与蓝环境相同的绿环境,部署新版本代码,进行冒烟测试。
2. 金丝雀发布:在负载均衡器配置路由规则,将一小部分流量(如2%)定向到绿环境。监控绿环境的指标。
3. 逐步放量:如果金丝雀阶段指标正常,逐步增加流量比例(如10%、50%)。每个阶段持续观察一段时间(如15分钟)。
4. 全量切换:当流量达到100%且运行稳定,发布完成。此时绿环境成为新的蓝环境。
5. 回滚:如果在任何阶段监控到异常(如错误率超过阈值),立即将流量切回蓝环境。同时,保留现场(绿环境)用于问题排查。
6. 清理:发布成功后,可以下线旧版本的蓝环境,释放资源。

新版本代码流被部署到绿环境。负载均衡器根据配置的流量比例规则,将用户请求流分为两部分:大部分流向蓝环境流,小部分流向绿环境流。监控系统持续采集两个环境的指标流。发布决策引擎比较指标流,如果绿环境指标流正常,则逐步调大流向绿环境的流量比例流,直到完全切换。如果绿环境指标流异常,则触发回滚,将流量流全部导向蓝环境。

持续交付、部署策略、流量工程

云原生应用发布、微服务发布

计算资源: 需要额外的计算资源运行绿环境,成本增加。
负载均衡: 负载均衡器需支持动态流量路由。
监控: 需要强大的实时监控系统支持发布决策。
数据库: 需要考虑数据库兼容性和回滚脚本。

基础设施: 需要额外的服务器资源用于绿环境。负载均衡器: 需要支持动态路由的负载均衡集群。监控系统: 需要实时监控和告警。

Chat-0108

后端模型

混沌工程

故障注入与系统韧性评估模型

故障编排与爆炸半径控制

目标:通过受控的实验,主动向系统注入故障,验证系统的容错能力和恢复能力,提前发现弱点。
1. 故障模型:定义可注入的故障类型,如:网络延迟、丢包、服务宕机、CPU满载、磁盘满、IO延迟等。每个故障有参数(如延迟时间、丢包率)。
2. 实验编排:定义实验范围(爆炸半径),例如特定服务、可用区。编排故障注入的顺序和时长。实验假设:如“注入数据库延迟后,服务应降级,不应雪崩”。
3. 安全机制:设置实验停止条件,如系统错误率>5%或关键服务不可用。当触发条件时,自动停止故障注入,并尝试恢复。
4. 韧性评估:比较实验期间与基线期间的业务指标(错误率、延迟、吞吐)和系统指标。计算韧性分数,如服务可用性 A = (1 - error_rate) * 100%

实验安全性:故障注入未造成不可控影响或业务损失。
问题发现率:通过实验发现的系统缺陷数量。
恢复验证:故障停止后,系统指标恢复正常的速度。

混沌工程、故障注入、系统可靠性

微信后台微服务常态化的故障演练,提升系统韧性。特征:主动制造故障、需精细控制、强依赖监控。

故障类型: 网络、服务、资源等故障
爆炸半径: 实验影响的范围(如集群、服务)
实验假设: 对系统行为的预期
停止条件: 触发实验终止的监控阈值
韧性评估: 量化系统容错能力的指标

故障模型、实验设计、安全边界、评估指标

实验执行流程、安全控制规则

1. 实验设计:在混沌工程平台创建实验,选择故障类型、目标、持续时间和监控指标。
2. 前置检查:检查实验目标是否包含核心服务,是否在业务低峰期。检查监控系统是否正常。
3. 故障注入:通过混沌工程工具(如ChaosBlade)在目标机器上执行故障注入命令。例如,注入网络延迟:tc qdisc add dev eth0 root netem delay 100ms
4. 监控与观察:实验期间,持续采集业务和系统指标。控制台实时展示指标变化,并与基线对比。
5. 安全熔断:实时计算错误率等关键指标。如果任何指标超过停止条件,自动触发中止程序,停止故障注入,并尝试恢复(如重启服务)。
6. 实验分析:实验结束后,生成报告。对比故障前后指标,验证假设。记录发现的问题和后续改进项。
7. 复盘与改进:针对演练暴露的问题,优化系统架构、配置或应急预案。

混沌实验控制流启动,根据实验定义,生成故障注入指令流,作用于目标系统组件。系统在故障影响下,其内部状态流和外部请求处理流发生变化,反映在各项监控指标流上。监控流被实时采集并与基线流比较。安全监控流持续判断是否触发熔断,若触发则发送停止注入流。实验分析模块收集所有相关数据流,产出韧性评估报告流。这是一个典型的“刺激-观测-反馈”控制流。

可靠性工程、实验科学、系统测试

金融系统容灾演练、云服务SLA验证

CPU: 故障注入工具和执行器消耗少量CPU。
网络: 网络故障注入可能修改网络包路径。
监控系统: 承载实验期间的高频指标采集和查询压力。
控制平面: 实验编排和安全管理需要可靠的服务。

CPU: 混沌工程控制平台和代理需要计算资源。网络: 需隔离的实验环境网络。监控系统: 需要强大的实时监控和告警系统支持。

Chat-0109

后端模型

全链路压测

数据隔离与流量影子模型

流量复制与影子数据存储

目标:模拟真实的生产流量,对系统进行全链路压力测试,准确评估系统容量和瓶颈,而不影响线上真实数据。
1. 流量复制:在生产环境入口(如网关)复制一份实时流量到压测集群。复制比例可调(如10%)。复制时,对请求进行标记(如添加HTTP头X-Test: shadow)。
2. 数据隔离:压测流量使用“影子”存储。在中间件和数据库层面,通过识别流量标记,将压测流量的读写操作路由到独立的影子表或影子库。影子库结构与生产库一致,但数据可清理。
3. 中间件识别:RPC框架、消息队列、缓存客户端需支持流量标记的传递和识别。例如,Dubbo的attachment传递标记;Redis客户端将压测键添加前缀shadow_
4. 结果评估:压测过程中,监控压测集群的各项资源指标(CPU、内存、IO、网络)和应用指标(QPS、延迟、错误率)。通过逐步增加流量,绘制系统性能曲线,找到瓶颈点。

数据隔离性:压测流量零污染生产数据。
流量真实性:复制的流量能代表真实用户行为模式。
容量评估准确性:找出的系统瓶颈与实际相符。

压力测试、流量仿真、数据隔离

微信重大活动(如春晚红包)前的全链路压测。特征:需模拟真实负载、不能影响线上、需全面覆盖。

流量复制比例: 复制线上流量的百分比(0~1)
X-Test: shadow: 压测流量标记
影子库/表: 用于承载压测数据的数据

编号

类别

领域

模型配方

定理/公式/算法/模型/方法名称

定理/公式/算法/模型/方法的逐步思考推理过程及每一个步骤的数学方程式和参数选择/参数优化

精度/密度/误差/强度

底层规律/理论定理

典型应用场景和各类特征

变量/常量/参数列表及说明

数学特征

语言特征

时序和交互流程的所有细节/分步骤时序情况及数学方程式

流动模型和流向方法的数学描述

理论基础

工业/信息化/数字化/制造工程/控制工程/自动化工程基础

芯片/硬件的调用情况和数据/信号在硬件中的流动情况和流向和执行

满足40亿用户并发的CPU/GPU/时钟/队列/信令/缓存/队列/网络/带宽/内存/缓存/指令集/存储盘需求

Chat-0109

后端模型

缓存策略

分布式缓存淘汰与一致性模型

LRU-K与布隆过滤器防穿透

目标:在分布式缓存(如Redis集群)中,高效管理内存,淘汰低价值数据,并防止缓存穿透、击穿、雪崩。
1. LRU-K淘汰策略:记录每个缓存项最近K次访问的时间戳。当需要淘汰时,选择backward k-distance最大的项,即当前时间与第K次最近访问时间差最大的项。公式:B(K) = now - timestamp_K。这比传统LRU更能识别长期冷数据。
2. 布隆过滤器防穿透:对于数据库查询,先经过布隆过滤器(Bloom Filter)。布隆过滤器是一个位数组B[m]和k个哈希函数。添加元素x:for i in 1..k: B[hash_i(x) mod m] = 1。查询y:如果所有B[hash_i(y) mod m]都为1,则可能存在;否则肯定不存在。用于拦截不存在key的查询,防止直接压垮数据库。
3. 缓存一致性:采用“先更新数据库,再删除缓存”策略。为避免删除失败,设置缓存过期时间作为兜底。对于热点key,使用互斥锁(Mutex)防止击穿:只有一个线程回源数据库,其他线程等待。
4. 集群分片:数据通过一致性哈希分片到多个Redis节点。节点故障时,通过副本(replica)和自动故障转移保证可用性。

缓存命中率:请求命中缓存的比例(如>95%)。
内存利用率:有效数据占用的内存比例。
穿透防护率:布隆过滤器拦截不存在查询的比例。

缓存算法、概率数据结构、分布式一致性

微信朋友圈、公众号文章等热点数据的缓存。特征:读多写少、数据规模大、需高可用、低延迟。

B(K): LRU-K中的后向K距离
timestamp_K: 第K次最近访问时间戳
B[m]: 布隆过滤器位数组,长度m
k: 布隆过滤器哈希函数个数
hash_i: 第i个哈希函数
一致性哈希环: 用于数据分片和节点定位

时间序列、概率、哈希、距离

缓存访问与淘汰逻辑、布隆过滤器查询逻辑

1. 缓存读取:客户端请求key,先查询本地缓存(如Guava),未命中则查询Redis集群。通过一致性哈希定位节点。
2. 缓存命中:如果Redis中存在且未过期,返回数据,并更新LRU-K时间戳列表(将当前时间加入队列,保持最近K次)。
3. 缓存未命中:先查询布隆过滤器(可能内嵌在客户端或Redis模块)。如果布隆过滤器返回“不存在”,直接返回空,避免查询数据库。如果返回“可能存在”,则继续。
4. 回源加载:对热点key加分布式锁(如Redis SETNX),只有一个线程回源数据库,查询结果写入Redis并设置过期时间,同时更新布隆过滤器(添加该key)。其他线程轮询或等待锁释放后读取缓存。
5. 缓存淘汰:Redis内存达到阈值时,触发淘汰策略。对每个key计算B(K),选择值最大的key淘汰。定期扫描过期key并删除。
6. 缓存更新:数据变更时,先更新数据库,然后删除Redis中对应的key。如果删除失败,记录日志,依赖过期时间最终一致。

客户端请求流先到达缓存代理层。缓存查询流根据key哈希到对应的Redis节点流。节点内,缓存命中流返回数据并更新元数据流;缓存未命中流触发布隆过滤器查询流。如果过滤器拦截流,直接返回空流;否则,触发回源数据库流,结果流写入缓存并更新过滤器。淘汰任务流定期扫描内存,计算淘汰分数流,移除低价值数据流。数据更新流触发数据库更新流和缓存删除流。

计算机体系结构、分布式系统、概率论

高并发Web应用缓存、CDN缓存

CPU: 缓存逻辑处理、哈希计算、锁操作消耗CPU。
内存: 缓存数据、布隆过滤器位数组、LRU-K元数据占用内存。
网络: 缓存集群内部数据同步、客户端与缓存通信消耗带宽。
存储: Redis数据持久化到磁盘。

CPU: 缓存集群需要多核CPU处理高并发请求。内存: 缓存数据需要TB级内存。网络: 缓存节点间同步和客户端访问需要高带宽。存储盘: 持久化存储需要SSD。

Chat-0110

算法模型

图学习

图神经网络节点分类与链接预测模型

图卷积网络(GCN)与注意力机制

目标:在图结构数据(如社交网络、知识图谱)上,学习节点和边的表示,用于节点分类、链接预测等任务。
1. 图卷积网络(GCN):每一层通过聚合邻居特征来更新节点表示。公式:H^{(l+1)} = σ(Ã H^{(l)} W^{(l)}),其中Ã = D^{-1/2} A D^{-1/2}是归一化的邻接矩阵(加上自环),A是邻接矩阵,D是度矩阵,H^{(l)}是第l层的节点特征矩阵,W^{(l)}是可学习权重,σ是激活函数(如ReLU)。
2. 注意力机制(GAT):在聚合邻居时,为每个邻居分配不同的权重。注意力系数:`α_{ij} = softmax_j( LeakyReLU( a^T [W h_i

W h_j] ) ),其中a是可学习向量,

表示拼接。更新公式:h_i' = σ( Σ{j∈N(i)} α{ij} W h_j )。<br>3. **链接预测**:对于节点对(u, v),使用解码器(如点积)计算存在边的概率:p(u, v) = σ( z_u^T z_v ),其中z_u`是节点u的最终表示。损失函数使用负采样交叉熵。
4. 归纳学习:通过采样邻居(GraphSAGE)或子图,使模型能够泛化到未见过的节点。

节点分类准确率:在测试集上的分类准确率(如>90%)。
链接预测AUC:预测边存在与否的AUC分数。
训练效率:处理大规模图(百万节点)的时间。

图表示学习、谱图理论、注意力机制

微信社交关系推荐、群组发现、风险用户识别。特征:图规模大、节点属性丰富、需实时推理。

A: 邻接矩阵,A_{ij}=1表示节点i和j有边
D: 度矩阵,对角矩阵D_{ii}=Σ_j A_{ij}
H^{(l)}: 第l层的节点特征矩阵(N×d)
W^{(l)}: 第l层的权重矩阵(d×d')
Ã: 归一化邻接矩阵
α_{ij}: 节点i对节点j的注意力权重
z_u: 节点u的最终表示向量

矩阵乘法、归一化、注意力权重、激活函数

图神经网络前向传播、损失计算

1. 图构建:从数据构建图,节点表示实体(用户),边表示关系(好友)。提取节点特征(如用户画像)。
2. 邻居采样:对于大规模图,为每个目标节点采样固定数量的邻居(如GraphSAGE),形成计算子图。
3. 前向传播:对于每个GCN层,计算Ã H^{(l)}(邻居特征聚合),然后乘以权重W^{(l)},应用激活函数得到H^{(l+1)}。对于GAT,先计算注意力权重α_{ij},再加权聚合。
4. 节点分类:最后一层的节点表示z_u通过一个全连接层和softmax得到分类概率。损失函数为交叉熵。
5. 链接预测:对于正例边(u,v)和采样的负例边(u, v'),计算p(u,v)p(u,v'),使用交叉熵损失最大化正例概率,最小化负例概率。
6. 训练优化:使用小批量梯度下降(如Adam),反向传播更新权重。

原始图数据流经过图构建模块,生成邻接矩阵流和节点特征流。训练时,采样模块从图中采样批次节点流及其邻居子图流。子图流和特征流输入GCN/GAT层流,进行多轮消息传递(特征聚合流和更新流),产生节点表示流。对于节点分类任务,表示流经过分类头流产生预测流,与标签流计算损失流。对于链接预测,节点表示流经过解码器流产生边概率流,与正负样本流计算损失流。损失流反向传播更新模型参数流。

Chat-0111

数据模型

流计算

流式数据窗口聚合与状态管理模型

Apache Flink窗口算子与状态后端

目标:对无界数据流进行实时聚合计算(如每分钟PV/UV),支持事件时间、乱序处理,并保证精确一次(exactly-once)语义。
1. 窗口划分:基于事件时间(Event Time)划分窗口。常用滚动窗口(Tumbling Window)和滑动窗口(Sliding Window)。窗口分配器将每个事件分配到对应的窗口。例如,事件时间戳t,窗口大小size,滚动窗口的窗口ID为floor(t / size)
2. 水位线(Watermark):用于衡量事件时间进度,处理乱序。水位线W(t)表示所有时间戳≤t的事件都已到达。通常基于观察到的事件时间戳减去最大乱序延迟LW = max_event_timestamp - L。当水位线超过窗口的结束时间时,触发窗口计算。
3. 状态管理:窗口聚合的中间结果(如累加器)作为状态存储。Flink提供状态后端(State Backend),如RocksDB(磁盘)或Heap(内存)。状态通过检查点(Checkpoint)持久化,实现故障恢复。
4. 精确一次保证:通过分布式快照(Chandy-Lamport算法)和两阶段提交(2PC)实现端到端的精确一次。检查点屏障(Barrier)在数据流中传播,触发各算子状态快照。

处理延迟:事件产生到输出结果的时间(P99)。
状态大小:算子状态占用的内存/磁盘空间。
检查点开销:进行检查点操作对吞吐的影响。

流处理、事件时间、状态管理、分布式快照

微信视频号实时观看人数统计、支付交易风控实时监控。特征:数据量大、延迟要求低、需处理乱序、高可靠。

t: 事件时间戳
size: 窗口大小(如1分钟)
W(t): 水位线函数
L: 最大允许乱序延迟
窗口ID: 窗口的唯一标识,如起始时间
状态: 算子中间计算结果,如MapState, ListState
检查点屏障: 用于触发快照的特殊事件

时间窗口、最大值、状态、屏障

流处理作业拓扑、窗口触发逻辑

1. 数据源:从Kafka等消息队列读取事件流,每条事件包含事件时间戳。源算子分配水位线(周期性或按事件)。
2. 键控分区:根据keyBy将流分区,相同key的事件发送到同一个任务实例。
3. 窗口分配:窗口算子根据事件时间戳将事件分配到对应的窗口(如每分钟一个窗口)。每个窗口维护一个状态,存储聚合中间结果(如计数)。
4. 水位线推进:水位线在流中传播。当算子的当前水位线W超过窗口的结束时间window_end时,该窗口被触发计算。
5. 窗口计算:触发后,从状态中取出该窗口的聚合结果,发送到下游算子(如输出每分钟的PV)。窗口状态可被清理(延迟清理策略)。
6. 检查点:JobManager定期向源注入检查点屏障。屏障随数据流向下游传播,每个算子收到屏障时,将当前状态异步持久化到状态后端。所有算子完成快照后,检查点完成。
7. 故障恢复:任务失败时,从最近一次成功的检查点恢复状态,并重新处理之后的数据。

事件流从消息队列流入Flink源算子流。源算子产生水位线流,与事件流一起向下游传播。经过keyBy操作,形成键控分区流。窗口算子接收事件流和水位线流,将事件分配到窗口状态流中。水位线流触发窗口计算流,产生结果流输出到下游。检查点屏障流定期注入,触发各算子的状态快照流到持久化存储。故障时,从快照流恢复状态流,并重放数据流。

数据流处理、实时计算、分布式系统

实时数据仓库、物联网数据处理

CPU: 窗口计算、状态访问、序列化消耗CPU。
内存/磁盘: 状态后端存储中间状态,可能使用堆内存或RocksDB磁盘。
网络: 数据在算子间传输(shuffle)消耗网络带宽。
存储: 检查点存储到分布式文件系统(如HDFS)。

CPU: Flink集群需要多核CPU处理高吞吐流。内存: 状态管理需要大内存,特别是Heap State Backend。网络: 节点间数据传输需要高带宽。存储盘: 检查点存储和RocksDB状态需要大容量持久化存储。

Chat-0112

安全模型

零信任

零信任网络访问与微隔离模型

基于身份的持续验证与策略引擎

目标:在零信任架构下,对所有访问请求进行严格的身份验证和授权,默认不信任任何实体,实现动态的、细粒度的访问控制。
1. 身份与设备认证:用户和设备必须通过强认证(如多因素认证MFA)获取访问令牌。设备健康状态(如补丁、防病毒)被评估,作为授权因素。
2. 策略引擎:访问决策基于策略规则,规则形式:if (subject, resource, action, context) then permit/deny。上下文包括时间、位置、设备状态、风险评分等。策略引擎实时评估请求,返回决策。
3. 微隔离:在内部网络实施细粒度分段,即使在同一网络内,服务间访问也需要授权。通过软件定义网络(SDN)或主机防火墙(如iptables)实现动态策略下发。
4. 持续监控与风险评估:监控用户和设备行为,使用机器学习检测异常(如异常登录地点、数据外传)。动态调整风险评分,高风险会话可能要求重新认证或终止。

认证成功率:合法用户成功认证的比例。
策略决策延迟:从请求到决策的时间(P99 < 100ms)。
安全事件减少:实施后内部攻击事件减少比例。

零信任、访问控制、身份管理、风险评估

微信内部办公网络、云上生产环境的安全访问。特征:身份为中心、动态策略、内外网无差别对待。

subject: 访问主体(用户、服务账号)
resource: 被访问资源(API、服务器)
action: 操作(GET, POST)
context: 上下文环境(时间、IP、设备指纹)
策略规则: 条件-动作的集合
风险评分: 基于行为分析的动态评分
访问令牌: 短期有效的凭证(如JWT)

条件逻辑、风险评估、令牌验证

零信任网关处理流程、策略评估逻辑

1. 访问请求:用户或服务尝试访问资源,请求首先到达零信任网关(代理)。
2. 身份验证:网关检查请求中的访问令牌(如Bearer Token)。如果令牌无效或过期,重定向到身份提供商(IdP)进行认证(可能包括MFA)。认证成功后,颁发新的访问令牌。
3. 策略收集:网关收集请求的(subject, resource, action, context)元组,并可能查询外部系统获取更多上下文(如设备管理平台、风险分析引擎)。
4. 策略评估:将元组发送给策略引擎(如Open Policy Agent)。策略引擎根据预定义策略和实时上下文计算决策(允许/拒绝)。
5. 执行与日志:网关根据决策放行或拒绝请求。如果允许,可能将请求转发给后端服务(或建立隧道)。所有请求和决策被详细记录用于审计。
6. 持续评估:对于长连接(如SSH),网关或终端代理持续监控会话行为。如果风险评分升高(如检测到可疑命令),可能中断会话或要求重新认证。
7. 微隔离实施:对于服务间访问,控制平面将策略下发给数据平面(如每个Pod的sidecar代理),实施网络层拦截。

用户请求流到达零信任网关。网关发起身份验证流,与身份提供商交互,产生访问令牌流。网关收集请求元组流,并可能查询上下文流。元组流和上下文流输入策略引擎流,产生决策流。决策流控制请求转发流或拒绝流。同时,用户行为流被持续收集,输入风险分析引擎流,产生风险评分流,动态反馈给策略引擎流以调整决策。微隔离控制平面将策略流下发给数据平面代理流,实施网络隔离流。

网络安全、身份与访问管理、软件定义边界

企业安全架构、云安全

CPU: 策略引擎评估、令牌验证、流量加解密消耗CPU。
内存: 缓存策略、会话状态。
网络: 所有流量经过网关,增加延迟,需要高性能网络设备。
存储: 存储策略配置、审计日志。

CPU: 零信任网关需要高性能CPU处理加解密和策略评估。内存: 会话状态缓存。网络: 网关需要高带宽和低延迟网络。存储盘: 审计日志存储巨大。

Chat-0113

移动端模型

跨平台

跨平台UI渲染与原生桥接模型

React Native桥接与虚拟DOM Diff

目标:使用JavaScript开发跨平台(iOS/Android)移动应用,通过原生组件渲染,实现接近原生的性能和体验。
1. JavaScript线程与原生线程:应用运行在两个线程:JS线程执行JavaScript业务逻辑,原生(UI)线程负责渲染。两个线程通过异步消息队列(Bridge)通信。
2. 虚拟DOM与Diff算法:React维护一个虚拟DOM树(JavaScript对象)。当状态变化时,生成新的虚拟DOM树,与旧的树进行Diff比较,计算出最小变更集(ChangeSet)。Diff算法采用启发式算法,时间复杂度O(n)。
3. 桥接通信:变更集通过序列化(JSON)从JS线程发送到原生线程。原生线程解析变更集,调用对应的原生组件(如RCTView, RCTText)进行UI更新。反之,原生事件(如点击)也通过桥接发送到JS线程。
4. 原生组件封装:每个React Native组件对应一个原生视图组件。通过RCTViewManager子类暴露给JS。属性通过@ReactProp注解映射。

渲染帧率:UI更新的流畅度,目标60 FPS。
桥接延迟:JS与原生间消息传递的延迟(P99)。
内存占用:JS引擎和原生视图占用的内存。

跨平台开发、虚拟DOM、桥接通信、响应式UI

微信部分功能模块(如活动页)使用React Native开发,实现iOS和Android代码复用。特征:动态更新、热重载、性能接近原生。

虚拟DOM: 描述UI的JavaScript对象树
Diff算法: 比较两棵虚拟DOM树的差异
ChangeSet: 描述UI变更的最小操作集合
Bridge: JS与原生线程间的异步消息队列
RCTViewManager: React Native原生视图管理器基类
@ReactProp: 用于映射组件属性的注解

树、差异、序列化、异步队列

React Native应用启动与渲染流程、桥接消息处理

1. 应用启动:原生端初始化JavaScript引擎(如JSC或Hermes),加载JS Bundle。启动JS线程,执行入口文件。
2. 组件渲染:JS端执行AppRegistry.registerComponent,React开始渲染虚拟DOM。
3. 首次渲染:初始虚拟DOM通过Bridge发送到原生端。原生端解析,创建对应的原生视图树,并渲染到屏幕。
4. 状态更新:用户交互或数据变化触发JS端状态更新,React重新渲染组件,生成新的虚拟DOM。
5. Diff与桥接:React比较新旧虚拟DOM,生成ChangeSet。ChangeSet被序列化为JSON,通过Bridge发送到原生线程。
6. 原生更新:原生线程接收消息,反序列化,根据ChangeSet中的操作(如createView, updateView, removeView)调用原生API更新UI。
7. 事件处理:用户点击原生视图,原生线程捕获事件,通过Bridge发送事件消息到JS线程。JS线程的事件处理函数被触发,可能引发新一轮状态更新。
8. 性能优化:使用FlatList虚拟化长列表,减少原生视图数量。对于复杂动画,使用Animated API驱动原生动画,避免桥接每一帧。

JS Bundle流在应用启动时被加载到JS引擎。用户交互流和网络数据流触发JS逻辑流,产生状态更新流。状态流驱动虚拟DOM渲染流,产生新的虚拟DOM树流。Diff算法比较新旧虚拟DOM流,产生ChangeSet流。ChangeSet流通过Bridge序列化流发送到原生线程。原生线程解析流,调用原生UI API流更新屏幕像素流。原生事件流(如触摸)反向通过Bridge流传递到JS线程,形成闭环。

移动应用开发、JavaScript引擎、UI框架

跨平台移动应用、动态化业务

CPU: JS引擎执行、Diff计算、序列化消耗CPU。
内存: 虚拟DOM、JS堆、原生视图占用内存。
GPU: 原生视图渲染由GPU负责。
存储: JS Bundle存储在设备本地。

CPU: 移动设备CPU处理JS和原生逻辑。内存: 应用内存占用需控制。GPU: 渲染需要GPU加速。存储盘: Bundle存储空间小。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐