想象你是一家川菜馆的后厨主厨。灶台上有两口锅:一口炖汤,你按钟表定好时间,每隔两小时查一次火、批量下料;另一口炒菜,顾客一落座、下单铃一响,你立刻起锅烧油,现点现炒。炖汤讲究“定时照看、批量产出”,炒菜讲究“随叫随到、单点实时”。数据管道世界里的“时间调度”与“事件驱动”,正是这两种后厨哲学的数字化翻版。 时间调度(Time Scheduling)像炖汤:定时器一到,系统把攒了一段时间的数据打包成“批”,一次性送进管道处理,积少成多、吞吐量大。事件驱动(Event-Driven)像炒菜:每一条新数据就像一张订单,一到达就立刻触发处理,随到随做、延迟极低。真实的大数据系统里,这两种模式常常同时存在——离线报表像炖汤,定时批量计算;实时推荐像炒菜,订单来了立刻响应。 这篇文章将带你从后厨走进数据管道,看懂这两种驱动模式的工作原理、成本账本与组合之道,并给出可直接运行的 Python 模拟代码。

岗位关联

对 AI 从业者而言,选对管道驱动模式直接影响系统的成本与响应速度。掌握时间调度与事件驱动,是设计可扩展数据处理系统的基本功,也是架构面试中最容易拉开差距的硬技能。

目录
  1. 可视化演示
  2. 管道模式基础
  3. 时间调度机制
  4. 事件驱动原理
  5. 两者对比权衡
  6. 混合架构设计
  7. 工程实践要点
  8. 应用场景分析
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示时间调度与事件驱动两种管道模式的触发机制、延迟特性对比,以及混合管道的编排设计。

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

时间调度 vs 事件驱动 时间调度:固定周期触发,延迟≥调度周期,资源可预测 事件驱动:数据到达即触发,延迟秒级,需常驻资源 混合模式:实时用事件驱动,离线用时间调度 Latency: Event(sec) << Schedule(hour) 两种模式各有优势,实际工程常混合使用

管道模式基础

后厨有一条看不见的流水线:客人点单、跑堂送单、配菜员备菜、炒锅师傅掌勺、传菜员出餐,任何一道菜都要依次经过这些环节。数据世界里的“管道”(Pipeline)就是这条流水线的数字化版本——原始数据像食材从入口进入,经过采集、清洗、加工等环节,最终变成可用的“成品数据”。

无论用哪种方式驱动,管道的基本形态都一样:数据在一个个环节之间流动,每个环节只做一件事,做完交给下一个环节。就像配菜员从不炒菜、炒锅师傅从不端盘,每个环节各司其职,整条流水线才能高效运转。

数据管道中,总延迟等于各环节延迟之和。环节越多、单个环节越慢,数据“出餐”越慢。因此优化的两个基本思路是:减少环节数,或让各环节并行化处理。

理解了管道骨架,下面要回答一个关键问题:这份流水线什么时候开工?是定时开火,还是有单就炒?这就是时间调度与事件驱动的分野。

L=∑i=1nli=l1+l2+⋯+lnL = \displaystyle\sum_{i=1}^{n} l_i = l_1 + l_2 + \cdots + l_n
管道总延迟等于每一个处理环节耗时之和:环节越多、单个环节越慢,数据从源头到目的地的时间就越长。
  1. 总和符号 Σ意思是“从第 1 个加到第 n 个”,把管道中每个环节的耗时全部累加起来。
    ∑i=1n\displaystyle\sum_{i=1}^{n}
  2. 下标 i 与上标 ni 是环节编号,从 1 数到 n;n 表示管道一共有 n 个环节,这里强调对每个环节逐个考察。
    i=1,2,…,ni = 1, 2, \ldots, n
  3. 单项耗时 lᵢ第 i 个环节处理一批数据平均花费的时间,单位通常是秒或毫秒。
    lil_i
  4. 展开式把求和符号展开成连加,直观看到总延迟是由各环节串行叠加而成的。
    l1+l2+⋯+lnl_1 + l_2 + \cdots + l_n

时间调度机制

炖汤师傅的后厨习惯是:每天凌晨四点半闹钟一响,把牛骨、香料、水按比例下锅,一炖两小时。时间调度就像炖汤的闹钟——它不管门外有没有客人、原料什么时候到,只按既定时刻准时开火。

