清晨七点,城市最繁忙的路口进入早高峰。红绿灯按设定节奏轮换,车道线清晰标出方向,交警站在中央从容调度:直行的进直行道,左转的进左转道,出租车优先放行,救护车一路绿灯。如果失去这套调度,所有车辆挤在一起,路口会在几分钟内彻底瘫痪。AI 服务世界每天都在经历同样的早高峰——成千上万的请求同时涌向模型服务,v1.0 稳定版、v1.1 优化版、v2.0 测试版同时在线,谁去处理哪个请求?答案是“流量路由”。本文以城市交通指挥为比喻,带你层层认识流量路由:它如何像交警一样精准分发请求、如何用权重控制各版本流量比例、如何通过灰度发布和蓝绿部署安全上线新版本、如何借助流量镜像评估新模型,以及这些能力如何在 MLOps 平台中落地。读完你会发现,调度请求和管理车流,本质上分享同一套智慧。

岗位关联

掌握流量路由,是 MLOps 工程师与 AI 平台研发者的基本功。它能让你在多版本并行、灰度发布和故障回滚等生产场景中轻松掌控请求走向,守住模型上线的最后一道安全门。

目录
  1. 可视化演示
  2. 认识路由——路口的交通指挥官
  3. 路由规则设计——路口指示牌的编排
  4. 权重流量分配——信号灯的配时哲学
  5. 灰度发布——新路先让少量车试跑
  6. 蓝绿部署——双路并行整体切换
  7. 流量镜像——装一双不干预的观察眼
  8. 工程落地——从交警到智能交通系统
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示MLOps流量路由核心策略:从均匀分发到权重路由、灰度发布和流量切换,直观理解多版本模型请求分发控制机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

均匀流量分发 请求平均分配到3个模型版本 每版本接收约33%流量 适用于A/B测试或无差别分发场景

认识路由——路口的交通指挥官

清晨七点的城市路口,红绿灯轮换、车道线清晰、交警手势利落,成千上万的车辆各归其位,没有一辆车会因为“不知道走哪条道”而停在原地。这套井然秩序的背后,是一套精细的调度逻辑。模型服务世界里也有同样的路口,只是“车”变成了请求,而“交警”就是流量路由。

一个模型随着迭代会产生多个版本:v1.0 稳定版、v1.1 性能优化版、v2.0 重构测试版,它们常常同时部署在线。流量路由要回答的只有一个问题:当前这个请求,该交给哪个版本处理?答案来自请求自身携带的信息——用户 ID、设备类型、参数——以及平台预先配置好的路由策略。

在 MLOps 架构中,流量路由通常由 API 网关或独立的 Router 组件承担。它拦截请求、解析特征、与路由规则比对,然后转发到对应版本的后端服务。理解流量路由要抓住它的核心价值:一是多版本并行,新旧模型互不干扰;二是风险可控,新版本出问题只影响分到它的那部分流量。另外要分清它与负载均衡的区别——负载均衡关心“每台机器别太累”,流量路由关心“这个请求该去哪个版本”。

有了这位交通指挥官,再混乱的车流也能各得其所。不过,指挥官手里的那本“交规”——路由规则——是怎么设计出来的?我们下一节来看。

vtarget=Φ(xreq,R)\displaystyle v_{\text{target}} = \Phi(\mathbf{x}_{\text{req}}, \mathcal{R})
这个公式把路由决策概括成一次函数调用:输入请求特征与规则集,输出目标版本,就像交警看一眼车牌和指示牌,就能给出放行方向。
  1. 请求特征向量请求中携带的全部可用信息,如用户 ID、设备类型、参数值,决定了这次请求“长什么样”,相当于路口的“车牌号”。
    xreq\mathbf{x}_{\text{req}}
  2. 路由规则集预先配置的规则总称,包含匹配条件、优先级和转发动作,是路由的“交规手册”。
    R\mathcal{R}
  3. 决策函数将特征与规则匹配并输出版本选择的完整过程,负责在路口“拍板”。
    Φ(⋅)\Phi(\cdot)
  4. 目标版本决策结果,即请求最终被放行到哪个模型版本,对应“该走哪条车道”。
    vtargetv_{\text{target}}

