王姐在街角开了家「AI 牛肉面馆」。店面不大,生意却火爆,顾客的咨询微信每天近千条。于是她招了个“AI 接线员”——一个能自动回答营业时间、招牌菜品、外卖进度的小机器人。这机器人本质上就是 RAG 客服系统:顾客提问后,先去“菜谱库”里检索相关资料,再让大语言模型把答案组织成人话。第一版在王姐的电脑上跑得挺欢,可一搬进真正营业的店堂,问题全冒出来了:午餐高峰一问就卡住,半夜机器重启后“记忆”全丢,顾客说回答驴唇不对马嘴却查不出是哪一步答错。王姐很委屈:菜谱明明都是对的呀。 其实,把菜做出来只是第一步。让后厨几十道工序稳定运转、饭点高峰不崩盘、出问题能快速定位、改菜单不砸招牌——这才是“经营”的学问。对 RAG 客服系统而言,这门学问就叫系统部署与运维:怎么设计架构、怎么管理环境、怎么打包部署、怎么监控日志、怎么应对流量波动、怎么保证不宕机、怎么安全地改版。本文就用王姐面馆的故事,把这一整套“开店经营之道”讲给你听。
部署与运维是 AI 应用从 Demo 走向生产的最后一道关卡。掌握它,你才能把 RAG 客服这类系统真正“端上桌”——稳定、可观测、可扩展。这是 AI 工程师从做模型到做产品的分水岭,也是企业愿意为“能落地的系统”付费的根本原因。
目录
可视化演示
查看代码/模型/数据三维CI/CD流水线,三层监控体系分层观测,以及批处理与自动扩缩容的推理优化。
本节配有交互动效(进入视口后自动加载,约 3KB)。
三维CI/CD 代码/模型/数据 监控 批处理+扩缩容提效
1. 部署架构设计
王姐发现 AI 接线员乱,是因为所有事都挤在一张桌子上:接电话、查菜谱、催外卖抢同一个本子,人一多必然打架。她索性重新布局:前台专门接单,后厨专门做面,仓库专门备料,各管一摊——这就是“服务拆分”。她还规定,顾客进店先到前台登记,再由前台把单子分给不同的后厨班组,谁也别想绕过流程直接闯进厨房。
RAG 客服系统也一样。用户请求不是直接砸向大模型,而是先到统一入口“API 网关”。网关负责登记、鉴权、限流,再按请求类型路由到对应服务:检索服务去向量库找资料,问答服务组织答案,会话服务管理多轮上下文。每个服务独立部署、独立升级,互不拖累。整个系统的核心链路可以概括为:用户 → 网关 → 检索服务 → 向量库 → 大模型 → 应答。
为了让高峰不卡死,同一份服务往往部署多个“实例”,由网关把请求轮流分发,这就是“负载均衡”——好比面馆门口安排一位叫号员,把客人均匀分给几位大厨,避免某位大厨忙到崩溃、另一位闲得擦碗。负载均衡器还会定期“摸脉”:哪个实例响应慢、报错多,就少给它派单甚至摘掉它。
王姐后来把面馆的分区图画成海报贴在墙上,新员工一眼就懂谁负责什么。好的部署架构也是一张“透明的地图”:每个服务职责清晰,链路一目了然。只有地基打好了,后面谈监控、谈扩容才有意义。
- MTTF(平均无故障时间)系统连续正常运行的平均时长,比如运行 720 小时才故障一次。
- MTTR(平均修复时间)从发现故障到恢复服务平均耗时,包括排查、重启、验证。
- 整体可用性两个指标相除,得到服务可用时间占总时间的比例。
2. 环境配置管理
王姐准备开分店。本店的辣椒酱配方、外卖平台密钥、营业时间,到了新店可能全不一样。要是每个店的厨师都靠脑记一份“本店特供”,迟早搞混——比如把测试用的假密钥当线上密钥发给顾客,那可就砸招牌了。配置管理要解决的,正是这种“每间店都有自己的小秘密”的问题。
RAG 系统同样要跑在三种“店”里:开发环境(王姐电脑)、测试环境(试营业)、生产环境(正式营业)。它们的数据库地址不同、模型 API 密钥不同、向量库实例不同。如果这些差异靠人肉改代码维护,改错一处就是事故。更麻烦的是,测试环境跑得好好的代码,一上生产就崩溃,查了半天发现是环境变量没配——这叫“配置漂移”。
业界做法是把配置从代码中剥离,交到“配置中心”统一管理。服务启动时向配置中心要属于自己的那份配置:密钥、地址、模型参数全部外部注入。代码本身“不知道自己会开在哪家店”,换环境不用改一行代码。这就是 12-Factor 原则中的“配置与代码严格分离”。
分店开得越多,王姐越体会到“总店统一发调料包”的好处:每店领到的料包按店号封装好,拆开就能用,绝不会把 A 店的辣度用到 B 店。配置中心就是那台“统一发料包”的机器,环境再多也不怕。
- M(服务数)RAG 系统中网关、检索、问答、日志等服务的数量。
- E(环境数)至少包含开发、测试、生产三种环境,还可能加灰度环境。
- N(配置份数)所有服务在所有环境下的配置组合数,随 M 和 E 增长而膨胀。
3. 容器化部署
王姐要把面馆连锁开到外地。如果每个城市都重新装修厨房、从零培训厨师,开一家店要折腾一个月。她灵机一动:把炉灶、锅具、调料、菜谱全打进一个“标准集装箱”,运到哪儿,打开就能开火。容器技术就是这个“集装箱”。
在服务器上,RAG 系统的 Python 版本、依赖包、模型文件、启动脚本——这些“厨房设备”极易受宿主机环境影响:换台机器就缺这缺那,A 机器能跑,B 机器报错。Docker 把整套环境与代码一起打成“镜像”(Image),提交到镜像仓库;部署时把镜像拉下来启动成“容器”(Container),在任何机器上运行结果都完全一致。
容器还要配“资源上限”:比如限制最多用 2 个 CPU、4GB 内存,防止某个服务吃光整台机器,把邻居饿死。多个容器的启动、更新、网络互通由编排系统(如 Kubernetes)统一调度,像连锁总部的运营系统管理所有分店的厨房。镜像一旦构建好就是只读的“祖传菜谱”,任何人不能偷偷改,只能重新构建新版本。
从此王姐开分店像搭积木:一个集装箱拉到,三天内开张,口味还完全一致。镜像就是她的“集装箱”,镜像仓库就是“集装箱堆场”,任何分店(服务器)都能快速部署出同样的 AI 接线员。
- R_used(实际使用)容器运行时真实占用的 CPU 或内存。
- R_limit(资源上限)部署时声明的使用量天花板。
- U(利用率)两者比值,一般建议控制在 0.6~0.8,留出突发余量。
4. 监控告警体系
面馆最怕“出事不知道”。王姐给后厨装了温度计、给冰箱装了传感器、给外卖平台开了评价提醒:油温异常、冰箱温度上升、差评率超标,手机立刻响铃。等到顾客投诉才知道问题,那叫补救;提前预警,才叫监控。监控的意义不是记录,而是让你在问题伤害顾客之前先出手。
RAG 客服系统的监控分两层。第一层是基础设施:CPU、内存、磁盘、网络、请求延迟(P95/P99)、QPS。第二层是业务指标——这才是客服系统的灵魂:回答耗时、检索召回成功率、“对不起我没听懂”这类兜底回答的占比。兜底回答比例飙升,说明知识库或检索环节出了问题,而服务器可能一切正常。这就是为什么“硬件没事”不等于“系统没事”。
监控数据要汇总到可视化面板,配上告警规则:例如“P95 延迟超过 2 秒持续 5 分钟”就触发通知。但告警不是越多越好——狼来了喊太多,值班的人就会无视所有告警,真正出事时反而错过。所以要追求“告警准确率”:宁可少报,不可乱报,更不能漏报。
王姐的手机现在只会在“真出事”时响:油温告警、差评激增告警。她把阈值调来调去,就是为了让误报少一点、真报不漏掉。监控告警做得好,老板才能睡安稳觉——值班工程师也一样。
- TP(真告警)确实发生了故障、需要处理才发出的告警。
- FP(误告警)没有故障却发出的告警,比如毛刺触发、阈值设得过紧。
- 准确率真告警占全部告警的比例,衡量“报警准不准”。
5. 日志管理排查
顾客投诉“面里吃出异物”,光看监控数据确定不了是哪一步出的问题。王姐的做法是调“监控录像”:从下单、和面、煮面、打包、配送,每一步都有时间戳记录,回放一遍就知道责任在哪个环节。这套“录像带”就是日志。没有日志的排查,就像让顾客凭记忆描述三天前的那碗面。
RAG 一次回答横跨多个服务:网关 → 检索 → 向量库 → 大模型。任何一环慢或错,都可能导致最终回答超时或跑题。为了回放完整过程,每个请求分配一个全局唯一 ID(trace_id),贯穿所有服务,像一条线把散落的珠子串起来——这就是“链路追踪”。有了它,你输入一个 trace_id,就能看到一次回答在每一个环节花了多少毫秒、返回了什么结果。
日志要经过采集、汇聚、存储、检索四个环节:采集端收集各服务输出,统一送到集中式存储(如 Elasticsearch),再通过界面搜索。排查问题时按 trace_id 一搜,哪一步耗时多少、哪一步返回错误码,一目了然。日志还是审计的凭据:谁在什么时候做了什么,有据可查——金融、政务场景尤其看重这一点。
王姐从此每晚让系统自动“写店务日志”,第二天一查便知夜里发生了什么。日志不是事后诸葛,而是让每一起投诉都有据可查、有迹可循——这是运维最宝贵的资产。
- QPS(每秒请求数)客服系统平均每秒处理的用户问题数。
- L(单条日志大小)一条日志平均占用多少字节,一般 0.5~2 KB。
- T(时长)系统运行的持续秒数。
- 日志总量三者的乘积决定存储成本和检索性能,需要据此规划磁盘或日志系统容量。
6. 弹性伸缩策略
面馆的生意有明显的“饭点效应”:中午十二点排队到门口,下午三点空无一人。如果固定请 5 个人,淡季养不起;固定请 2 个人,饭点忙不过来。聪明的做法是:忙时临时加人,闲时让人轮休。RAG 客服系统的“人手”就是服务实例,这招叫弹性伸缩。
弹性伸缩的核心是“按需调整实例数”。水平扩容(加机器副本)是首选:把请求分散到更多实例,每台压力自然下降;垂直扩容(换更大机器)受单机上限约束,而且扩容要重启服务,动静太大。判断何时扩容,靠监控指标:CPU 持续超过 70%,或请求 P95 延迟超过 1 秒,就触发扩容;流量回落并稳定一段时间后,再缩容省钱——缩容同样重要,只扩不缩就是烧钱。
扩容不能太“激动”:每次调整之间有冷却时间,避免流量抖动导致实例数量像电梯一样上下乱窜。同时每个实例要有资源配额——集群再多,单机也不能无限吞资源,否则一个坏邻居会拖垮所有人。流量预估也很关键:大促前通过历史曲线预测峰值,提前扩容,而不是等系统被打挂了再抢救。
如今王姐的手机能看到实时的“客流预报”:周末、雨天、节假日自动多排班,平日淡季自动减员。饭点不再排队,闲时不再烧钱——这就是“该省省该花花”的弹性运维。
- λ(请求到达率)每秒到达客服系统的请求数量。
- T_p95(95分位耗时)单个请求处理时间的 95 分位值,代表“绝大多数请求的耗时”。
- c(实例容量)单个实例能同时处理的并发请求数。
- 向上取整比值不是整数时,多算一个实例兜底。
7. 高可用容灾
面馆开业的第三年,王姐立下规矩:厨房永远不只靠一位大厨。主厨请假有备班,停电有备用发电机,菜单配方有多份存档放在保险柜。因为“只要营业,就永远不能没人顶得上”——这就是高可用。高可用不是运气,而是预案。
RAG 客服系统高可用的核心是“消灭单点”。第一招多副本:每个服务至少两个实例,一台挂了另一台顶上。第二招健康检查:编排系统定期探测服务的 /health 接口,探不到就判死,自动摘除流量并重启。第三招故障转移:负载均衡器只把请求转发给健康实例,用户全程无感知。第四招数据备份:向量库里的知识库数据定期备份,防止“厨房烧了,配方也烧了”。
其中数据备份最容易被忽视。知识库包含原始文档、切分后的 chunk、向量索引和元数据。如果只备份原始 PDF 而丢了向量索引,重建索引要重新调用嵌入模型,耗费大量时间与费用。副本多了可用性确实更高,但成本也更高,所以要在可靠性与成本之间取平衡:核心服务多副本,边缘服务两副本。
王姐的保险柜里永远存着两份配方、一份离线备份。她的信条很简单:你可以不期待出故障,但必须准备好出故障。高可用不是运气,而是预案。
- A(单实例可用性)单个实例正常运行的时间占比,比如 0.9。
- q(单实例失效率)单个实例故障的概率,与可用性互补。
- n 个副本同时失效每台都挂的概率相乘,副本越多越小。
- 整体可用性从“必然可用”中减去全挂的概率。
8. 持续交付流水线
王姐想推新品「藤椒牛肉面」。她不会直接改菜单就全店开卖——万一口味不行,招牌就砸了。她的流程是:先由大厨试菜(测试),通过后拿给几位老顾客试吃(灰度),反馈不错再全店推广;万一老顾客说难吃,十分钟内换回旧菜单(回滚)。这套流程的本质,是让“改动”可控、可验证、可撤销。
软件行业的“上新流程”叫持续交付(CI/CD):代码提交后,自动化流水线依次执行单元测试、集成测试、构建镜像、部署到灰度环境、观察指标、逐步放量到全量。任何一步失败,流水线立刻亮红灯阻断,保证“坏代码上不了线、坏品上不了桌”。这听起来繁琐,实则是把每次发布的风险拆散、摊薄。
灰度发布是其中最妙的一环:新版本先接收 10% 流量,与旧版本并行运行、对比指标,确认无异常再逐步提升到 50%、100%。万一新版本出问题,由于旧镜像还在仓库里,一键切回旧版本即可——这就是快速回滚。发布不是终点,回滚能力才是安全的底气。整个流程的自动化程度,可以用业界著名的 DORA 指标来衡量。
后来「藤椒牛肉面」成了招牌,王姐逢人就说:好菜是试出来的,也是练出来的。持续交付让每一次改动都有刹车、有保险,越敢改,才越能改得又快又稳。
- F_changes(失败变更数)发布后引发线上故障、需要回滚或紧急修复的次数。
- N_changes(变更总数)同一周期内所有发布到生产的变更次数。
- 变更失败率两者之比,DORA 认为低于 15% 属于优秀水平。
AI 应用场景
场景1:电商大促前的容量预估与自动扩容
阶段:部署运维中的弹性伸缩与监控告警
解决的问题:传统做法按全年峰值固定买服务器,平时闲置率高达 70%。AI 客服的对话量在大促时是平时的 20 倍,必须像面馆按饭点排班一样,按“流量波浪”动态调整实例数。
具体案例:某电商平台大促前用历史 QPS 预估峰值,设置“CPU 超 70% 或响应延迟超 1 秒持续 5 分钟”触发扩容,冷却 5 分钟;大促当天 RAG 客服实例从 4 个自动扩到 20 个,P95 延迟稳定在 1 秒内,活动结束后自动缩回 4 个,节省约 60% 算力成本。
场景2:知识库更新的灰度发布
阶段:持续交付流水线
解决的问题:客服知识库定期更新(新政策、新产品),全量替换后若检索质量下降,会批量产生错误回答,直接伤害用户信任。传统做法只能“一刀切”替换,风险不可控。
具体案例:某银行更新信用卡权益文档后,先把 10% 流量切到新向量索引,实时对比“兜底回答占比”与“回答满意度”两类业务指标,48 小时无异常后逐步放量到全量;若指标恶化,一分钟内切回旧索引,用户几乎无感知。
场景3:深夜故障的链路追踪排查
阶段:日志管理与监控告警
解决的问题:用户投诉深夜回答超时,没有链路追踪时只能靠猜,排查动辄数小时;日志全链路串联后,问题定位从小时级压缩到分钟级。
具体案例:某企业运维收到告警“P95 响应从 800ms 涨到 5s”,按 trace_id 检索日志,发现检索阶段耗时 4.2s,定位到向量数据库连接池耗尽;扩容连接池并新增“连接池使用率 > 80%”告警规则后系统恢复,全程不到 20 分钟。
Python 演示
import mathimport random class RagService: """模拟 RAG 客服系统实例池, 根据延迟自动扩缩容""" def __init__(self, instances=2, threshold=0.8): self.instances = instances self.threshold = threshold self.requests = [] self.logs = [] def handle(self, req_id): # 一次 RAG 回答 = 检索 + 生成, 实例越多延迟越低 latency = random.uniform(0.1, 0.45) / self.instances * (1 + 0.5 * math.sin(len(self.requests) / 8)) self.logs.append("req=%d latency=%.3fs instances=%d" % (req_id, latency, self.instances)) return latency def monitor(self, traffic): # 滑动窗口: 最近 15 个请求的平均延迟 recent = self.requests[-15:] avg = sum(recent) / len(recent) if recent else 0.0 if avg > self.threshold and self.instances < 5: self.instances += 1 self.logs.append("SCALE_UP traffic=%.2f avg=%.3fs -> %d" % (traffic, avg, self.instances)) elif avg < self.threshold * 0.3 and self.instances > 1: self.instances -= 1 self.logs.append("SCALE_DOWN traffic=%.2f avg=%.3fs -> %d" % (traffic, avg, self.instances)) def main(): svc = RagService() for t in range(240): # 模拟一天中的饭点式流量波浪 traffic = 0.4 + 0.6 * abs(math.sin(t / 12)) for _ in range(int(traffic * 10)): if random.random() < traffic: svc.requests.append(svc.handle(len(svc.requests))) svc.monitor(traffic) print("\n".join(svc.logs[-15:])) print("最终实例数:", svc.instances) if __name__ == "__main__": main()
latency = random.uniform(0.1, 0.45) / self.instances * (1 + 0.5 * math.sin(len(self.requests) / 8))实例越多,单请求延迟越低,模拟扩容带来的性能收益recent = self.requests[-15:]取最近 15 个请求做滑动窗口,避免单次抖动误判if avg > self.threshold and self.instances < 5:平均延迟超过阈值且未达上限,触发扩容elif avg < self.threshold * 0.3 and self.instances > 1:延迟很低且实例数大于最小值,触发缩容省钱traffic = 0.4 + 0.6 * abs(math.sin(t / 12))用正弦波的绝对值模拟饭点式流量波浪svc.monitor(traffic)每个时间片结束后检查一次性能并决策伸缩
常见误区
误区容器里的日志就是系统日志,容器重启后数据应该还在吧?就算容器没了,日志文件应该也会保留。
正解容器一旦被删除或重建,内部文件系统就随之消失,写在容器里的日志全没了,排障时无据可查。必须把日志写到挂载卷(宿主机磁盘)或直接推送到集中式日志系统(如 Elasticsearch)。这就像面馆的采买记录写在一次性纸杯上,纸杯扔了,记录就没了;要留记录,就得写进专门的账本里。
为何常见:开发时容器长期不删,日志一直在,让人误以为容器内的文件是持久的;社区默认“容器是隔离环境”的印象也让新手忽略了它的易失性。
误区运维不就是看服务器忙不忙吗?CPU、内存、磁盘不报警,系统就是健康的。
正解客服系统是业务系统,硬件指标正常不代表回答质量正常。检索召回率下降、兜底回答激增、回答耗时变长,这些业务指标才是用户体验的直接体现。监控要“硬件 + 业务”双层并行,就像面馆不仅要看炉火旺不旺,还要看顾客说面好不好吃——后厨再忙,做出来的面没人吃也是白忙。
为何常见:传统运维以基础设施为核心,新手容易沿用旧习惯;而业务指标需要额外埋点和定制,门槛稍高,容易被跳过。
误区流量高就拼命加实例,反正多几个机器也不贵,开着总比不够用好。
正解实例过多浪费资源,还会带来协调开销——所有实例都去抢同一个向量数据库连接池,反而互相拖累。伸缩要“弹性”:低峰缩容,高峰扩容,配合负载均衡与资源配额。就像面馆淡季还养着 10 个厨师,工资照发、厨房挤得转不开身,纯属浪费。
为何常见:“加机器就能扛住”是运维初期的直觉,且只扩不缩短期看不出成本,等到月底账单才后悔。
误区线上回答出错了,赶紧在服务器上改一行代码、重启服务,先救火要紧,走流程太慢。
正解这种“救火式运维”没有审计、不可回滚,往往按下葫芦浮起瓢——你改的代码和别人提交的更新互相覆盖,下次发布又出现同样的问题。正确做法是走完整流水线:修复 → 自动化测试 → 构建新镜像 → 灰度发布 → 全量,旧镜像保留以便快速回滚。面馆改菜谱要大厨试菜、老客试吃,不能直接端上所有客人的桌子。
为何常见:人都有“先解决眼前问题”的冲动,直接改服务器立竿见影;但看不到的是它欠下的技术债和埋下的隐患。
误区向量索引不就是把文档向量化吗?丢了重新跑一遍嵌入模型就能建回来,不用太在意备份。
正解知识库是 RAG 系统的核心资产:原始文档、切分后的 chunk、向量索引、元数据共同决定回答质量。如果只备份原始 PDF 而丢失向量索引,重建索引需重新调用嵌入模型处理全部文档,动辄数小时到数天,还要花大量 API 费用。要像面馆对待“祖传老汤”一样定期备份,并验证备份可恢复。
为何常见:向量库看起来像“加速缓存”,让人低估它的重建成本;且备份通常不产生直接价值,容易被排到低优先级。
面试题
Q1. RAG 客服系统中,API 网关最主要的作用是什么?
- A.训练行业数据集
- B.统一入口与路由← 正确答案
- C.存储对话记录
- D.生成最终回答
答案:B。网关是系统的“前台”,负责统一收口请求、鉴权、限流和路由,把流量分发给各服务。训练数据、存储记录、生成回答分别是数据、存储和模型层的职责。就像面馆前台只负责接单和叫号,做面是后厨的事。
Q2. 在 RAG 客服系统中,正确的环境配置做法有哪些?
- A.敏感密钥写入代码
- B.配置与代码相分离← 正确答案
- C.配置中心统一管理← 正确答案
- D.每个环境改一套码
答案:BC。配置管理的核心是“配置不入代码、统一外部管理”。密钥写进代码会泄露,每个环境改一套码等于放弃管理。配置与代码分离(B)和配置中心统一管理(C)是业界标准做法,就像王姐由总店统一发料包,而不是让每家店自己改配方。
Q3. 关于 Docker 镜像与容器,下列理解正确的是?
- A.镜像是静态打包模板← 正确答案
- B.容器是静态打包模板
- C.镜像由容器实例产生
- D.镜像只能读不能运行
答案:A。镜像是只读的打包模板,容器是镜像的运行实例。镜像一旦构建不可修改,容器可以启动、停止、删除。镜像由代码构建产生而非容器产生,镜像也正因“可运行”才有价值。这就像集装箱本身是标准模板,装货驶出的才是运输中的“实例”。
Q4. 告警准确率公式中的 FP(误告警)指的是?
- A.真实故障触发的告警
- B.故障恢复后的通知
- C.无故障却发出告警← 正确答案
- D.超过阈值的流量值
答案:C。FP 即 False Positive,指没有故障却发出的告警,是“狼来了”的元凶。TP 才是真实故障触发的告警。告警准确率 = TP / (TP + FP),误报越多准确率越低,值班人员就越容易麻木。
Q5. 下列哪些属于 RAG 客服系统的业务监控指标?
- A.检索召回成功率← 正确答案
- B.兜底回答占比率← 正确答案
- C.服务器 CPU 温度
- D.网络带宽使用率
答案:AB。业务指标反映“回答质量”:检索召回成功率、兜底回答占比、回答满意度等;CPU 温度和网络带宽属于基础设施指标。两者都要监控,但业务指标直接对应客户体验——就像面馆既要看灶台温度,也要看顾客好评率。
Q6. 单实例可用性 0.9,部署 4 副本后整体可用性约为?
- A.0.9000
- B.0.9999← 正确答案
- C.0.3600
- D.0.8100
答案:B。由公式 A_n = 1 - (1 - A)^n,代入 A=0.9、n=4:1 - 0.1^4 = 0.9999。副本从 1 个加到 4 个,可用性从 90% 提升到 99.99%。C 是把失效率相乘得到的 0.0001 的误解,D 是 0.9² 的误算。
Q7. 下列哪项属于水平扩容的具体做法?
- A.增加服务实例数量← 正确答案
- B.更换更强 CPU 机器
- C.调大单机内存上限
- D.压缩日志存储空间
答案:A。水平扩容是加机器、加副本,把流量分摊到更多实例;更换更强 CPU、调大内存上限属于垂直扩容。水平扩容受单机上限约束小、无需重启旧实例,是弹性伸缩的首选。像面馆饭点临时加一位大厨是水平扩容,把灶台换大是垂直扩容。
Q8. 灰度发布相比全量发布的优势有哪些?
- A.降低发布引发风险← 正确答案
- B.小流量观察新指标← 正确答案
- C.保证代码完全无错
- D.节省所有测试成本
答案:AB。灰度发布让新版本先接收小部分流量,用真实业务数据观察指标,异常时可及时回滚,显著降低风险。但它不能“保证无错”,也不能替代测试——只是把风险控制在可承受范围内。这和新菜先给老顾客试吃、再全店推广是一个道理。
Q9. 健康检查接口 /health 的核心作用是?
- A.判定实例是否存活← 正确答案
- B.统计用户的在线数
- C.加速模型推理速度
- D.替代日志采集系统
答案:A。编排系统定期请求 /health,探不到就判定实例失活,自动摘除流量并重启。它是高可用体系中“自动发现故障”的眼睛,与用户统计、推理加速、日志采集都无关。就像面馆每天点名确认厨师到岗,没到的岗位要有人顶班。
Q10. 日志量估算:QPS=200、单条日志 1KB、运行 1 小时,日志量约为?
- A.约 72 MB
- B.约 720 MB← 正确答案
- C.约 7.2 GB
- D.约 720 KB
答案:B。由公式 S = QPS × L × T,200 条/秒 × 1KB × 3600 秒 = 720,000 KB ≈ 720 MB。A 是误把 1 小时算成 360 秒,C 是单位换算错误(720MB = 0.72GB),D 是漏乘了时间。算清日志量才能规划存储,防止“日志撑爆磁盘”的运维事故。