时间调度管道由定时器驱动,每隔固定时间间隔 Δt 触发一次,把窗口内到达的数据攒成一批,一次性送入管道的各个处理环节。工程上常见于 Airflow 的调度间隔(schedule_interval)、Unix 的 cron 定时任务,以及各种离线数仓的批处理任务。

批的大小由数据到达速率和调度间隔共同决定。间隔太长,数据积压、延迟升高;间隔太短,批次太小、算力被白白浪费。这就是时间调度最核心的“度”的把握。

“定时开火”的最大优点是结果可预期、吞吐量高;最大缺点则是数据必须在缓冲区里等着“下一班车”,天然存在等待延迟。

B=R×ΔtB = R \times \Delta t
一次定时触发所处理的数据量(批大小),等于数据平均到达速率乘以调度间隔。间隔越长、到达越快,单批数据越大。
  1. 批大小 B时间调度每触发一次,管道一次性处理的记录条数,单位是“条/批”。
    BB
  2. 到达速率 R单位时间内新到达的数据条数,刻画数据源的“来料速度”,单位是“条/秒”。
    RR
  3. 调度间隔 Δt前后两次定时触发之间经过的时间,是时间调度器最重要的配置参数。
    Δt\Delta t
  4. 乘积关系批大小等于两个量相乘——速率越快或间隔越长,窗口内攒下的数据就越多。
    R×ΔtR \times \Delta t

事件驱动原理

炒菜师傅的思路完全相反:门铃一响、顾客下单,立刻起锅烧油。事件驱动管道正是如此——每一条数据的到达本身就是触发信号,不等不攒,立刻送入管道处理。

在事件驱动的体系里,数据源产生一个事件(用户点击、订单提交、传感器读数),事件通过消息队列传送给消费者,消费者马上把事件推入管道的各个环节。消息队列相当于后厨的“传菜窗口”:即使厨师一时忙不过来,订单也能在窗口排队,不会被弄丢。

消息队列最大的价值是解耦:生产者只管发消息,消费者只管收消息,双方互不干扰。事件驱动让排队等待时间趋近于零,因此总延迟几乎等于纯粹的处理时间。

事件驱动让数据“随到随做”,响应极快,但代价是每个事件都要单独占用一次完整的处理资源,成本会随流量线性上涨。

E=tq+tpE = t_q + t_p
一条事件从产生到处理完成的总耗时,等于排队等待时间加上处理时间。事件驱动优化的核心目标,就是让排队时间 t_q 趋近于零。
  1. 事件延迟 E端到端总耗时,衡量事件驱动系统响应快慢的核心指标。
    EE
  2. 排队时间 t_q数据到达后在缓冲区等待被处理的时间。事件驱动模式下这条量趋近于零。
    tqt_q
  3. 处理时间 t_p管道各环节实际加工数据花费的时间,由计算资源与算法复杂度决定。
    tpt_p

两者对比权衡

炖汤便宜量大但定时,现炒灵活快速但费灶头。聪明的后厨不会只靠一种模式应对所有菜品——数据管道同样需要在两种模式之间权衡取舍。

对比可以从三个维度展开。延迟:时间调度存在凑批等待,延迟以分钟到小时计;事件驱动几乎零等待,延迟以毫秒到秒计。成本:定时批量可以摊薄固定开销(如启动计算集群、加载模型),事件驱动每条数据独立处理,单位成本更高。复杂度:定时调度实现简单、易于排查;事件驱动需要消息队列、幂等消费、乱序处理等一整套基础设施。

工程上可以用一个成本模型来帮助决策:总成本 = 固定成本 × 运行时间 + 可变成本 × 处理数据量。定时调度对应高固定成本、低可变成本;事件驱动对应低固定成本、高可变成本。

没有绝对的好坏——食堂大锅饭适合定时批量,高档餐厅适合全现炒,而大多数餐厅是两种模式混着用。

C=cf×T+cv×NC = c_f \times T + c_v \times N
管道总成本等于固定成本乘以运行时长,加上可变成本乘以处理的数据量。时间调度固定成本高但单位成本低,事件驱动则相反。
  1. 总成本 C管道在给定时间窗口内花费的全部资源成本,通常折算为计算与存储费用。
    CC
  2. 固定成本 c_f无论处理多少数据都要付出的开销,比如集群的基准费用、模型常驻内存。
    cfc_f
  3. 运行时长 T管道保持运行的时间长度。时间调度通常一天只跑固定几小时。
    TT
  4. 可变成本 c_v每处理一条数据产生的边际开销,包括单条消息的计算、网络与存储消耗。
    cvc_v
  5. 数据量 N在运行时间内实际处理的总记录条数,事件驱动下与流量成正比。
    NN