路由规则设计——路口指示牌的编排

一个路口的指示牌不是胡乱立的:“左转车道 7:00—9:00 禁行”“公交车专用道”“学校路段减速”——每条规则都有明确的触发条件和作用对象。路由规则同样是路口的一张张“电子指示牌”,告诉每个请求:你符合什么条件,就去哪条路。

路由规则由两大要件构成:匹配条件(match)和目标动作(action)。匹配条件描述“什么请求”——比如用户 ID 在某个区间内、请求路径以 /v2 开头;目标动作描述“送到哪”——比如转发到 v2.0 版本的推理服务。两者组合起来,就是一条完整的规则。

规则之间讲究优先级:平台按优先级从高到低依次匹配,一旦命中立即执行动作,不再继续向下比对。工程上,规则支持热加载——在 MLOps 平台上修改规则后无需重启网关,路由组件会自动拉取最新规则表,这相当于“交警的指示牌实时远程更新”。多个条件之间还能用逻辑运算组合出复杂表达式,让“特定用户 + 特定路径”这类组合条件成为可能。

一块指示牌管一类车,一套规则管一类请求。规则井井有条,路口才不会乱——当指示牌能动态更新、按序生效,交通指挥就拥有了第一层智慧。

Hit(r)=(C1∧C2)∨(C3∧¬C4)\displaystyle \text{Hit}(r) = (C_1 \land C_2) \lor (C_3 \land \neg C_4)
规则的命中判定就是一道逻辑题:既要满足 C1 又要满足 C2,或者满足 C3 且不满足 C4,整条规则才算命中。
  1. 匹配条件规则中的基本判断单元,例如“用户属于内部测试名单”“请求路径含 /v2”。
    C1,C2C_1, C_2
  2. 与运算两个条件必须同时满足,相当于“既要是内部用户,又得走 /v2 路径”。
    ∧\land
  3. 或运算左右两边任一成立即可,相当于“满足这一条,或者满足那一条”。
    ∨\lor
  4. 非运算对条件取反,把“属于名单”变成“不属于名单”,用于排除式匹配。
    ¬C4\neg C_4
  5. 整体判定整条规则是否生效由组合逻辑共同输出,命中后立刻执行转发动作。
    Hit(r)=(C1∧C2)∨(C3∧¬C4)\text{Hit}(r) = (C_1 \land C_2) \lor (C_3 \land \neg C_4)

权重流量分配——信号灯的配时哲学

路口信号灯为什么直行给 70 秒、左转只给 30 秒?因为这大致匹配了两条车道的真实需求,让车辆按比例有序通过。流量路由的权重分配正是这种“配时哲学”:不给某条路“一刀切”的开关,而是按比例同时放行。

权重分配的核心思想很简单:给每个模型版本设置一个权重值,请求按权重占比被分发到对应版本。比如 v1.0 权重 70、v1.1 权重 30,那么长期来看,约 70% 的请求去 v1.0,30% 去 v1.1。

实现上有几种常见方案。最朴素的是“加权随机”:掷一次骰子,落在谁的区间就归谁,实现简单,但短时间窗口内流量比例会忽高忽低。工程上更常用平滑加权轮询(Smooth Weighted Round-Robin):每一轮给所有版本加分、选中者减分,像“轮流值班 + 欠账补齐”一样让流量平稳。对于需要状态保持的场景(比如对话上下文),则用一致性哈希,让同一用户 ID 的请求始终打到同一版本,避免跨版本导致会话断裂。

