你接手过一座百年老城的改造吗?整座城市的人、车、水、电,全都挤在一栋巨大的“功能集合体”里——没有人敢推倒重来,因为一推,整座城的日常就停了。工程师们把这种困境叫作“遗留系统束缚”。而有一种聪明的改造思路,和热带雨林里的绞杀榕如出一辙:榕树的种子落在宿主树枝上,气根沿着树干一点点往下探,入土、变粗、交织,最终完全取代宿主,自成一片森林。渐进式架构迁移(Strangler Fig Pattern)就是这个思路:让新系统作为“邻居”在旁边生长,把旧系统的功能一个个“搬”过去,搬走的模块就从旧系统上剥离,等所有功能都搬完,旧系统自然退场——整个过程中,业务一天都不用停。
对 AI 从业者而言,渐进式迁移是在 AI 云服务设计中处理遗留系统、控制迁移风险、协调云成本的关键方法论,学会它,你就能在“边飞边换引擎”的工程实践中游刃有余,让职业价值跨越单体与微服务之间的鸿沟。
可视化演示
展示Strangler Fig绞杀者模式中Facade路由层分流、URL/HTTP/功能标志三种路由策略,以及旧系统逐步被新服务替换的过程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Facade路由层分流 Facade统一入口按规则转发 旧→新 根据请求特征决定转向旧系统或新服务。
一、迁移概览
想象你接手一座百年老城的改造任务,城里所有人都挤在一栋巨大而年久失修的“大杂院”里,水电管网纠缠在一起。你不能把大杂院炸了重建——那样全城人都会露宿街头。渐进式架构迁移给出的方案是:在旁边先盖一座新城,然后把大杂院里的人一户户搬过去,搬空一间就封掉一间。这套思路在软件工程领域正是鼎鼎大名的 Strangler Fig Pattern(绞杀榕模式),灵感来自热带雨林里的绞杀榕——种子落在宿主树枝上,气根慢慢缠绕、扎根,最终让宿主“退位”,自己独立成林。
迁移概览要回答三个问题:什么是渐进式迁移、它适合什么场景、它和“推倒重来”式的传统重构有什么本质不同。渐进式迁移指的是新旧系统长期共存、增量替换的过程:每个模块被新服务替代后就从旧系统上剥离,直到旧系统全部功能都被接管。它最适合那些不能停机、又不能一次性重写的复杂系统,比如承载着核心业务的 AI 云服务。与之相对,传统重构往往追求“一步到位”的大爆炸式替换,风险集中在切换那一刻爆发——就像把所有人同一夜赶进新城,一旦新城基础设施有问题,全城瘫痪。
完成度是衡量迁移进展最直观的指标:
在工程汇报中,你看到“迁移完成 72%”这类数字,本质上就是 M 乘以 100%。就像老城改造公示牌上“已搬迁 187/260 户”一样,数字本身就能告诉所有人项目走到了哪一步,也让后续的节奏调整有据可依。
- 已迁移模块数分子表示已经完成迁移的模块数量,也就是从旧系统剥离、由新系统成功接管的模块。
- 总模块数分母是需要迁移的全部模块总数,它定义了迁移的“工作总量”。
- 完成度比值两者相除得到迁移完成度,M 越接近 1,说明旧系统被替代的程度越高。
二、核心原理
在老城改造中,最怕的不是慢,而是“拆到一半发现没法住人”。绞杀榕给我们的启示恰恰是:寄生、缠绕、替代,三者平滑衔接,宿主始终活着,直到新生命完全独立。渐进式迁移的核心原理正是如此——新旧共存、逐步替换、持续演进、风险隔离,四条原则缺一不可。
新旧共存意味着旧系统继续承担业务,新系统在旁边“寄生”式地生长,两者由一条“脐带”(数据同步和流量通道)相连。逐步替换强调每次只动一个模块,不追求毕其功于一役。持续演进是指整个迁移过程本身就是一个长期的迭代开发过程,新系统不是等全部建好才上线,而是建好一栋就投用一栋。风险隔离则是最关键的安全网:因为每次只动一个模块,出了故障影响面被限制在局部,且随时可以回滚——就像老城改造中每栋楼都是独立施工,不会因为一栋楼出问题导致全城断电。
新系统接管功能的进程通常不是匀速的,而是一条 S 形曲线:
理解了这条曲线,你就明白了为什么渐进式迁移“开头急不得”。榕树的气根刚垂下时不起眼,但一旦入土,生长速度就会爆发;迁移项目也是一样,前期需要花时间打地基、做同步、跑通闭环,中期开始批量收割,后期则会自然减速——因为剩下的模块往往是最难啃的硬骨头。
- 时间变量t 表示迁移推进的时间,通常以迭代周期(周或月)为单位。
- 时间常数τ 是时间常数,决定了迁移的整体节奏;τ 越小,曲线越陡,迁移越激进。
- 负指数项e 的负 t 除以 τ 次方,表示“尚未被接管的功能比例”,它随时间衰减到 0。
- 接管比例用 1 减去上述衰减项,得到新系统已经接管的累计比例,最终趋近于 1。
三、迁移步骤
老城改造的施工队有一套标准动作:先画地图,再排顺序,然后盖新房,最后让居民搬家。渐进式迁移同样遵循这四个步骤——识别模块边界、规划切割顺序、构建新服务、流量切换。
第一步,识别模块边界。施工队要看清大杂院哪堵墙是承重墙、哪条水管连着谁家;工程师则需要梳理模块间的调用关系和数据库依赖,画出清晰的依赖图。第二步,规划切割顺序。选出“先搬谁”很有讲究——一般来说,依赖度低、成本高、价值大的模块应该优先迁移,就像先搬独门独户的住户,再去协调联排别墅的邻居。第三步,构建新服务。在目标架构下重新实现该模块,并部署到新环境。第四步,流量切换。通过 API 网关把原本打到旧系统的请求逐步切到新服务,完成“搬家”。
假设我们把迁移过程划分为 K 批切换,第 k 批的切流比例可以表示为:
这就像分批搬迁:第一批先搬 25% 的住户,确认新城供水供电正常;第二批再搬 25%……直到全部搬完。每批之间留出观察窗口,一旦发现问题,就把已经搬过去的住户“搬回来”(流量回切),这在工程上就是回滚。
- 总批次数K 是计划中的总切换批次数,批次越多节奏越稳,但总耗时越长。
- 当前批次k 表示当前进行到第几批,从 1 递增到 K。
- 切流比例两者相除得到当前已切换的流量比例,比如 K=4、k=2 时,φ=0.5。
四、关键技术
老城改造要做到“边住边改”,离不开三件法宝:交通指挥中心(API 网关)、搬迁车队(数据同步)、以及试住机制(灰度发布)。同时,老城的数据库也要像地下管网一样被逐渐拆分,这就是数据库拆分。
API 网关是城市入口的交通指挥中心,所有请求先到达网关,再由它按比例将流量分给旧系统和新系统。数据同步则是新旧城区之间的“户籍同步系统”——只要旧系统的数据发生变化,就通过变更数据捕获(CDC,Change Data Capture)技术把变更实时同步到新系统,确保两边看到的数据一致。灰度发布就像一个“试住期”:先让 1% 的用户体验新系统,确认无误后扩大到 10%、50%,最终 100% 切完。数据库拆分则是把老城中“一张超级大表”逐步拆成多个领域数据库,每个新服务只拥有自己的数据子集。
流量分流是网关的核心动作,可以用一个简单的比例模型描述:
视觉上,这就像城市入口的电子指示牌不断更新:“前往新城区的车辆占比 p,前往老城区的占比 1-p”。路还是那些路,但车流被指挥得明明白白——这就是渐进式迁移中最温柔的“软切换”。
- 总流量到达率λ_total 是单位时间内进入网关的总请求数,比如每秒 10000 次请求。
- 新系统分配比p 是分配给新系统的流量比例,灰度开始时 p ≈ 0,迁移完成后 p = 1。
- 新系统流量λ_new 等于总流量乘以 p,即新系统实际承担的请求量。
- 旧系统流量λ_old 等于总流量乘以 (1-p),随着 p 增大而逐渐归零。
五、成本优化
老城改造必须精打细算:盖新城要花钱,维护老城也在持续烧钱,搬迁过程还要投入运输和人力。财务部(对应工程团队里的 FinOps 角色)最关心的一个问题是:总成本什么时候能低于“什么都不做、继续维持老城”的成本?这就是渐进式迁移的成本优化逻辑。
迁移的成本结构由三个部分构成:旧系统运行成本(不断下降)、新系统运行成本(逐步上升后趋于稳定)、迁移投入成本(集中在前中期)。迁移初期,总成本往往会高于迁移前的水平——因为你在“双线运营”;但随着旧模块一个个下线,旧系统资源开始释放,总成本会跨过一个顶点后回落。FinOps 的核心工作就是盯着这条总成本曲线,并通过“成本动因分析”决定迁移优先级——比如把占用 GPU 资源最贵的 AI 推理服务排在最先迁移,因为它的成本收益最大。
总成本模型可以表达为:
财务部盯住总支出曲线跨过“盈亏平衡点”的那一刻,就会知道迁移项目的投资开始回本了。这也解释了为什么渐进式迁移在云上特别有价值——云资源可以按需释放,搬走一个模块就立刻停止对应的云资源计费,成本曲线比传统机房时代更陡峭地回落。
- 旧系统成本C_old(t) 是仍在运行的旧系统成本,随着模块下线而递减。
- 新系统成本C_new(t) 是新系统运行成本,随着模块上线而递增并最终稳定。
- 迁移投入C_mig(t) 是迁移过程本身的人力、工具和一次性资源投入。
- 求和关系三者按时间相加得到总成本,这是 FinOps 做成本预测和预算控制的核心公式。
六、实践案例
让我们看一个典型的 AI 云服务案例:某公司有一个承载推荐、对话、图像识别等多种能力的单体 AI 平台,所有模型推理逻辑都耦合在一个进程里,每次更新都要全量发布,GPU 资源也严重浪费。他们决定用绞杀榕模式把单体平台拆成多个服务:模型推理服务、特征服务、离线任务、统一网关。
实践中常见的坑有几个:数据不一致(新旧系统各自写库导致两边数据分叉)、依赖漏提(迁移 A 模块时发现它还隐含依赖 B 模块的数据)、回滚困难(切换流量后发现问题,但新系统已经改了数据,回滚变得复杂)。失败教训中最典型的是跳过依赖识别直接开工——就像搬迁前没看户型图,搬到一半发现水管没接通,只能停工。
一个实用的排序策略是用依赖度评估每个模块的“搬迁难度”:
那个 AI 平台的团队正是按这个思路,先迁移依赖度为 0 的“模型文件管理”小模块,再逐步推进到核心推理服务。每迁移一个模块,就做一轮线上对比验证,确认新服务的延迟和准确率不劣于旧系统。半年后,单体平台被拆成了 7 个独立服务,期间业务零中断。成功经验的本质,就是先易后难、小步验证、每步可回滚。
- 入度I(m) 表示有多少个其他模块依赖模块 m,入度越高,它被牵动的范围越大。
- 出度O(m) 表示模块 m 依赖多少个其他模块,出度越高,它自身越容易被外部牵制。
- 依赖度和两者相加得到总依赖度,这是一个模块与外部耦合紧密程度的量化指标。
七、工具与评估
老城改造指挥部需要一套完整的工具和考核体系来保证工程不跑偏。在渐进式迁移中,这对应着迁移工具链、进度度量、质量保障和团队协作四个方面。
迁移工具链包括 API 网关(路由与灰度)、数据库同步工具(如 CDC 管道)、服务网格(流量治理与可观测性)以及 CI/CD 流水线(自动化构建部署)。进度度量不能只看模块数,还要结合流量切分比例、数据同步延迟、故障次数等多个维度。质量保障方面,要在每个模块迁移前建立自动化测试和监控告警,用 SLO(服务等级目标)守住可用性红线。团队协作上,业务方、开发、运维和 FinOps 需要共同对迁移目标负责——业务方确认功能等价,开发负责改造,运维保障稳定性,FinOps 盯着成本曲线。
为了估算剩余迁移时间,团队通常要跟踪一个核心指标——迭代迁移速率:
施工队每周开一次进度会,把这个月的“搬迁楼栋数”填进进度表;工程团队则把 R 写进迭代回顾,用来预测剩余工期。如果 R 持续走低,说明遇到了系统性障碍——要么依赖没有理清,要么测试拖了后腿,这时候就要暂停迁移、回头修地基,而不是硬赶进度。
- 迁移模块增量Δn 是一个迭代周期内完成迁移的模块数量。
- 迭代周期Δt 表示一个迭代的时长,常见为两周(一个 sprint)。
- 迁移速率两者相除得到平均迁移速率 R,单位通常是“模块数/迭代”。
AI 应用场景
电商 AI 推荐服务的单体拆分
阶段:模型服务化与架构演进
解决的问题:一个电商平台的推荐系统最初是单体服务,搜索、排序、画像计算全部耦合在一个进程里,每次迭代都要全量上线,GPU 利用率低。传统做法是推倒重写,但推荐系统 7×24 在线,停机就意味着销售额损失。AI 工程师用渐进式迁移,把画像服务(离线计算)和排序服务(在线推理)先后拆成独立微服务。
具体案例:先通过 API 网关将 5% 的推荐流量切到新排序服务,用 A/B 测试验证点击率不低于旧系统,再逐步扩大到 50%、100%。整个过程持续 3 个月,推荐业务从未中断,GPU 利用率提升了 40%,单次迭代发版时间从 2 天缩短到 2 小时。
AI 云推理平台的 FinOps 成本治理
阶段:云成本优化与资源治理
解决的问题:AI 云平台上同时运行着数十个模型推理任务,单体架构下无法精细统计每个模型的资源成本,导致预算超支却找不到源头。FinOps 工程师采用渐进式迁移思路,先把成本占比最高的几个推理模块迁移到独立的 Serverless 推理服务,每迁一个就核对一次费用账单。
具体案例:在一次大模型推理平台迁移中,团队通过成本动因分析发现一个夜间离线批处理任务占了 30% 的 GPU 费用。他们优先将这个任务迁移到新的弹性调度服务,并在迁移完成后立刻释放旧集群的预留实例,单月云成本下降 22%,回收期仅 6 周。
大模型在线服务的灰度切换
阶段:模型发布与流量治理
解决的问题:某对话式 AI 产品要升级核心对话引擎,但新模型在部分场景下可能表现不稳定,不能一次性全量替换。AI 服务团队用 API 网关配置灰度路由,让 1% 的用户先体验新引擎,同时通过数据同步保证新旧引擎共享同一套用户上下文数据。
具体案例:灰度期间监控到新引擎在“多轮对话”场景的响应延迟偏高,团队立即将灰度比例回退到 0,修复后重新放量。这种“可进可退”的切换方式正是渐进式迁移风险隔离的体现,最终新引擎在 4 周内完成了 100% 接管。
Python 演示
# -*- coding: utf-8 -*-"""渐进式迁移模拟器: 按成本收益决定模块迁移顺序, 输出总成本变化""" class MigrationSimulator: def __init__(self, modules): self.modules = modules # 全部模块清单 self.migrated = [] # 已迁移模块名列表 self.pending = list(modules) # 待迁移模块列表 def rank_by_cost(self): """按日均成本降序排序, 成本高的模块优先迁移""" return sorted(self.pending, key=lambda m: m["cost"], reverse=True) def migrate_one(self): """迁移一个模块, 返回模块名; 无模块可迁则返回 None""" if not self.pending: return None target = self.rank_by_cost()[0] self.pending.remove(target) self.migrated.append(target["name"]) return target["name"] def current_cost(self): """估算当前总成本 = 旧系统残存成本 + 新系统运行成本""" old_cost = sum(m["cost"] for m in self.pending) new_cost = sum(m["cost"] * 0.6 for m in self.modules if any(g == m["name"] for g in self.migrated)) return old_cost + new_cost def report(self, step_no): """输出当前迁移进度""" total = len(self.modules) done = len(self.migrated) print(f"第{step_no}批: 已迁 {done}/{total}, 总成本 {self.current_cost():.2f}") def main(): modules = [ {"name": "推理服务", "cost": 500}, {"name": "特征服务", "cost": 300}, {"name": "统一网关", "cost": 200}, {"name": "离线任务", "cost": 80}, ] sim = MigrationSimulator(modules) old_total = sum(m["cost"] for m in modules) print(f"迁移前总成本: {old_total}") step = 1 while sim.pending: moved = sim.migrate_one() if moved is None: break print(f"本批迁移: {moved}") sim.report(step) step += 1 print("迁移完成! 完工模块: " + " -> ".join(sim.migrated)) if __name__ == "__main__": main()
return sorted(self.pending, key=lambda m: m["cost"], reverse=True)按日均成本降序排列,让“最烧钱”的模块排在最前面,对应正文中“高成本优先迁移”的策略。target = self.rank_by_cost()[0]取出当前成本最高的模块作为本批迁移目标。self.pending.remove(target)从待迁移清单中移除该模块,模拟它从旧系统剥离。self.migrated.append(target["name"])把模块名记入已迁移清单,模拟新系统正式接管。old_cost = sum(m["cost"] for m in self.pending)统计尚未迁移模块的成本总和,代表旧系统残存成本。new_cost = sum(m["cost"] * 0.6 ...)已迁移模块按 0.6 倍估算新系统运行成本,体现新架构更省资源的假设。while sim.pending:反复调度迁移,直到所有模块迁移完毕,对应渐进式迁移“逐个替换直到完成”的过程。
常见误区
误区“渐进式迁移就是边拆边看,不用画什么依赖图,小步快跑自然就把系统换完了。”
正解恰恰相反,渐进式迁移对前期分析的要求比大爆炸重构更高。你必须先画出模块依赖图、识别数据边界、确定切割顺序,否则就像老城改造没有施工图就拆墙——你不知道哪堵是承重墙,拆到一半整栋楼都可能塌。规划阶段偷的懒,会在迁移中期以“依赖漏提”“数据割裂”的形式加倍偿还。
为何常见:“渐进”这个词天然带有随意感,再加上敏捷开发强调的小步快跑深入人心,容易让人误以为渐进 = 不需要计划 = 边做边想。
误区“新旧系统同时在线,必须让两个系统都写同一份数据,否则数据会不一致。”
正解双写(同时写入新旧两套库)实现复杂、事务难保证、延迟还会翻倍,根本不是默认方案。主流做法是单向同步:旧系统继续作为数据主源,通过 CDC(变更数据捕获)把变更实时同步到新系统;切换时短暂只读或用“反向同步”缓冲。理解这个原理,就像明白搬迁时不是让居民同时住两套房,而是先把家当搬过去、确认无误再退掉老房子。
为何常见:直觉上觉得“两边都写才公平”,却忽略了数据一致性工程中“双写双难”的经典困境——分布式场景下两笔写操作的原子性极难保证。
误区“所有流量都切到新系统了,旧系统已经没有用了,赶紧关停省成本!”
正解流量切换完成不等于迁移结束。新系统可能存在长尾性能问题、数据核对尚未闭环、部分离线任务仍依赖旧系统。正确做法是保留一段观察期(通常数天到数周),只把旧系统降配而非关停,同时保留一键回滚的通道。云上资源虽是“用完即走”,但真的需要恢复旧系统时,重新拉起完整环境的成本远高于多保留几天的费用。
为何常见:FinOps 的成本压力让人急着释放资源,但忽略了“回滚能力”本身也是迁移方案的一部分——省下的钱可能不够赔一次事故。
误区“绞杀榕模式是小项目的玩具,大系统功能那么多,渐进式替换太慢了,不如推倒重来干净利落。”
正解Strangler Fig Pattern 恰恰是为大型复杂系统而生的。系统越大,一次性重写的风险越高、停机损失越大;渐进式迁移把一个巨大风险切割成几十个小风险,每个模块都能独立验证、独立回滚。亚马逊、Netflix 等公司的核心系统都是通过这种模式从单体迁移到微服务的。AI 云服务尤其适合——推理服务必须 7×24 在线,绞杀榕的“缠绕替代”几乎是唯一兼顾演进与稳定的路径。
为何常见:大系统功能众多,看起来“重新写一遍更干净”,但忽略了重写期间业务如何持续运转这个最棘手的问题。
面试题
Q1. Strangler Fig Pattern 的核心思想是什么?
- A.一次性重写全部代码后切换
- B.新旧系统共存逐步替换← 正确答案
- C.用旧系统改造出全新架构
- D.只替换数据库不替换代码
答案:B。绞杀榕模式的核心是渐进替代——新系统与旧系统并存,逐个模块替换,最后旧系统自然退场。A 是大爆炸重构;C 是改造而非替代;D 只覆盖了迁移的一种手段,都不是核心思想。
Q2. 渐进式迁移的第一步应该是?
- A.直接新建一套完整的替代系统
- B.投入所有资源重写热点模块
- C.识别模块边界与依赖关系← 正确答案
- D.把线上流量全部切换到新系统
答案:C。没有依赖图就开工,就像老城改造没有地图就拆迁,必然拆错墙。第一步永远是梳理模块边界和依赖关系。A 与渐进式背道而驰;B 跳过规划;D 是灾难性操作,不可能发生在第一步。
Q3. FinOps 在渐进式迁移中的核心关注点是?
- A.只关注新系统的资源性价比
- B.只关注旧系统的成本下降
- C.协同评估迁移全程的成本曲线← 正确答案
- D.迁移期间不进行成本核算
答案:C。FinOps 关注的是旧系统残存成本、新系统运行成本和迁移投入三者之和何时低于维持旧系统的成本。A 和 B 都只盯一头;D 会导致超支无法及时发现,都不是 FinOps 的核心。
Q4. API 网关在渐进式迁移中的作用是?
- A.将请求分流到新旧系统并调比例← 正确答案
- B.增强旧系统的代码扩展性
- C.替代数据库完成数据同步
- D.防止新系统被外部直接访问
答案:A。网关作为统一入口,按权重把流量分配给新旧系统,并支持灰度切流与回滚。B 与网关职责无关;C 是数据同步工具的职责;D 是安全策略,都不是网关在迁移中的核心作用。
Q5. 灰度切换时新系统出现严重故障,正确做法是?
- A.继续扩大灰度比例观察故障
- B.将流量快速回切到旧系统← 正确答案
- C.立刻删除旧系统的全部资源
- D.忽略故障等待新系统自愈
答案:B。渐进式迁移风险隔离的底线就是“每次切换都可回滚”——发现故障,网关把流量切回旧系统即可。A 会放大故障面;C 删掉旧系统等于自断退路;D 是对线上事故的放任,均错误。
Q6. 渐进式迁移相比“大爆炸”重写的优势有哪些?
- A.每步风险都可控且可回滚← 正确答案
- B.业务全程不中断← 正确答案
- C.不需要任何前期规划
- D.迁移期间资源成本不会增加
答案:AB。渐进式迁移把大风险切成小步骤,每步可回滚、业务连续。C 错误——它比大爆炸更依赖前期规划;D 错误——迁移初期新旧并存,成本必然短期上升。
Q7. 迁移过程中保持新旧数据一致的常用手段是?
- A.让用户手动重新录入数据
- B.通过 CDC 变更数据捕获同步← 正确答案
- C.关闭旧系统的写入让系统只读
- D.迁移期间不需要保持数据一致
答案:B。CDC 从旧库捕获 binlog 等变更日志并实时同步到新库,是主流方案。A 手动录入不现实;C 只读会影响业务;D 数据割裂会直接导致业务错误。
Q8. 规划模块迁移顺序时应考虑哪些因素?
- A.优先迁移依赖度低的模块← 正确答案
- B.优先迁移运行成本高的模块← 正确答案
- C.按迁移收益从大到小排序← 正确答案
- D.所有模块必须同时开工迁移
答案:ABC。迁移顺序综合依赖度(低依赖先迁)、成本(高成本先迁)、收益(收益大先迁)。D 是“大爆炸”思维,与渐进式迁移相悖,故不选。
Q9. 公式 S(t) = 1 − e^(−t/τ) 描述的是什么?
- A.新系统接管功能比例随时间演化← 正确答案
- B.旧系统故障率随时间的变化
- C.单个模块重写所需的总时长
- D.网络带宽随迁移时间的变化
答案:A。S(t) 表示新系统已接管的功能比例,是典型 S 形曲线:前期慢、中期加速、后期饱和。B 该公式与故障率无对应;C 与单模块耗时无关;D 与带宽无关。
Q10. 流量全部切到新系统后,旧系统仍应保留一段时间的理由有哪些?
- A.观察新系统的长尾性能问题← 正确答案
- B.保留一条紧急回滚的退路← 正确答案
- C.完成迁移前后的数据核对闭环← 正确答案
- D.保留旧系统可以抵扣云预算
答案:ABC。观察期用于验证新系统稳定性、保留回滚能力、完成数据最终核对。D 错误——保留旧资源只会增加成本,观察期结束后应尽快降配或关停。