混合架构设计

聪明的后厨会这样做:招牌菜提前炖好(定时批量),客人单点的特色菜现炒(事件驱动),出餐口根据订单情况动态调配。数据系统同样可以同时拥有两台“灶台”。

混合架构通常包含两层:事件驱动的实时处理层,负责低延迟响应,比如实时特征计算、实时告警;时间调度的批量聚合层,负责高效汇总、入库、生成报表。两层共用同一份原始数据,各取所需。

两轨并行会遇到一个棘手问题:迟到事件。一条事件在实时层已经被处理,但跑到批量层时,它所属的时间窗口可能已经关闭。这时需要引入水位线(Watermark)机制——它像后厨的“最后加菜时限”:超过这个时间点的加单不再进入本桌的菜品,直接放入下一轮。

水位线既保证大多数订单能准时上桌,又避免后厨为极少数迟到订单无休止等待——这是混合架构调和实时与批量的核心智慧。

W=Tbatch+TslackW = T_{\text{batch}} + T_{\text{slack}}
水位线等于正常批处理窗口时长加上迟到容忍时间。事件晚于水位线到达,就不再进入当前批次,转而归入下一批。
  1. 水位线 W批量层决定“窗口何时关闭”的截止时刻,是混合架构中最关键的参数。
    WW
  2. 批处理窗口 T_batch一批数据所覆盖的正常时间范围,比如按 5 分钟为一窗。
    TbatchT_{\text{batch}}
  3. 迟到容忍 T_slack允许事件晚到多久仍能进入当前批次的缓冲时间。
    TslackT_{\text{slack}}
  4. 求和关系水位线由正常窗口加宽容许时间组成,兼顾了“等齐数据”与“及时结算”两个目标。
    Tbatch+TslackT_{\text{batch}} + T_{\text{slack}}

工程实践要点

后厨要立规矩:菜炒糊了必须重做(重试),同一张订单不能重复上菜(幂等),每道菜出锅前都要经过传菜口检查(监控质检)。数据管道同样需要这三条保命法则。

定时管道可能因上游数据迟到而失败,事件管道可能因消费者崩溃而重复消费。如果处理不好,一次失败就会引发连锁反应:重试请求像潮水一样涌来,把系统彻底压垮——这就是著名的重试风暴。

正确的做法是指数退避:第一次失败等 2 秒重试,第二次等 4 秒,第三次等 8 秒……让重试节奏越来越稀疏,给系统留出恢复的时间。

除了指数退避,幂等性保证“同一事件处理两遍与处理一遍结果相同”,配合监控看板(像厨房摄像头),工程师才能及时发现“哪口锅糊了”并快速补救。

tn=t0×2nt_n = t_0 \times 2^n
第 n 次重试前需要等待的时间,以初始等待时间为基数指数翻倍。等待时间随重试次数快速拉长,避免重试风暴。
  1. 第 n 次等待 t_n第 n 次重试前必须休眠的时长,n 从 0 开始计数。
    tnt_n
  2. 初始等待 t_0第一次失败后等待的基础时长,通常设为几百毫秒到几秒。
    t0t_0
  3. 指数倍增 2ⁿ每多一次重试,等待时间就翻一倍,这是退避策略的核心。
    2n2^n
  4. 整体关系初始等待乘以 2 的 n 次幂,重试越频繁间隔越大,压力逐渐释放。
    t0×2nt_0 \times 2^n

应用场景分析

后厨模式要依据餐厅定位来选:食堂用大锅炖(离线批处理),外卖小炒店现炒(实时响应),酒楼两者结合(混合架构)。数据管道选型同样要“看菜下锅”。

选型前先问三个问题:业务能容忍多大延迟?数据量有多大?能承担多少成本?延迟要求秒级以内,选事件驱动;延迟要求小时级以上,选时间调度;两者都要,就用混合架构。比如用户点击推荐、风控拦截这类场景依赖事件驱动,而每日财报、模型日训练数据走时间调度即可。