信号灯的配时不是拍脑袋定的,权重分配同样被精确计算过——多一分拥堵,少一分不够。想在新旧版本之间安全地调配比例,光有权重还不够,还需要一条循序渐进的放行策略,这就是下一节的灰度发布。

Pi=wi∑j=1nwj×100%\displaystyle P_i = \frac{w_i}{\sum_{j=1}^{n} w_j} \times 100\%
每个版本分到的流量比例,等于它的权重除以所有版本权重之和。就像路口绿灯 70 秒、总周期 100 秒,直行车流大约占 70%。
  1. 版本权重第 i 个模型版本的权重值,由平台配置,比如 v1.0 权重 70。
    wiw_i
  2. 权重之和所有在线版本权重的总和,作为归一化的分母。
    ∑j=1nwj\sum_{j=1}^{n} w_j
  3. 除法归一单个权重除以总权重,得到一个 0 到 1 之间的小数占比。
    wi∑j=1nwj\frac{w_i}{\sum_{j=1}^{n} w_j}
  4. 百分比转换乘以 100% 换成直观的流量百分比,用于配置期望与结果核对。
    Pi=wi∑j=1nwj×100%P_i = \frac{w_i}{\sum_{j=1}^{n} w_j} \times 100\%

灰度发布——新路先让少量车试跑

一条新修的路通车前,不会一夜之间把全部车流引过去,而是先放行少量车辆试跑,确认路基、标识、信号灯都正常后,再逐步加大放行量。如果试跑车辆反馈路况有问题,交警随时可以拉回旧路。灰度发布就是模型界的“新路试跑”。

灰度发布让新版本先接收一小部分真实流量(比如 5%),在监控指标确认健康后,按阶梯逐步放量:5% → 10% → 25% → 50% → 100%。它的好处显而易见:万一新版本效果差,影响面被限制在极小的范围内,绝大多数用户完全无感。

每一步放量都以健康检查为前提。健康检查的指标包括错误率、推理延迟、业务效果(如推荐点击率)等,一旦指标越过阈值,自动触发回滚——路由规则瞬间切回旧版本,不需要重新部署。发布观测贯穿整个流程,平台记录每个阶段的流量比例与指标趋势,形成一份可审计的发布报告,这就是“步步留痕”。

每多放一批车,交警都盯着监控确认安全;灰度发布的每步放量,同样以数据说话。但有些场景等不起渐进放量——比如安全补丁需要立刻全量生效,那就轮到蓝绿部署登场了。

sn=min⁡(100%, s0×2n)\displaystyle s_n = \min\left(100\%, \, s_0 \times 2^n\right)
放量比例像开闸放水:每次把闸门开大一倍,但总闸门最多开到 100%。5% 起步,翻到 100% 就全量。
  1. 初始放量灰度第一步放给新版本的流量比例,通常取 5%,确保影响面最小、可随时撤回。
    s0=5%s_0 = 5\%
  2. 翻倍放量每通过一个观测阶段,流量按 2 倍放大,形成 5% → 10% → 20% 的节奏。
    s0×2ns_0 \times 2^n
  3. 上限封顶用 min 函数把比例限制在 100% 以内,达到全量即宣告灰度结束。
    min⁡(100%,⋅)\min(100\%, \cdot)
  4. 完整步进公式第 n 步的放量比例,由初始值与翻倍次数共同决定,用于规划发布节奏。
    sn=min⁡(100%,s0×2n)s_n = \min(100\%, s_0 \times 2^n)

蓝绿部署——双路并行整体切换

有些路口不适合渐进式试跑,而是在旁边直接修一条规格相同的新路,验证合格后,择日将所有车辆统一改道。这类“整体切换”的策略在部署界叫蓝绿部署:蓝色环境跑当前线上版本,绿色环境跑新版本,二者并行部署、互不干扰。

蓝绿部署的关键动作是切换:当绿色环境完成全量验证、健康度达标后,只需把路由入口从蓝色整体拨向绿色,流量便在一瞬间完成版本更替——这个过程是原子化的,不存在“切了一半”的中间态。同理,如果新版本上线后出现严重问题,回滚也只需要把路由再拨回蓝色,秒级完成。

蓝绿部署的优点突出:切换快、回滚简单、版本间完全隔离。缺点同样明显:资源成本近乎翻倍——两套环境需要同时在线运行,对 GPU 等昂贵算力并不友好。因此它更适合“重切换、轻迭代”的场景,比如大版本重构或安全补丁。切换前必须对绿色环境做充分验证,最常用的准入门槛就是健康度不低于约定的 SLO。

新路验收合格才能整体改道,蓝绿部署同样以指标为准绳,绝不做没把握的切换。无论是灰度还是蓝绿,都需要在“放行之前”尽量了解新路的路况——流量镜像正是那台不干预行驶的监控探头。

Hnew=NokNtotal×100%≥SLO\displaystyle H_{\text{new}} = \frac{N_{\text{ok}}}{N_{\text{total}}} \times 100\% \geq \text{SLO}
健康度就是新路的“验收合格率”:成功处理数占总请求数的比例,必须达到团队约定的 SLO 标准,才允许整体改道。
  1. 成功请求数新环境在验证窗口内处理成功的请求数量,是健康度的“分子”。
    NokN_{\text{ok}}
  2. 总请求数验证窗口内进入新环境的全部请求,无论成功失败。
    NtotalN_{\text{total}}
  3. 健康度成功率 = 成功数 ÷ 总数,衡量新版本是否达到上线门槛的核心标尺。
    Hnew=NokNtotal×100%H_{\text{new}} = \frac{N_{\text{ok}}}{N_{\text{total}}} \times 100\%
  4. SLO 门槛团队约定的服务等级目标,例如 99.5%,健康度必须不低于它才允许切换。
    SLO=99.5%\text{SLO} = 99.5\%

流量镜像——装一双不干预的观察眼

交警想知道某条新路线是否顺畅,不必真把车放上去,只需调出监控探头,把所有车的行驶数据复制一份来做分析。流量镜像干的就是这件事:把线上真实请求复制一份发给新模型版本,但新版本的输出直接被“观察者”收走,不返回给用户。

流量镜像也被称为影子流量(Shadow Traffic)。它的核心价值在于“零影响评估”:新模型在处理最真实的生产请求,用户却完全无感知——即使新模型答得再离谱,也不会伤害任何一位真实用户。这是灰度发布之前最好的一层“预检”。

实现上要注意三点:第一,请求复制由网关完成,采用异步发送,避免拖慢主链路响应;第二,镜像请求要打上特殊标记,防止它对数据库、下游服务产生“副作用”;第三,通过比对同一请求在新旧版本上的输出差异,量化新版本的优劣。当镜像评估通过后,再配合灰度发布逐步放真实流量,两者形成最稳妥的组合拳。

监控探头不影响任何一辆车的行驶,却让交警对路况了如指掌。路由、权重、放量、镜像各就各位之后,剩下的问题是如何把这些能力像智能交通系统一样管起来——这就是工程落地。

p=NmirrorNtotal\displaystyle p = \frac{N_{\text{mirror}}}{N_{\text{total}}}
镜像采样比 = 被复制观察的请求数 ÷ 全部请求数。比例越高,评估样本越充分;比例越低,对新版本下游的压力越小。
  1. 总请求数某个统计窗口内线上产生的全部真实请求,构成了镜像的“素材池”。
    NtotalN_{\text{total}}
  2. 镜像请求数从素材池中复制出来、单独发给新版本的那部分请求。
    NmirrorN_{\text{mirror}}
  3. 采样比两者相除得到镜像覆盖率,反映评估样本的充分程度。
    p=NmirrorNtotalp = \frac{N_{\text{mirror}}}{N_{\text{total}}}

工程落地——从交警到智能交通系统