无论哪种模式,最终都要用 SLA 指标来验收——即数据“按时交付”的比例。它像餐厅的评价分数,直接反映后厨整体运转质量。

没有最好的模式,只有最合适的模式。理解两种驱动的原理与权衡,你就能像资深主厨一样,为每一道数据“菜”挑选正确的灶台。

η=NokNtotal×100%\eta = \frac{N_{\text{ok}}}{N_{\text{total}}} \times 100\%
按时交付率等于按时完成处理的数据量除以总数据量。它是衡量管道调度质量的核心指标,直接对应业务承诺的 SLA。
  1. 按时交付率 η在约定时间内完成处理的数据占比,越高说明调度越可靠。
    η\eta
  2. 按时完成数 N_ok在 SLA 规定时间内成功处理完的数据条数。
    NokN_{\text{ok}}
  3. 总数据量 N_total进入管道的全部数据条数,包括迟到、失败和超时的记录。
    NtotalN_{\text{total}}
  4. 百分比换算两者相除再乘以 100%,得到方便与业务方对齐的百分比指标。
    NokNtotal×100%\frac{N_{\text{ok}}}{N_{\text{total}}} \times 100\%

AI 应用场景

场景 1:电商实时推荐管道

阶段:数据管道设计 / 实时特征服务

解决的问题:用户点击行为是典型的事件流。传统做法每 5 分钟批量跑一次特征管道,用户从点击到看到推荐结果延迟数分钟,转化率明显下降。事件驱动管道让点击事件通过消息队列即时进入特征计算,实现秒级更新。

具体案例:用户在电商 App 浏览某商品后,行为事件即刻进入 Kafka 队列,事件驱动管道实时更新该用户的候选商品特征向量,推荐服务在 1 秒内刷新首页推荐位。

场景 2:每日离线报表管道

阶段:批处理调度 / 数据仓库

解决的问题:经营报表、模型日训练数据不需要秒级响应,更适合用时间调度固定在凌晨低峰期批量计算,T+1 交付,兼顾成本与稳定性。

具体案例:数据团队用 Airflow 设定每日 02:00 触发全量聚合管道,将前一日订单数据清洗、汇总后写入数据仓库,早上 8 点管理层即可查看昨日经营报表。

场景 3:混合日志分析管道

阶段:可观测性数据管道

解决的问题:业务日志既需要实时告警(事件驱动),又需要每小时聚合统计(时间调度)。单一驱动模式难以同时满足两种需求,混合架构并行处理。

具体案例:微服务日志进入事件驱动管道实时计算错误率并触发告警;同时每条日志写入分桶,由定时管道每小时聚合成趋势报表,供容量规划使用。

Python 演示

python84 行
# -*- coding: utf-8 -*-"""调度与事件驱动管道模式最小模拟:对比定时批量与实时单条处理"""import random  class Pipeline:    """数据管道:依次完成清洗与特征加工两个环节"""     def __init__(self, name):        self.name = name        self.processed = 0     def run(self, items):        result = []        for item in items:            item = self._clean(item)            item = self._feature(item)            result.append(item)            self.processed += 1        return result     def _clean(self, item):        return item if item > 0 else 0     def _feature(self, item):        return int(item * 1.5)  class TimeScheduler:    """时间调度器:每 interval 个时间单位打包处理一批"""     def __init__(self, pipeline, interval):        self.pipeline = pipeline        self.interval = interval        self._countdown = interval     def tick(self, queue):        if not queue:            return 0        self._countdown -= 1        if self._countdown > 0:            return 0        batch = []        for _ in range(min(4, len(queue))):            batch.append(queue.pop(0))        self.pipeline.run(batch)        self._countdown = self.interval        return len(batch)  class EventDriven:    """事件驱动:数据到达立刻送入管道,不做等待"""     def __init__(self, pipeline):        self.pipeline = pipeline     def push(self, item):        self.pipeline.run([item])        return 1  def main():    rng = random.Random(42)    queue = [rng.randint(-5, 20) for _ in range(40)]    time_pipe = Pipeline("定时管道")    event_pipe = Pipeline("事件管道")    timer = TimeScheduler(time_pipe, interval=4)    trigger = EventDriven(event_pipe)     for cur in range(30):        n = timer.tick(queue)        if n:            print("[%02d] 定时触发:打包处理 %d 条" % (cur, n))        if queue and cur % 3 == 0:            item = queue.pop(0)            trigger.push(item)            print("[%02d] 事件触发:实时处理 1 条 -> %d" % (cur, item))     print("定时管道共处理 %d 条,事件管道共处理 %d 条"          % (time_pipe.processed, event_pipe.processed))  if __name__ == "__main__":    main()
目的:用同一份模拟数据源,分别驱动“定时批量”与“事件实时”两条管道,直观对比两种模式的处理节奏与吞吐差异。
  1. self.processed = 0记录管道累计处理的数据条数,用于最后对比两条管道的吞吐量。
  2. def run(self, items)管道主入口,依次执行清洗与特征加工两个环节。
  3. self._clean(item)模拟数据清洗:负值一律归零,代表剔除脏数据。
  4. self._feature(item)模拟特征加工:将原始数值放大 1.5 倍并取整。
  5. self._countdown = interval调度器倒计时初始化,保证首次触发发生在完整间隔之后。
  6. if self._countdown > 0 or not queue:未到触发时刻或队列为空则跳过本轮,体现“到点才开工”。
  7. batch = []攒批:从队列头部取出最多 4 条数据组成一个批次。
  8. self.pipeline.run(batch)将整批数据一次性送入管道,模拟批量处理。
  9. self._countdown = self.interval触发结束后重置倒计时,进入下一个调度周期。
  10. def push(self, item)事件驱动的入口:数据一到立刻调用管道处理。
  11. rng.randint(-5, 20)生成混合正负值的模拟数据源,用来验证管道清洗逻辑。