现代城市的交通管理早已不是一位交警站在路口,而是一整套智能交通系统:态势大屏实时刷新、异常事件自动预警、应急预案一键启动、调度平台统一配置。流量路由的工程落地,同样是从“单点交警”走向“体系化平台”。

在 MLOps 平台中,流量路由必须与完整的可观测体系配合。核心指标包括:路由决策延迟(路由器本身不能成为瓶颈)、各版本流量占比(验证实际分流与配置一致)、错误率与 P99 延迟(衡量版本健康度)。指标上报到监控中心,异常触发告警,告警再联动自动回滚,形成“监控 → 告警 → 处置”的闭环。

工程规范同样重要:每次大版本发布前要做故障演练,提前验证回滚预案是否真的有效;路由配置的每次变更都要有审计记录,出了问题能追溯到人;平台化之后,研发只需在界面上拖动权重滑块或勾选规则条件,就能完成一次灰度比例调整,无需人工修改配置文件。这套体系让流量路由从“会转发的代码”升级为“可运营的基础设施”。

只有当指挥、监控、预案、平台各就各位,流量路由才能真正成为守护模型服务的“智能交通系统”。从认识概念到工程落地,六层能力环环相扣,共同构成 MLOps 中精准发号施令的中枢。

Err=∑iFaili∑iTotali×100%\displaystyle \text{Err} = \frac{\sum_{i} \text{Fail}_i}{\sum_{i} \text{Total}_i} \times 100\%
错误率把所有时间窗口的失败请求相加,除以全部请求,得到版本级健康指标。它是监控大屏上最醒目的一盏红灯。
  1. 窗口失败数第 i 个时间窗口内某版本处理失败的请求数,是错误率统计的“分子素材”。
    Faili\text{Fail}_i
  2. 窗口总请求第 i 个窗口内该版本收到的所有请求,构成“分母素材”。
    Totali\text{Total}_i
  3. 累加统计把所有窗口的失败数与请求数分别相加,避免单个窗口的噪声干扰判断。
    ∑iFaili,∑iTotali\sum_{i} \text{Fail}_i, \quad \sum_{i} \text{Total}_i
  4. 版本错误率全部失败除以全部请求得到百分比,是告警阈值与自动回滚的触发依据。
    Err=∑iFaili∑iTotali×100%\text{Err} = \frac{\sum_{i} \text{Fail}_i}{\sum_{i} \text{Total}_i} \times 100\%

AI 应用场景

大促前推荐模型灰度升级

阶段:模型部署与发布

解决的问题:电商大促前需要升级推荐模型,传统做法是停服替换,一旦新模型效果不及预期,会影响所有用户且难以回退。借助流量路由的灰度能力,先让新版本接收 5% 流量,配合点击率、延迟监控逐级放量,异常时一键回滚,就像交警先放行少量试探车,确认安全再大开闸门。

具体案例:某电商平台双 11 前将推荐模型从 v3 升级到 v4。发布当天,路由配置把 v4 权重设为 5%,两小时后点击率偏差在 0.1% 以内,放量到 25%;再过两小时确认 P99 延迟正常,放量到 100%。全程零停机,无用户投诉。

银行客服机器人的镜像验证

阶段:模型评估与验证

解决的问题:新一代大模型客服机器人不敢直接上线,担心答错引发客诉。传统测试用构造语料,与真实用户问法差异大、覆盖不足。流量镜像把线上真实请求复制给新模型离线评估,相当于在监控室里回放真实车流来分析新路况,不干预任何一辆真实行驶的车辆。

具体案例:某银行将新版本客服模型接入镜像路由,连续运行 7 天,累计镜像 10 万条真实用户问题。算法工程师抽样对比新旧版本回答,确认改版后准确率提升 5%,随后走灰度发布正式上线,上线首日客诉率同比下降 30%。

多租户平台的版本分域路由

阶段:模型服务治理

解决的问题:一家提供 AI 能力的 SaaS 平台,不同企业客户对模型版本诉求不同:付费客户要求稳定,测试客户想尝鲜新功能。传统做法是给每个客户单独部署,资源浪费严重。用路由规则的“用户维度匹配”,按客户 ID 精准分流,相当于给不同车辆发不同颜色的通行证。

具体案例:某 SaaS 平台在路由规则中配置“企业 A 的请求全部转发到 v2.0-preview,其余客户走 v1.0 稳定版”,一次配置精准分流。平台还支持按租户权重放量,新版本先让 10% 的测试租户试用,再逐步扩展到全部客户。

Python 演示

python69 行
"""Simulate weighted traffic routing: random vs smooth weighted round-robin."""import randomfrom collections import Counter  class WeightedRouter:    """Router that distributes requests to model versions by weight.     versions: dict like {"v1.0": 70, "v1.1": 20, "v2.0": 10}    """     def __init__(self, versions):        self.names = list(versions.keys())        self.weights = list(versions.values())        self.total = sum(self.weights)        self.current = self.weights[:]  # 平滑轮询的积分器初始值     def pick_random(self):        """加权随机:掷一次骰子,落在谁的权重区间就选谁"""        r = random.uniform(0, self.total)        acc = 0        for i, name in enumerate(self.names):            acc += self.weights[i]            if r <= acc:                return name        return self.names[-1]     def pick_smooth(self):        """平滑加权轮询:每轮加分,选中者减分,流量更平稳"""        best = 0        for i in range(len(self.names)):            self.current[i] += self.weights[i]            if self.current[i] > self.current[best]:                best = i        self.current[best] -= self.total        return self.names[best]  def run(router, rounds, pick):    counter = Counter()    for _ in range(rounds):        counter[pick()] += 1    return counter  def max_deviation(router, rounds, pick, window=100):    worst = 0.0    for _ in range(rounds // window):        c = run(router, window, pick)        ratio = c["v1.0"] / window        worst = max(worst, abs(ratio - 0.7))    return worst  def main():    versions = {"v1.0": 70, "v1.1": 20, "v2.0": 10}    for label, method in (("random", "pick_random"), ("smooth", "pick_smooth")):        router = WeightedRouter(versions)        pick = getattr(router, method)        result = run(router, 100000, pick)        print("%s distribution (100000 requests):" % label)        for name in versions:            print("  %s -> %.2f%% (expected %d%%)" % (name, result[name] / 1000.0, versions[name]))        worst = max_deviation(WeightedRouter(versions), 100000, pick) * 100        print("  max deviation in 100-request windows: %.2f%%" % worst)  if __name__ == "__main__":    main()
目的:这段代码模拟了两种权重路由策略——加权随机与平滑加权轮询,对比它们在 10 万次请求中的分配效果,以及在 100 次请求的短时间窗口内流量比例的平稳程度。
  1. self.total = sum(self.weights)提前算出总权重,作为“掷骰子”的区间上界和归一化分母。
  2. self.current = self.weights[:]复制一份权重作为积分器,平滑轮询靠它记录每个版本“欠了多少流量”。
  3. r = random.uniform(0, self.total)在 0 到总权重之间掷出随机数,落在哪个版本区间就选哪个版本。
  4. if r <= acc:累加权重边界,判断随机数命中的版本,相当于把区间切成 n 段。
  5. self.current[i] += self.weights[i]每个轮次先给所有版本加一次权重分,表示“应该获得这么多流量”。
  6. if self.current[i] > self.current[best]:找出当前积分最高的版本,它是最“欠流量”的一个。
  7. self.current[best] -= self.total选中后扣掉总权重,防止某个版本被持续选中,保证长期均衡。
  8. counter[pick()] += 1用计数器统计实际分到的请求数,验证分配比例是否接近期望。
  9. abs(ratio - 0.7)短窗口内 v1.0 实际占比与期望 70% 的偏差,偏差越小说明策略越平稳。