常见误区

误区很多初学者认为只要把管道改成事件驱动,系统就会“更快”,延迟一定更低,于是把所有性能问题都归咎于没用事件驱动。

正解事件驱动只消除了“凑批等待”的排队时间,但处理速度仍取决于下游算力、网络带宽和算法复杂度。在低数据量下,两种模式的延迟差异微乎其微;而时间调度的批量模式在同等算力下吞吐量反而更高。就像小炒店人少时上菜也快,但客流一大,一口锅的现炒能力就远远比不上提前炖好的大锅汤。

为何常见:宣传材料总强调“实时”比“批量”快,让初学者忽略了吞吐与成本之间的权衡。

误区既然实时效果更好,那把离线报表、模型训练这些管道全部改成事件驱动,岂不是一步到位。

正解事件驱动要求消息队列、幂等消费、乱序处理、水位线管理等一整套基础设施,成本和运维复杂度显著上升。每日财报、月度模型重训这类周期性任务,用时间调度更省心。如同后厨里炖汤永远比每桌客人单独开灶划算,批量任务的场景强上事件驱动是巨大的浪费。

为何常见:把“实时”当成万能解药,没有按任务特性做技术选型。

误区初学者常以为定时管道无非是配一个 cron 定时跑脚本,调度器本身没什么可学的。

正解时间调度远不止触发器,还包括批窗口大小(Δt)的计算、错过触发点的补偿策略、批内数据完整性判断,以及失败重试与告警联动。cron 只是“闹钟”,而“什么时候备料、备多少料、料坏了怎么办”这些调度决策才是核心。

为何常见:入门教程总拿 cron 举例,容易让人把“触发”与“调度”混为一谈。

误区不少人认为一条管道只能选一种驱动模式,选了定时就不能响应事件,选了事件就不能做批量。

正解现代数据平台普遍采用混合架构:同一套数据既可以走事件驱动实时层做秒级响应,也可以由时间调度批量层做高效汇总。水位线机制专门用来调和两条轨道。就像后厨既炖汤又接小炒订单,两种灶台并行不悖。

为何常见:教材为了对比清晰常把两种模式对立起来,导致读者误以为必须二选一。

面试题

Q1. 时间调度管道最典型的触发方式是哪种?

单选题 · easy

  • A.数据到达立即处理
  • B.按固定时间间隔触发← 正确答案
  • C.随机不定期地运行
  • D.完全依赖人工手动触发

答案:B。时间调度的本质就是依据固定时间间隔触发批处理,像闹钟到点就响;数据到达立即处理是事件驱动的特征。随机运行和人工手动都不属于规范调度,因此选 B。

Q2. 事件驱动管道最突出的优势是什么?

单选题 · easy

  • A.批量吞吐量最大
  • B.端到端延迟最低← 正确答案
  • C.架构实现最简单
  • D.运行成本最便宜