常见误区

误区我理解的流量路由和负载均衡是一回事,都是把请求分到不同的机器上,没什么本质区别。

正解两者目标完全不同。负载均衡关注“资源利用均衡”——让每台后端机器压力相当,手段多为随机或轮询;流量路由关注“业务策略分发”——按用户、参数、比例精准决定请求去哪个模型版本。可以这样记:负载均衡像平均分配乘客的出租车调度,流量路由像按票面上的终点站分流的铁路系统。

为何常见:两者都做“请求分发”这一步,表面动作相似;但负载均衡解决容量问题,路由解决版本治理问题,目的差异被表象掩盖了。

误区灰度发布不就是把新版本的权重从 5% 调到 100% 吗?我打开控制台拖动一下滑块就算完成了。

正解调权重只是灰度执行的最后一步。真正的灰度发布是全流程工程:小流量验证、监控指标观测、逐步放量决策、异常自动回滚,每一步都有健康门槛。滑块背后是一整套“看着数据走”的流程,而不是“闭着眼拉杆”。就像试跑新路,不是把限流牌一撤就完事,而是要持续看路况报告。

为何常见:平台把灰度入口做得太顺滑,用户看到的是“拖滑块”这个动作,很容易忽略平台在后台默默做的监控与保护。

误区我配置了 v1 占 70%、v2 占 30%,那每来 10 个请求就应该是 7 个去 v1、3 个去 v2,分毫不差。

正解权重描述的是长期期望比例,不是短期的精确配额。加权随机在短时间窗口内会有明显波动;平滑加权轮询能减小波动,但同样不保证每个固定窗口精确相等。就好比红绿灯配时 70/30,不代表任意 10 辆车里恰好 7 辆直行——车流本身是随机的。实际比例还受后端实例数、处理速度等因素影响。

为何常见:配置界面上的数字给人“精确承诺”的错觉,人们习惯把统计期望当成确定规则。

误区新模型在镜像环境里跑了一周,用的全是真实请求,效果看起来不错,那就可以直接全量上线了。

正解镜像流量是“只观察不干预”——新版本的结果不返回用户,用户没有真实反馈,且部分下游副作用会被隔离,评估并不完整。镜像通过只代表“离线看起来不错”,不代表“线上真的没问题”。稳妥的做法是镜像评估通过后,仍然走灰度发布逐步放真实流量,让真实用户反馈来最终把关。

为何常见:镜像用的确实是最真实的请求,容易让人误以为验证已经等同于生产验证,忽略了“没有真实反馈”这个关键缺口。

面试题

Q1. 流量路由与负载均衡的核心区别是?

单选题 · easy

  • A.只针对 GPU 服务器
  • B.关注资源均衡与业务策略← 正确答案
  • C.两者没有任何区别
  • D.仅用于模型部署场景

答案:B。负载均衡力求让每台后端机器负载接近,流量路由按业务策略把请求分到指定模型版本。A、D 都过于片面,C 完全错误。可以理解为负载均衡管“压力平摊”,路由管“版本分流”。

Q2. 灰度发布的第一步通常是?

单选题 · easy

  • A.全量切换所有流量
  • B.直接删除线上旧版本
  • C.让新版本接小部分流量← 正确答案
  • D.关闭所有路由转发功能

答案:C。灰度讲求小范围验证,第一步只让新版本接收 5% 左右的流量。全量切换违背灰度初衷,删除旧版本和关闭路由是危险操作。就像新路试跑,先放几辆车探路,而不是直接封路或全放行。

Q3. 关于路由规则的构成,下列说法正确的有?

多选题 · mid

  • A.匹配条件决定哪些请求命中← 正确答案
  • B.目标动作指定转发到哪个版本← 正确答案
  • C.优先级决定规则匹配的顺序← 正确答案
  • D.规则数量越多路由性能越好

答案:ABC。路由规则 = 匹配条件 + 目标动作 + 优先级。规则数量增加会让匹配链变长,反而可能拖慢性能,D 错误。规则如同交通指示牌,讲求精准有效,而不是越多越好。

Q4. 某路由配置 v1 权重 80、v2 权重 20,理论上 v1 分到的流量是?

单选题 · mid

  • A.流量占比 20%
  • B.流量占比 50%
  • C.流量占比 80%← 正确答案
  • D.流量占比 100%

答案:C。P₁ = 80 ÷ (80 + 20) = 80%。A 是 v2 的比例,B 是均分结果,D 是全量。权重分配就像信号灯配时,80% 的绿灯时间意味着大约 80% 的车流通过。

Q5. 蓝绿部署的特点包括?

多选题 · mid

  • A.两套完整环境同时在线← 正确答案
  • B.切换通过拨动路由完成← 正确答案
  • C.回滚成本低速度快← 正确答案
  • D.资源占用比灰度部署更低

答案:ABC。蓝绿部署两套环境并行在线,通过一次路由拨动完成原子切换,回滚只需再拨回来。但两套环境占用双倍资源,比灰度部署成本更高,D 错误。就像修了两条平行路,通行顺畅但占地翻倍。

Q6. 流量镜像中新版本的处理结果如何处理?

单选题 · mid

  • A.返回给真实用户感知新版效果
  • B.保存到本地文件不做任何分析
  • C.不返回用户而用于离线评估← 正确答案
  • D.转发给下游所有依赖系统

答案:C。镜像的核心是“只观察不干预”,结果不返回用户,而是用于离线对比评估。A 会造成用户感知错误结果,B 浪费了评估价值,D 会污染下游系统。就像监控探头只记录不拦车。

Q7. 平滑加权轮询相对加权随机的优势是?

单选题 · hard

  • A.代码实现上更加简洁
  • B.短时间窗口内流量更平稳← 正确答案
  • C.保证分配比例完全精确
  • D.无需维护任何权重参数

答案:B。加权随机在短窗口内波动大,平滑加权轮询通过“加分—选最大—减分”的机制让流量分布更均匀。但它依然是统计意义上的均衡,并非精确保证;实现也并非更简单,仍需维护积分器。它更像“轮班制”而非“掷骰子”。

Q8. 某版本统计到成功请求 9950 次、失败 50 次,其健康度为?

单选题 · mid

  • A.健康度 99.0%
  • B.健康度 99.5%← 正确答案
  • C.健康度 99.8%
  • D.健康度 95.0%

答案:B。健康度 = 成功数 ÷ 总数 = 9950 ÷ 10000 = 99.5%,恰等于常见 SLO 门槛。A 少算了失败数的影响,C 是错误估算,D 明显偏低。这就像新路验收,合格率必须精确计算,差一点都不能改道。

Q9. 灰度放量公式 sₙ = min(100%, s₀ × 2ⁿ),s₀ = 5%、n = 3 时放量到?

单选题 · hard

  • A.放量至 15%
  • B.放量至 40%← 正确答案
  • C.放量至 50%
  • D.放量至 100%

答案:B。5% × 2³ = 5% × 8 = 40%,未超过 100% 上限。A 是加法误算(5% × 3),C、D 都不是正确结果。灰度放量像开闸放水,每次都开大一倍,但不得超过全开。

Q10. 流量路由工程落地时,下面哪些做法是正确的?

多选题 · hard

  • A.上线前进行故障演练← 正确答案
  • B.路由变更保留审计记录← 正确答案
  • C.用错误率与延迟做告警← 正确答案
  • D.发布都跳过灰度直接全量

答案:ABC。工程化要求预案演练、配置审计、指标告警齐备,形成“监控 → 告警 → 处置”闭环。跳过灰度直接全量违背风险控制原则,D 错误。就像智能交通系统必须有应急预案、记录和实时大屏,而不是拍脑袋封路放行。