答案:B。事件驱动让数据“随到随做”,排队等待时间趋近于零,因此端到端延迟最低。但它的吞吐量低于批量模式、实现复杂度和运行成本也更高,故其余选项错误。

Q3. 若数据到达速率 R = 100 条/秒,调度间隔 Δt = 60 秒,按公式 B = R × Δt 计算,单批处理多少条数据?

单选题 · mid

  • A.约 100 条
  • B.约 600 条
  • C.约 6000 条← 正确答案
  • D.约 60000 条

答案:C。批大小等于到达速率乘以调度间隔:100 × 60 = 6000 条。选项 A 忽略了间隔,B 把速率看成 10,D 多乘了一个 10,都不符合公式。

Q4. 在事件驱动管道中,消息队列的核心作用是什么?

单选题 · mid

  • A.按固定时间批量打包数据
  • B.解耦生产者与消费处理方← 正确答案
  • C.只负责传输纯文本消息
  • D.彻底消除全部处理延迟

答案:B。消息队列像后厨的传菜窗口,让生产者和消费者互不等待、独立伸缩,这是解耦价值。它不负责定时打包,也不限于文本消息,更无法消除处理本身耗时,故 A、C、D 错误。

Q5. 混合架构中水位线(Watermark)主要解决什么问题?

单选题 · mid

  • A.判断乱序事件可结算的时机← 正确答案
  • B.提升批处理管道的吞吐量
  • C.减少服务器内存的占用
  • D.替代消息队列的传输职责

答案:A。水位线决定窗口何时关闭,用来处理乱序和迟到事件——晚于水位线的事件归入下一批。它与吞吐量、内存优化、消息传输无关,故选 A。

Q6. 指数退避重试中 t₀ = 2 秒,n = 3 时,下一次重试前需等待约多久?

单选题 · hard

  • A.约 6 秒
  • B.约 8 秒
  • C.约 16 秒← 正确答案
  • D.约 32 秒

答案:C。根据公式 tₙ = t₀ × 2ⁿ,代入 t₀ = 2、n = 3,得到 2 × 8 = 16 秒。6 秒是加法式思维,8 秒误把 n 当乘数,32 秒多算了一次翻倍,均不正确。

Q7. 以下场景最适合纯时间调度管道的是哪个?

单选题 · mid

  • A.用户点击行为的实时记录
  • B.每日凌晨的财务报表统计← 正确答案
  • C.在线商品库存的实时扣减
  • D.聊天消息的即时送达推送

答案:B。财务报表是典型的周期性任务,延迟几小时可接受,适合时间调度批量计算。点击记录、库存扣减、消息推送都要求秒级响应,更适合事件驱动。

Q8. 相比事件驱动,时间调度管道的劣势包括哪些?

多选题 · mid

  • A.数据存在凑批等待延迟← 正确答案
  • B.对强实时场景响应不足← 正确答案
  • C.批量吞吐能力比较低
  • D.零星数据也需攒够一批← 正确答案

答案:ABD。时间调度必须等固定时间窗口凑够一批才处理,所以有凑批等待延迟、对实时场景响应不足、零星数据也要等。但它的批量吞吐能力恰恰是优势而不是劣势,故 C 错误。

Q9. 事件驱动管道工程化落地通常需要哪些配套能力?

多选题 · hard

  • A.引入消息队列做缓冲解耦← 正确答案
  • B.消费端保证重复处理幂等← 正确答案
  • C.严格禁止一切形式的重试
  • D.处理乱序与迟到的数据← 正确答案

答案:ABD。事件驱动需要消息队列解耦生产者与消费者,消费端要保证幂等以避免重复处理,还要用水位线等机制处理乱序迟到数据。完全禁止重试不现实也不合理,系统故障时需要指数退避重试,故 C 错误。

Q10. 管道总延迟公式 L = Σlᵢ 说明的核心道理是什么?

单选题 · easy

  • A.总延迟等于各环节延迟之和← 正确答案
  • B.总延迟只取决于网络带宽
  • C.总延迟与环节数量无关
  • D.总延迟等于最快环节的耗时

答案:A。公式把每个环节的耗时累加起来,说明管道总延迟是各环节延迟的串行和。它不只取决于网络,也随环节数增加而增加,更不等于最快环节耗时,故 A 正确。