面试知识

3.1.8 WMS(仓储管理系统)、IoT(物联网)、支付项目与综合题库

30-Linux网络与Netty 面试知识整理。

3.1.8 WMS(仓储管理系统)、IoT(物联网)、支付项目与综合题库

本册把 Linux(操作系统)资源与进程文件系统与 I/O(输入输出)TCP/IP(传输控制协议/互联网协议)HTTP(超文本传输协议)/HTTPS(安全超文本传输协议)/MQTT(消息队列遥测传输协议)epoll(事件轮询机制)与 Reactor(反应器模型)以及 Netty(网络通信框架)运行时串成项目事故证据链。文中主机标识、地址、单号、流量和阈值均为教学演绎;生产操作必须限定权限、对象、时长和回滚条件。

flowchart LR
    U["用户或设备"] --> E["网关与代理"]
    E --> K["Linux(操作系统)内核与套接字"]
    K --> N["Netty(网络通信框架)事件循环"]
    N --> B["业务线程与状态机"]
    B --> F["文件、数据库或第三方"]
    F --> R["响应、回调或消息"]
    R --> O["指标、日志、追踪与对账"]
flowchart TB
    S["现象与影响"] --> T["统一时钟并保存现场"]
    T --> H["提出可证伪的分层假设"]
    H --> A["第一证据:确定异常形态"]
    A --> B["第二证据:跨层交叉验证"]
    B --> C{"能否解释时间先后和业务影响"}
    C -- "不能" --> H
    C -- "能" --> X["止血并声明回滚条件"]
    X --> L["长期修复与同量级回归"]
事故层级第一证据第二证据不能直接推出的结论
主机/容器mpstatvmstat、控制组统计业务延迟、进程和线程样本主机忙不等于目标进程是根因
进程/线程pidstat、线程栈、事件循环延迟队列年龄、方法耗时、下游时序热点线程不等于框架缺陷
文件/设备iostatpidstat -d、同步刷盘耗时文件增长、脏页、任务时序%util=100 不必然表示设备饱和
套接字/网卡ssnstatsar、网卡计数受限抓包、代理与应用日志重传不自动证明服务端有问题
远端依赖分段耗时、请求标识、渠道状态主动查单、对账、服务端日志超时不等于业务失败
项目正常能力目标主要失败窗口最终正确性边界
WMS(仓储管理系统)库存2,000 次/秒预占,P99(99 分位响应时间)低于 180ms数据库锁、队列、重传、线程阻塞条件更新、唯一流水、状态机
异步导出300 个并发任务,单文件 2GiB(吉字节)内存、脏页回写、磁盘等待分片、配额、可恢复任务状态
跨境物流5 万票/小时轨迹同步高 RTT(往返时间)、证书、代理与供应商限流运单事件幂等、游标、补偿
支付800 次/秒通知与查单陈旧连接、渠道超时、重复回调幂等、状态机、查单、对账
Runner(执行器)2 万定时任务按优先级执行阻塞、线程池堆积、下游放大租约、任务状态、限并发
IoT(物联网)10 万长连接、2 万消息/秒重连风暴、小包软中断、重复消息设备事件标识、聚合与削峰

1. 项目案例与证据闭环

1.1 统一事故模板、时间线与证据责任

一个可复述的项目事故必须把事实、推断和动作分开。事实包括业务影响、异常窗口、对象范围和原始指标;推断必须能被第二证据推翻;动作要写明预期信号、风险和回滚。统一模板固定为“量级与目标、正常时序、故障时序、影响、主机/容器/进程/线程/文件/套接字/网卡/远端证据、错误判断、根因、止血、回滚、修复、监控和回归”。时间统一到毫秒级并记录时区,避免把代理、应用和第三方的异步日志错误拼接成因果。

sequenceDiagram
    participant C as "值班指挥"
    participant M as "监控系统"
    participant H as "主机与容器"
    participant A as "应用与事件循环"
    participant D as "远端依赖"
    M->>C: P99(99 分位响应时间)与错误率告警
    C->>M: 固定窗口、版本、流量与影响
    C->>H: 采集资源、文件、套接字、网卡证据
    C->>A: 采集线程、队列、请求标识和状态机
    C->>D: 核对远端流水、限流与处理时点
    C->>C: 区分触发原因、放大器和暴露缺陷
记录项必须回答合格示例
量级峰值、基线、资源配额峰值 2,000 次/秒,8 核,容器限额 4 核
时间谁先变、采样窗口是否一致10:03 远端超时,10:04 重试升高,10:05 本机排队
证据第一信号和独立第二信号重传率升高 + 受限抓包同流缺段
动作预期、风险、回滚限制重试,若成功率下降 2% 立即回滚
验证原指标和业务结果同流量下延迟、队列、错误率与状态一致恢复

数据演绎 1:同一“超时”三条路径。 基线 P99(99 分位响应时间)为 160ms。路径甲在 10:01 出现容器节流 35%,线程运行队列从 3 增到 19,而重传稳定;路径乙在 10:02 出现设备 await=85ms、同步刷盘 P99(99 分位响应时间)为 220ms,而处理器空闲 45%;路径丙在 10:03 出现重传率 2.8%、套接字重传计数增长而应用处理仍为 35ms。三者输出都可能是 504,但止血分别是降并发/扩配额、暂停导出/隔离磁盘、限制重试/切链路,不能共用“重启服务”。

热门面试题

  1. 问题(基础题):项目事故为什么要先统一时间窗口和对象边界?

    • 考点:时序、采样对象和相关性边界。
    • 回答思路:说明不同层日志错位如何制造伪因果。
    • 详细答案:主机、容器、代理、应用和第三方可能使用不同采样周期与时钟。若不先统一时区、请求标识、实例和起止时间,容易把事故后的重试流量当成事故原因,也会把另一实例的资源曲线嫁接到当前请求。正确做法是先固定影响面、版本、实例、容器和请求标识,再比较各信号谁先变化。
    • 进阶追问:时钟不能完全同步怎么办?
    • 进阶回答:用同一请求在各层的单调序号、代理接收时间和服务端流水校准偏移,并把不确定区间写入结论。
  2. 问题(原理题):为什么第一证据不能直接等于根因?

    • 考点:可证伪假设和独立交叉验证。
    • 回答思路:区分异常形态、触发原因和放大因素。
    • 详细答案:第一证据通常只说明某层异常,例如处理器高、磁盘等待或重传增长;它可能是正常负载,也可能是下游超时后的重试放大。根因至少要解释业务影响、时间先后和两类独立证据,并在改变关键变量后按预期恢复。否则只能记为候选,而不是确定结论。
    • 进阶追问:什么是独立第二证据?
    • 进阶回答:来源或机制不同、不会由同一个采集错误同时制造的信号,例如套接字重传计数与受限抓包缺段。
  3. 问题(项目题):怎样避免事故复盘沦为命令清单?

    • 考点:问题驱动的证据链。
    • 回答思路:让每条命令回答一个假设并预先声明分支。
    • 详细答案:先写现象、主假设和可推翻条件,再选择最小命令。每个输出要解释对象、字段、正常参照和异常阈值,随后用第二信号决定进入处理器、存储、网络或远端分支。最后必须落到止血、回滚、长期修复与原命令回归;不能因为执行过很多工具就宣称定位完成。
    • 进阶追问:什么时候可以先止血后取证?
    • 进阶回答:资损或全站不可用时优先用可回滚动作降低影响,同时尽量自动保存低开销现场;局部慢且可控时可先补足证据。

1.2 WMS(仓储管理系统)库存接口抖动与防超卖

库存预占入口峰值 2,000 次/秒,正常链路为网关校验、业务幂等流水、数据库条件扣减、事件发布和结果返回。一次大促中 P99(99 分位响应时间)从 170ms 升至 2.6s,不能先说“数据库慢”或“网络慢”。证据显示宿主机空闲 38%、容器无节流;应用线程有 120 个等待库存行锁;套接字重传率仅 0.03%;数据库同一热点 SKU(库存单位)锁等待 1.8s。触发原因是活动把 72% 请求集中到一个 SKU(库存单位),放大因素是客户端 200ms 固定间隔重试,暴露缺陷是没有按剩余时间预算拒绝过期请求。

sequenceDiagram
    participant C as "下单客户端"
    participant G as "网关"
    participant W as "WMS(仓储管理系统)库存服务"
    participant DB as "库存数据库"
    participant Q as "事件队列"
    C->>G: 预占 orderLine=OL-9001
    G->>W: 业务键、数量、截止时间
    W->>DB: 插入唯一流水并条件扣减
    alt 正常
        DB-->>W: 影响 1 行,提交成功
        W->>Q: 发布预占事件
        W-->>C: RESERVED
    else 热点锁等待超过剩余预算
        W-->>C: BUSY,不发起无界重试
    end
候选原因关键证据排除证据正确动作
主机算力不足运行队列、每核利用率、节流空闲 38%、无节流不盲目扩线程
网络重传重传增量、受限抓包重传率 0.03%排除为主因
连接队列监听/全连接队列溢出队列无丢弃不修改内核参数
数据库锁等待链、热点键、事务时长同键占 72% 请求分散热点、缩事务、限重试
事件循环阻塞循环延迟、线程栈循环 P99(99 分位响应时间)2ms排除框架主因

数据演绎 2:热点库存抖动。 T0 可用库存 5,000,热点 SKU(库存单位)并发 1,440 次/秒;T1 一个批量校准事务持锁 1.4s;T2 120 个请求排队,客户端每 200ms 重试使入口升至 4,800 次/秒;T3 线程池占满并向其他 SKU(库存单位)传播超时。止血为暂停校准、热点键限流和禁止过期请求进入数据库;回滚条件是预占成功率下降超过 2%。长期修复把校准拆成短事务,使用唯一预占流水和带库存条件的原子更新。回归在相同热点比例下达到 2,100 次/秒,P99(99 分位响应时间)165ms,锁等待 P99(99 分位响应时间)低于 20ms,库存与流水差异为 0。

热门面试题

  1. 问题(基础题):库存接口超时为什么不能直接归因于网络?

    • 考点:端到端分层和结果未知。
    • 回答思路:列出排队、锁、事件循环、传输和远端五个阶段。
    • 详细答案:超时只表示调用方未在预算内收到结果。请求可能在网关排队、应用线程等待、数据库锁等待、响应传输重试或客户端池获取阶段。要用分段耗时和两类证据定位,并查询预占流水确认是否已经扣减;直接重试可能把锁竞争和超卖风险同时放大。
    • 进阶追问:网络正常能否证明数据库锁是根因?
    • 进阶回答:不能,还需锁等待链、热点键分布和缩短持锁事务后的对照恢复。
  2. 问题(原理题):热点库存为什么会从局部锁等待演化为全站抖动?

    • 考点:共享线程池、重试放大和队头阻塞。
    • 回答思路:按锁等待、在途量、线程耗尽和其他键饥饿的时序解释。
    • 详细答案:热点键事务串行使请求长时间占用连接和工作线程;固定间隔重试增加同一键在途量,线程池与数据库连接池被占满,其他 SKU(库存单位)即使无锁也拿不到执行资源。若网关和客户端继续重试,连接队列与日志又成为放大器,因此必须在入口按剩余预算和热点维度背压。
    • 进阶追问:加大线程池为何常常更差?
    • 进阶回答:串行锁的服务率未提高,只增加等待事务、连接、内存和上下文切换,还会扩大数据库压力。
  3. 问题(项目题):库存防超卖最终为什么不能只依赖分布式锁?

    • 考点:锁失效与权威数据约束。
    • 回答思路:把互斥优化和最终正确性分开。
    • 详细答案:分布式锁可能租约过期、主从切换或持有者停顿,不能作为唯一账本。最终边界应由数据库库存条件更新、业务流水唯一约束和合法状态迁移保证;锁可以减少热点并发,但即使锁失效,条件更新仍不能让可用量为负,重复请求也只能命中既有流水。
    • 进阶追问:如何验证没有重复扣减?
    • 进阶回答:按订单行核对唯一预占流水、库存变化和事件数量,并在超时重试、进程终止和重复消息下做回归。

1.3 WMS(仓储管理系统)批量导出、文件系统与磁盘等待

异步导出高峰有 300 个任务,单任务扫描 80 万行并生成约 2GiB(吉字节)文件。正常设计按 5,000 行分片读取、流式编码、临时文件写入、同步关键元数据、原子改名并上传对象存储。事故中 64 个任务同机并行,进程堆并未溢出,但脏页达到 18GiB(吉字节),设备 await 从 4ms 升至 96ms,支付流水同步刷盘也被拖慢。根因是导出与交易日志共享设备且并发准入只看线程数,暴露了设备服务时间和脏页回写没有进入容量模型。

sequenceDiagram
    participant R as "导出请求"
    participant J as "任务执行器"
    participant M as "内存缓冲"
    participant P as "页缓存"
    participant D as "块设备"
    participant O as "对象存储"
    R->>J: 创建可恢复任务
    loop 每 5,000 行
        J->>M: 编码当前分片
        M->>P: 写入临时文件
        P-->>J: write 返回
    end
    J->>D: 同步关键数据
    D-->>J: 稳定落盘
    J->>O: 分段上传与校验
    O-->>J: 完成,记录下载地址
观测层正常事故解释
任务并发864超过设备服务能力
脏页2GiB(吉字节)18GiB(吉字节)write 快不代表已落盘
设备 await4ms96ms请求在块层排队
导出吞吐320MiB(兆字节)/秒115MiB(兆字节)/秒并发越高总吞吐反降
支付同步刷盘7ms190ms共享设备造成跨业务干扰

数据演绎 3:导出拖慢交易。 T0 8 个导出任务稳定运行,设备队列深度 3;T1 调度错误放入 64 个任务,前 20 秒页缓存吸收写入,应用误以为吞吐提升;T2 脏页阈值触发集中回写,队列深度升至 71,导出线程进入不可中断等待;T3 支付流水同步刷盘 P99(99 分位响应时间)升至 190ms。止血是暂停低优先导出、保留已完成分片并限制每机 8 个;若交易延迟未在 5 分钟恢复则把导出流量切到隔离节点。长期按设备实测吞吐、单任务写速率和交易预留计算并发,并拆分存储。回归 8 个并发下连续 2 小时,队列深度低于 8、交易刷盘 P99(99 分位响应时间)低于 12ms、任务可从最后分片恢复。

热门面试题

  1. 问题(基础题)write 返回成功是否表示导出文件已经稳定落盘?

    • 考点:页缓存、回写和持久化边界。
    • 回答思路:区分用户态复制、页缓存和设备稳定介质。
    • 详细答案:通常只表示数据已复制到内核页缓存并更新文件状态,后续仍可能在回写队列中。是否需要同步取决于故障语义;导出可通过可恢复分片重新生成,而支付流水等关键数据需要更强持久化策略。不能为追求安全对每个小块都同步刷盘,否则会放大延迟。
    • 进阶追问:为什么前 20 秒看起来一切正常?
    • 进阶回答:页缓存暂时吸收写入,脏页积累到回写阈值后才暴露设备真实服务率和排队。
  2. 问题(原理题):为什么增加导出并发反而降低总吞吐?

    • 考点:设备队列、寻址、写放大和上下文切换。
    • 回答思路:用到达率超过服务率解释排队和尾延迟。
    • 详细答案:当聚合写入速率超过设备与文件系统服务率,更多任务只会增加队列深度、缓存竞争、写放大和线程等待;设备延迟上升后每个任务更慢,总完成率甚至下降。并发上限应由实测吞吐、单任务速率、交易预留和恢复目标共同计算,而不是等于线程数。
    • 进阶追问%util=100 是否足够证明饱和?
    • 进阶回答:不够,还要看设备类型、await、队列深度、吞吐、请求大小和业务延迟;并行设备可在高利用率下仍有余量。
  3. 问题(项目题):异步导出如何同时做到低内存和可恢复?

    • 考点:流式处理、检查点和幂等任务。
    • 回答思路:描述分片读取、临时文件、进度持久化和原子发布。
    • 详细答案:任务只保留当前分片,按稳定排序键读取并流式编码;每完成一段记录游标、校验和与临时对象编号。失败后从最后确认点继续,最终合并或完成分段上传,再以条件更新发布下载地址。取消和重试使用同一任务标识,临时文件按租约清理,避免重复占空间。
    • 进阶追问:怎样避免导出影响交易?
    • 进阶回答:独立线程池、队列、节点和存储优先级,按设备水位动态限并发,并对交易保留明确容量。

1.4 跨境物流轨迹同步、高 RTT(往返时间)与上下游契约

轨迹平台每小时同步 5 万票,连接国内服务、海外代理和承运商。正常链路使用游标批量拉取、稳定运单事件键、条件更新和断点续传;单次预算 2.5s,其中域名解析 100ms、建连与安全握手 600ms、上游处理 1.2s、回包 300ms、余量 300ms。事故中某地区 RTT(往返时间)从 180ms 升至 420ms,代理又在 1s 先行超时,而上游仍在 1.3s 完成,调度器立即重试造成重复拉取和连接创建风暴。

sequenceDiagram
    participant S as "轨迹调度器"
    participant P as "跨境代理"
    participant C as "承运商"
    participant D as "轨迹状态库"
    S->>P: 游标 c-771,截止时间 2.5 秒
    P->>C: 拉取增量轨迹
    alt 正常
        C-->>P: 1.2 秒返回批次 b-88
        P-->>S: 结果与下一游标
        S->>D: 按事件键幂等写入
    else 代理 1 秒先超时
        P--xS: 504,结果未知
        C-->>P: 1.3 秒实际成功
        S->>D: 保留原游标并进入查证/退避
    end
证据对象指标/字段事故值判断
解析分段解析耗时35ms非主因
建连连接耗时、复用率510ms、复用率 18%RTT(往返时间)与频繁重连放大
传输重传率1.6%尾延迟放大因素
代理上游超时1s小于真实跨境预算
承运商服务端处理390ms处理稳定,响应在代理后到达
状态库重复事件率23%立即重试的后果

数据演绎 4:跨境轨迹结果未知。 T0 调度器以游标 c-771 发起;T1=1s 代理返回 504T2=1.3s 承运商实际生成批次 b-88T3=1.4s 调度器若推进新游标会漏数据,若生成新任务立即重试会重复处理。正确做法是保留原游标和请求标识,经过 2s 退避后查证批次状态,写入时以“承运商+运单+事件代码+事件时间”唯一。止血将代理超时对齐 2.2s、限制每承运商并发并关闭立即重试;回滚条件是积压年龄超过 15 分钟。长期提高连接复用并按地区维护预算。回归在 RTT(往返时间)420ms、1% 丢包下重复事件低于 0.1%、无游标跳跃,积压 20 分钟内清空。

热门面试题

  1. 问题(基础题):跨境调用为什么必须拆分超时预算?

    • 考点:解析、建连、安全握手、处理和回包阶段。
    • 回答思路:说明总耗时无法指出责任层。
    • 详细答案:跨境 RTT(往返时间)高且抖动明显,连接新建、安全握手和重传都会占用预算。只配置一个总超时无法区分池等待、建连、首字节和读取,也可能让代理早于应用超时。应传播截止时间,让内层预算小于外层剩余时间,并保留查证和清理余量。
    • 进阶追问:预算越长越安全吗?
    • 进阶回答:不是,过长会占用连接和任务槽,延迟故障暴露;应基于分位数据、业务时效和并发容量设置。
  2. 问题(原理题):代理超时后上游为什么还可能完成?

    • 考点:连接生命周期与业务执行生命周期分离。
    • 回答思路:解释代理返回与上游取消不是同一原子动作。
    • 详细答案:代理达到等待上限时可以关闭面向调用方的响应,但请求可能已进入上游并提交。除非协议和应用都支持可靠取消且上游在提交前检查,否则上游仍会继续。写操作因此进入结果未知,必须用稳定业务键、主动查询和幂等写入处理,不能把 504 当明确失败。
    • 进阶追问:传播取消信号能彻底解决吗?
    • 进阶回答:不能,取消与提交仍存在竞态;它能减少无效工作,但正确性仍依赖状态机和查证。
  3. 问题(项目题):轨迹同步怎样避免既重复又漏数?

    • 考点:游标提交、事件唯一键和可重放。
    • 回答思路:把拉取、写入和游标推进分成可恢复步骤。
    • 详细答案:先用当前游标拉取并保存批次标识,按稳定事件键幂等写入,只有整批达到可接受终态后才条件推进游标。超时保留原游标并查证,重放允许重复读取但不重复产生业务事件。对永久错误进入隔离队列,不能跳过后直接推进造成隐藏缺口。
    • 进阶追问:如何证明没有漏数?
    • 进阶回答:按上游批次计数、游标连续性、事件唯一键和每日全量对账四个维度核验,并对差异自动补拉。

1.5 支付回调、渠道超时、连接复用与资金正确性

支付服务处理约 800 次/秒渠道回调,另有主动查单和退款链路。一次故障表现为回调偶发连接复位、P99(99 分位响应时间)从 220ms 升至 1.4s。应用连接池空闲寿命 5 分钟,而边缘代理 60 秒回收连接;失败集中在空闲 70 至 110 秒后首次复用的连接,新建连接成功。与此同时某渠道扣款响应超时但账单已成功。网络问题只解释“没有收到结果”,资金正确性仍由签名验证、稳定支付单号、唯一回调流水、状态机、主动查单、对账和补偿保证。

sequenceDiagram
    participant C as "第三方渠道"
    participant G as "支付网关"
    participant P as "支付服务"
    participant D as "资金状态库"
    participant R as "对账系统"
    C->>G: 回调 payment=P-7001
    G->>P: 验签后转发
    P->>D: 唯一记录回调并条件迁移
    D-->>P: SUCCESS 或返回既有结果
    P-->>C: 确认收到
    alt 响应丢失或陈旧连接复位
        C->>G: 原流水重试
        P->>D: 命中既有结果,不重复入账
    end
    R->>D: 日终渠道账单核对并补偿差异
风险网络层处置业务正确性处置禁止做法
陈旧连接客户端空闲寿命短于代理、借出校验原支付单号重试无界扩大连接池
渠道超时限次退避、传播截止时间主动查单,状态保持未知直接标记失败并再次扣款
重复回调快速返回既有结果唯一流水、条件状态迁移仅靠内存去重
证书失败核验证书链、域名和有效期切备用渠道前核对在途状态关闭证书校验
对账差异保留请求/渠道流水证据差错单、人工审批、补偿直接改余额

数据演绎 5:支付未知结果与陈旧连接。 T0 连接使用后进入池;T1=60s 代理无声回收;T2=90s 客户端借出旧连接,首次写回调确认时复位,渠道重发;唯一回调流水使第二次只返回原结果。另一笔扣款在 700ms 客户端超时,渠道于 820ms 成功;支付单保持 PROCESSING,3s 后主动查单转为 SUCCESS。止血将连接空闲寿命降至 45s、限次重试并提升查单频率;配置回滚条件是新建连接率超过容量上限。长期统一各层超时和连接寿命,增加未知状态年龄告警。回归空闲 120s 场景无复位,重复回调 10 次仅一条入账,日终渠道金额、支付流水和账户分录三方差异为 0。

热门面试题

  1. 问题(基础题):支付调用超时后为什么不能直接标记失败?

    • 考点:结果未知和外部副作用。
    • 回答思路:列出未到达、处理中、已提交响应丢失三种状态。
    • 详细答案:超时只证明调用方未及时收到响应,渠道可能已经扣款。直接失败并重新发起会造成重复扣款;正确做法是保持处理中或未知状态,使用原支付单号主动查单,接收幂等回调,并由对账补足长时间未决情况。只有渠道给出可验证的明确失败才进入失败终态。
    • 进阶追问:查单也超时怎么办?
    • 进阶回答:继续保留未知状态,按退避和最大时限调度查单,限制用户重复操作,并进入人工或对账差错流程。
  2. 问题(原理题):为什么连接池空闲寿命要小于中间代理回收时间?

    • 考点:半开或陈旧连接复用。
    • 回答思路:解释两端对连接状态认知不一致。
    • 详细答案:代理可能在客户端不知情时关闭空闲连接,客户端仍把它当可复用资源。下一次写入才收到复位,造成首请求失败和额外尾延迟。让客户端提前淘汰、借出前校验并保留有限重试,可缩小陈旧窗口;还要监控连接年龄、复位和新建率,不能只扩大池。
    • 进阶追问:开启传输层保活就够了吗?
    • 进阶回答:不一定,默认探测周期可能远大于代理阈值,且业务连接寿命仍需与各层配置一致。
  3. 问题(项目题):重复支付回调如何做到既不重复入账又能快速响应?

    • 考点:唯一流水、事务状态机和结果复用。
    • 回答思路:先验签,再原子去重和条件迁移。
    • 详细答案:以渠道、商户号和渠道流水建立唯一回调记录,在同一事务中读取支付单并只允许合法状态迁移,同时写账户分录或可靠事件。重复回调命中唯一记录后返回第一次处理结果,不再执行副作用。耗时通知异步化,入口尽快确认,失败由重试与对账恢复。
    • 进阶追问:数据库事务提交后响应丢失怎么办?
    • 进阶回答:渠道会以同一流水重试,唯一约束返回既有成功;即使不重试,主动查单和对账仍可确认。

1.6 Runner(执行器)调度、线程阻塞与下游放大

Runner(执行器)管理 2 万个周期任务,正常按租户、优先级和下游配额分队列,以租约防止重复执行。事故中一个第三方接口读取超时从 2s 漂移到 30s,200 个工作线程全部阻塞,队列年龄从 20s 升至 47 分钟;调度器误认为租约到期,在其他节点重新派发,使远端连接数和请求量翻倍。主机处理器空闲 62%,说明不是算力不足;线程栈集中在套接字读取,ss 显示大量已建立连接但发送/接收队列变化缓慢,远端 504 日志与本地开始时点一致。

sequenceDiagram
    participant S as "调度器"
    participant R1 as "Runner(执行器)节点 A"
    participant X as "第三方接口"
    participant R2 as "Runner(执行器)节点 B"
    S->>R1: 租约任务 T-81
    R1->>X: 调用,剩余预算 2 秒
    X--xR1: 响应延迟 30 秒
    R1->>S: 心跳仍活跃,任务状态 RUNNING
    alt 错误设计:仅按固定租约重派
        S->>R2: 重复派发 T-81
        R2->>X: 再次放大请求
    else 正确设计
        S->>R1: 续租或进入未知状态,不并发重放
    end
证据事故值说明动作
主机空闲62%非计算瓶颈不增加工作线程
阻塞线程200/200下游读取占满槽位限时、隔离线程池
队列年龄47 分钟服务率低于到达率暂停低优先任务
重复执行率18%租约与执行状态脱节心跳续租、幂等任务
远端并发400重派使压力翻倍每下游并发舱壁

数据演绎 6:线程阻塞和租约重派。 到达率 80 个/秒,正常单任务 1s、100 个并发即可稳定;故障时耗时 30s,理论需要 2,400 个并发才不积压,但远端只允许 120。系统错误增加到 200 线程并重派,远端并发升至 400,成功率降到 41%。止血将第三方舱壁降到 60、超时恢复 2s、暂停低优先任务并保持原任务标识;若关键任务成功率下降则切备用渠道。长期使用截止时间、心跳续租、任务状态机、出站配额和失败退避。回归注入 30s 慢响应时,关键队列年龄低于 2 分钟、非关键任务可延后、重复副作用为 0,故障解除后按每分钟 10% 逐步放量。

热门面试题

  1. 问题(基础题):主机处理器空闲但任务积压,首先应考虑什么?

    • 考点:等待型任务、服务率和队列。
    • 回答思路:从线程状态、下游耗时和并发槽位解释。
    • 详细答案:积压说明到达率高于完成率,不等于缺少算力。应查看工作线程是在运行、锁等待、文件等待还是套接字读取,并比较下游耗时和连接池。若线程全阻塞,增加线程只扩大在途请求和内存;应限制下游并发、缩短预算、隔离关键任务并控制入口。
    • 进阶追问:队列长度还是队列年龄更重要?
    • 进阶回答:两者都看,但年龄更直接表达业务时效;不同任务成本不同时,长度可能误导。
  2. 问题(原理题):固定租约为什么可能造成重复执行?

    • 考点:任务活性、网络停顿和租约语义。
    • 回答思路:说明租约到期不能证明原执行已停止。
    • 详细答案:任务可能因下游慢、进程停顿或网络分区未能及时续租,但仍在执行并可能产生副作用。调度器到期立即重派会形成两个执行者。正确做法是任务本身幂等,执行者周期续租并携带 fencing token(隔离令牌),状态机区分运行、未知和可重试,重派前确认旧执行权失效。
    • 进阶追问:只延长租约是否可行?
    • 进阶回答:只能降低误判,不能消除进程停顿和长任务差异;还会延长真实故障恢复时间。
  3. 问题(项目题):Runner(执行器)如何防止一个下游拖垮全部任务?

    • 考点:舱壁、优先级、截止时间和背压。
    • 回答思路:按下游和任务等级拆资源。
    • 详细答案:每个下游使用独立并发配额、连接池和队列,关键任务保留资源;任务携带截止时间,过期不再进入下游。失败采用退避和熔断,队列按年龄和优先级告警,恢复时渐进放量。任务标识、租约和结果持久化保证节点切换不重复副作用。
    • 进阶追问:熔断后任务怎么办?
    • 进阶回答:保留可重试状态和下一执行时间,关键任务可切备用渠道;不能丢弃或无间隔立即重放。

1.7 IoT(物联网)MQTT(消息队列遥测传输协议)报警风暴治理

平台维持 10 万设备长连接,平时 5,000 条消息/秒;一次区域断网恢复后 6 万设备在 30 秒内重连,峰值 4,000 次建连/秒、2 万条消息/秒,其中 35% 为 QoS(服务质量)1 重复投递。网卡带宽未满,但小包使软中断集中在两个核心,Netty(网络通信框架)事件循环任务队列达到 18 万,报警规则对每条原始消息立刻计算并写库,最终形成 120 万条重复报警。治理必须同时覆盖重连抖动、协议会话、事件循环预算、消息削峰、设备事件幂等和报警聚合。

sequenceDiagram
    participant D as "设备群"
    participant B as "MQTT(消息队列遥测传输协议)接入层"
    participant Q as "削峰队列"
    participant A as "报警聚合器"
    participant N as "通知服务"
    D->>B: 断网恢复,带随机抖动重连
    B->>B: 恢复会话并校验设备事件标识
    B->>Q: 按设备与规则分区写入
    Q->>A: 有界批量消费
    A->>A: 窗口去重、状态升级与恢复合并
    A->>N: 只发送状态变化通知
    N-->>D: 平台确认按协议返回
层级正常指标风暴指标治理
重连200 次/秒4,000 次/秒指数退避和随机抖动
包率8 万包/秒65 万包/秒接入限速、队列分散
软中断每核低于 20%两核 78%队列/亲和性先验证后调整
事件循环延迟P99(99 分位响应时间)3ms680ms业务卸载、有界任务
重复消息低于 0.2%35%设备事件键与状态机
报警通知300 条/分钟8 万条/分钟窗口聚合与升级策略

数据演绎 7:断网恢复风暴。 T0 6 万设备离线;T1 网络恢复,未加抖动的客户端在 30 秒内集中重连;T2 包率升至 65 万/秒、软中断两核 78%,接入层确认延迟导致设备再次重发;T3 重复消息 35%,规则引擎生成 120 万报警。止血对非关键遥测降采样、接入按设备分组限速、报警只保留状态升级,并让客户端重连窗口扩到 10 分钟;若在线率恢复过慢则每分钟增加 10% 配额。长期保存会话、用设备事件序号幂等、将规则计算卸载到有界队列并做窗口聚合。回归 6 万设备恢复时峰值建连低于 500 次/秒、事件循环 P99(99 分位响应时间)低于 10ms、重复报警低于 0.1%,10 分钟内在线率超过 99%。

热门面试题

  1. 问题(基础题):带宽未满为什么 IoT(物联网)接入仍可能过载?

    • 考点:小包包率、软中断和每消息固定成本。
    • 回答思路:区分字节吞吐和每秒包数。
    • 详细答案:大量小包即使总字节不高,也会触发更多中断、协议解析、对象创建、主题路由和确认操作。瓶颈可能是单核软中断、事件循环任务预算或规则引擎,而不是网卡带宽。应同时观察包率、每核软中断、事件循环延迟、消息队列和业务处理率。
    • 进阶追问:直接调大接收缓冲能解决吗?
    • 进阶回答:只能增加吸收窗口,处理率不变会把故障延后并占更多内存;应先控制到达率和处理成本。
  2. 问题(原理题):QoS(服务质量)1 为什么仍会重复?

    • 考点:至少一次交付和确认丢失。
    • 回答思路:用发布成功但确认丢失解释重发。
    • 详细答案:发送方在收到确认前不能确定接收方是否处理,超时会携带重复标记重发。接收方因此必须允许协议重复并在业务层以设备、事件序号和类型去重;仅凭连接或消息到达时间不可靠,重连后仍可能重放未确认消息。
    • 进阶追问:升级到 QoS(服务质量)2 就无需幂等吗?
    • 进阶回答:不行,协议会话之外的重试、桥接、消费失败和业务写入竞态仍可能重复,业务唯一性必须独立保证。
  3. 问题(项目题):报警风暴应在接入层还是规则层治理?

    • 考点:分层削峰与语义聚合。
    • 回答思路:接入保护容量,规则层保护业务语义。
    • 详细答案:接入层负责认证、限速、会话和原始事件可靠入队,不能在不了解业务时随意丢关键告警;规则层按设备、告警类型和窗口做去重、持续、升级与恢复合并。通知层再按租户配额和接收人聚合。三层都有指标和降级,才能既保护平台又不丢失状态变化。
    • 进阶追问:非关键遥测如何降级?
    • 进阶回答:按设备和指标采样、保留最大最小与状态变化,记录降级窗口并允许离线补传,不能静默丢弃。

1.8 Netty(网络通信框架)长连接、背压与本地内存

长连接网关承载 12 万连接,8 个 EventLoop(事件循环)线程。正常每个 Channel(通道)固定归属一个 EventLoop(事件循环),入站解码后把耗时业务卸载,出站根据 isWritable 控制生产速率。事故中某处理器直接执行 80ms 数据库查询,单个 EventLoop(事件循环)负责的 1.6 万连接同时延迟;下游推送变慢又使写缓冲超过高水位,直接内存从 3GiB(吉字节)升至 11GiB(吉字节)。增加事件循环线程不能迁移既有 Channel(通道),重启虽然暂时清空队列,却不修复阻塞和背压缺失。

sequenceDiagram
    participant S as "套接字就绪"
    participant E as "EventLoop(事件循环)"
    participant P as "Pipeline(处理流水线)"
    participant B as "业务线程池"
    participant C as "Channel(通道)写缓冲"
    S->>E: 可读事件
    E->>P: 解码与轻量校验
    P->>B: 卸载 80ms 查询
    B-->>E: 回投同连接结果
    E->>C: 编码并写出
    alt 写缓冲超过高水位
        C-->>E: isWritable=false
        E->>P: 暂停生产或 autoRead(自动读取)
    else 低于低水位
        C-->>E: 恢复可写
    end
现象第一证据第二证据修复
一组连接同时慢事件循环延迟与线程栈连接到事件循环映射卸载阻塞业务
直接内存增长分配/释放与泄漏检测写缓冲字节、慢客户端背压与所有权修复
写队列膨胀isWritable=false 比例套接字发送队列有界生产和断开策略
半包异常解码累计字节与帧长度受限报文样本长度上限和状态机
优雅关闭失败在途连接与任务关闭时序和超时停接入、排空、强制上限

数据演绎 8:一个事件循环拖慢 1.6 万连接。 12 万连接均分到 8 个线程,每线程约 1.5 万;处理器每秒有 20 次 80ms 阻塞查询,理论占用 1.6s/秒,事件循环必然积压。T0 循环延迟 P99(99 分位响应时间)3ms;T1 发布后升至 740ms;T2 写缓冲 8GiB(吉字节),慢客户端占 65%;T3 直接内存接近限制。止血关闭非关键推送、对不可写连接停止生产并摘除异常版本;回滚条件是关键在线率下降。长期把查询卸载到有界线程池,回投结果时检查 Channel(通道)存活,定义高低水位和慢客户端断开策略,确保 ByteBuf(字节缓冲区)引用计数所有权清晰。回归 12 万连接、20% 慢客户端下循环 P99(99 分位响应时间)低于 8ms、直接内存稳定低于 4GiB(吉字节)、无泄漏报告。

热门面试题

  1. 问题(基础题):为什么 EventLoop(事件循环)线程不能执行阻塞业务?

    • 考点:连接复用线程和队头阻塞。
    • 回答思路:说明一个线程服务许多 Channel(通道)。
    • 详细答案:同一 EventLoop(事件循环)顺序处理其注册 Channel(通道)的 I/O(输入输出)事件和任务。一次 80ms 阻塞会让该线程上的其他连接无法及时读、写、确认和执行定时任务,影响面远大于当前请求。耗时业务应卸载到有界线程池,完成后回投到原事件循环保持连接内顺序。
    • 进阶追问:线程池无界是否可以避免拒绝?
    • 进阶回答:不可以,无界队列把过载变成长延迟和内存风险;必须按下游服务率限并发并背压入口。
  2. 问题(原理题):写缓冲高低水位如何形成背压?

    • 考点:生产速率与套接字发送能力匹配。
    • 回答思路:解释不可写状态、停止生产和恢复阈值。
    • 详细答案:当待写字节超过高水位,Channel(通道)变为不可写,业务应暂停继续生成推送、降低读取或将数据转入有界队列;待写字节降到低水位后再恢复。两个阈值形成迟滞,避免状态频繁抖动。它不是自动丢消息,应用必须定义保留、降级或断开策略。
    • 进阶追问:只看 isWritable 就够吗?
    • 进阶回答:还要看待写字节、不可写持续时间、套接字发送队列、慢客户端比例和直接内存,才能判断根因和容量。
  3. 问题(项目题):如何证明直接内存增长来自慢连接而不是 ByteBuf(字节缓冲区)泄漏?

    • 考点:在途缓冲与所有权泄漏区分。
    • 回答思路:比较写缓冲、释放事件和断开慢连接后的低水位。
    • 详细答案:若直接内存与不可写连接的待写字节同步增长,断开慢连接并完成写失败回调后明显回落,且泄漏检测无未释放路径,更像有界但过大的在途缓冲;若流量回落和连接关闭后低水位仍持续抬升,并出现缺失 release 的访问记录,才支持泄漏。两者都需修复,但证据与方案不同。
    • 进阶追问:重启后内存恢复能证明什么?
    • 进阶回答:只能证明资源与进程生命周期相关,不能区分泄漏、池化保留或写队列;必须在原负载下观察增长与释放路径。

1.9 正常/失败时序、结果未知与幂等边界

库存、支付、物流和设备消息都存在“服务端已提交但调用方未收到确认”的窗口。正常时序可按请求、受理、提交、副作用、响应五个时点描述;失败时序必须标明在哪个时点断开。幂等不是“所有请求返回成功”,而是重复同一业务意图不会产生第二份副作用,并能复用既有终态。网络层超时与业务状态机需要共同设计:稳定业务键识别同一意图,唯一约束做原子裁决,状态机限制迁移,主动查询和对账解决长时间未知。

sequenceDiagram
    participant C as "调用方"
    participant S as "业务服务"
    participant D as "权威状态库"
    participant X as "外部系统"
    C->>S: 请求,业务键 K-1
    S->>D: 唯一受理 K-1=PENDING
    S->>X: 执行外部副作用
    X-->>S: 成功
    S->>D: 条件迁移 SUCCESS
    S--xC: 响应丢失
    C->>S: 原业务键重试
    S->>D: 读取并复用 SUCCESS
    S-->>C: 返回第一次结果
故障点调用方观察服务端可能状态恢复动作
请求发送前本地失败未受理原键重试
请求传输中超时未到达或已到达原键查询/重试
本地提交后超时已成功返回既有结果
外部成功响应丢失超时外部成功、本地未知主动查单
回调响应丢失对方重发本地已处理唯一流水复用结果

数据演绎 9:四类业务统一未知窗口。 库存预占 OL-9 已提交但响应丢失,重试命中唯一流水;支付 P-7 渠道成功但本地未确认,主动查单转成功;轨迹批次 B-8 已生成但代理超时,保留游标重拉并按事件键去重;设备消息 D-6/E-10 已处理但确认丢失,重发命中设备序号。四例的网络现象都是超时或重复,业务答案却依赖各自权威键和状态机。回归必须注入“提交后断开”,验证副作用只发生一次、调用方最终看到同一结果、未知状态有年龄告警并能被查单或对账清理。

热门面试题

  1. 问题(基础题):什么是分布式调用中的结果未知?

    • 考点:观察者局限与提交时点。
    • 回答思路:说明超时只描述观察,不描述远端终态。
    • 详细答案:调用方没有收到完整响应时,无法区分请求未到、处理中、已提交但响应丢失等状态。这种不确定性不能靠延长超时完全消除。写操作必须有稳定业务键和可查询状态,让重试复用原意图;对外部副作用还要主动查单和对账。
    • 进阶追问:什么时候可以明确失败?
    • 进阶回答:权威系统返回可验证且不会再提交的失败终态,或本地在副作用发生前原子拒绝,才可按失败处理。
  2. 问题(原理题):唯一约束和状态机为什么要同时存在?

    • 考点:身份唯一与迁移合法性。
    • 回答思路:一个解决“是不是同一笔”,一个解决“能否这样变”。
    • 详细答案:唯一约束原子阻止同一业务键创建第二条记录,但不能阻止已有记录从成功被错误改回处理中;状态机限制合法方向,却若无唯一键可能出现两条独立状态。两者结合事务条件更新,才能在并发重试下既单一受理又单向演进。
    • 进阶追问:内存锁能替代唯一约束吗?
    • 进阶回答:不能,跨实例、崩溃和超时后锁状态不可靠,权威库约束才覆盖最终写入。
  3. 问题(项目题):怎样测试“提交后响应丢失”这个窗口?

    • 考点:故障注入和可观察副作用。
    • 回答思路:在提交点后、响应点前注入断连并原键重试。
    • 详细答案:测试环境让服务完成权威状态提交或外部模拟成功后,主动关闭返回连接;调用方收到超时并用同一业务键重试。验证数据库只有一条流水、外部副作用一次、状态不倒退、重复请求返回同一终态,随后检查未知年龄、查单和对账指标归零。
    • 进阶追问:只测网络断开够吗?
    • 进阶回答:不够,还要覆盖进程终止、事务回滚、回调重复、消息重复和时钟超时,验证各状态边界。

1.10 主机到远端的八层证据链与错误归因

“接口慢”排查按主机、容器、进程、线程、文件、套接字、网卡、远端八层推进。每层只回答自身能证明的问题:主机显示全局资源,容器显示配额和命名空间,进程与线程显示责任执行体,文件与设备显示持久化等待,套接字显示连接状态和队列,网卡显示链路计数,远端日志显示对方是否受理。ping 成功不能证明安全握手和应用健康,ss 中连接已建立不能证明业务线程正在消费,线程栈等待网络也不能证明网络丢包。

flowchart TB
    H["主机:利用率、负载、内存、设备"] --> C["容器:配额、节流、命名空间"]
    C --> P["进程:CPU(中央处理器)、内存、文件描述符"]
    P --> T["线程:运行、锁、系统调用、事件循环"]
    T --> F["文件:页缓存、同步刷盘、设备队列"]
    T --> S["套接字:状态、收发队列、重传"]
    S --> N["网卡与路由:丢包、错误、路径"]
    N --> R["远端:代理、服务、渠道权威状态"]
常见结论为什么不充分至少补充什么
“CPU(中央处理器)高导致慢”可能是重试后的结果线程热点、时间先后、限流对照
“磁盘 100% 导致慢”统计口径与设备并行能力不同await、队列、责任进程和业务刷盘
“有重传所以网络有问题”重传方向和责任点未知流级抓包、两端计数、路径变化
“线程在读套接字所以对方慢”可能本地事件循环未调度套接字队列、事件循环延迟、远端日志
“重启恢复所以应用泄漏”重启同时清空队列和连接低水位趋势、所有权和可重复实验

数据演绎 10:支付接口 1.2s 的八层排除。 主机处理器 48%、容器无节流;进程无热点,事件循环 P99(99 分位响应时间)4ms;文件同步刷盘 8ms;套接字发送队列为 0、接收队列持续 64KiB(千字节);网卡无丢包,重传 0.05%;远端渠道日志显示 900ms 后才开始处理,因其连接池排队 760ms。结论是远端排队,客户端池和本地网络排除为主因。止血切备用渠道并降低对该渠道并发,回滚条件是备用失败率超过基线。长期传播截止时间、渠道舱壁和容量告警。回归远端排队低于 100ms、接口 P99(99 分位响应时间)220ms,八层原始指标同时保存。

热门面试题

  1. 问题(基础题):为什么容器指标不能直接等同宿主机指标?

    • 考点:控制组、命名空间和共享资源。
    • 回答思路:区分配额视图与全局竞争。
    • 详细答案:容器可能只有部分处理器和内存配额,并处在独立网络命名空间;它会在宿主机仍空闲时因自身配额节流,也可能因邻居争用共享设备而变慢。排查要同时记录容器限制、节流和宿主机全局状态,并映射到目标进程,不能拿一个视图代替另一个。
    • 进阶追问:容器内看到的网卡是哪一层?
    • 进阶回答:通常是虚拟接口视图,还需沿虚拟对、宿主机接口和实际网卡继续核对丢包与队列。
  2. 问题(原理题):线程栈显示套接字读取为何不能证明网络慢?

    • 考点:阻塞位置与等待原因。
    • 回答思路:列出正常等待、远端慢、本地调度和池设计四种可能。
    • 详细答案:同步客户端线程在等响应时自然停在读取;这只能说明当前没有可交付数据。原因可能是远端未处理、代理排队、传输丢包,也可能本地事件循环或解码未推进。必须结合分段耗时、套接字队列、重传、事件循环延迟和远端请求日志才能定位。
    • 进阶追问:接收队列有数据但应用仍等待说明什么?
    • 进阶回答:优先检查应用是否被调度、事件循环是否阻塞、解码是否等待完整帧以及读取开关,而不是继续归因远端。
  3. 问题(项目题):如何向面试官证明你的根因不是猜的?

    • 考点:时间线、双证据和可控实验。
    • 回答思路:用事实、排除、动作预期和回归闭环表达。
    • 详细答案:先给出异常量级和最早变化,再展示来自不同层的两类证据,说明排除了哪些看似相同的原因。止血前声明若结论正确哪些指标会恢复、若不恢复如何回滚;动作后在同流量下验证业务延迟和原始证据同步恢复,并通过故障注入复现。这样结论可被证伪而不是经验判断。
    • 进阶追问:止血动作同时改变多个变量怎么办?
    • 进阶回答:只能确认组合有效,不能精确归因;恢复后要在隔离环境逐个变量复现实验,并在复盘中注明不确定性。

1.11 止血、回滚、长期修复、指标与回归

止血目标是控制用户、库存或资金影响,不等于完成修复。动作按风险分为限流/降级、暂停低优先任务、摘除版本、切备用依赖、扩容和重启;每个动作在执行前写明预期信号、观察窗口、负责人和回滚阈值。资损场景优先冻结危险写入并保留查单与对账,不能为提高可用性牺牲账务正确性。长期修复应消除触发机制和反馈回路,例如有界重试、舱壁、背压、幂等状态机、容量准入、分级存储和故障演练。

flowchart LR
    I["确认影响等级"] --> S{"是否存在资损或不可逆副作用"}
    S -- "是" --> F["冻结危险写入、保留查询与对账"]
    S -- "否" --> L["限流、降级、暂停低优先任务"]
    F --> E["保存低开销现场"]
    L --> E
    E --> A["执行一个可回滚动作"]
    A --> V{"业务与第二证据是否按预期恢复"}
    V -- "否" --> R["回滚并重建假设"]
    V -- "是" --> P["长期修复、故障注入、容量回归"]
动作适用场景主要风险回滚条件
限流过载、重试风暴合法请求受损成功率或关键业务下降超阈值
暂停任务导出、补数、低优先调度积压时效下降队列年龄超过业务上限
切备用渠道、跨境链路异常备用容量或数据差异备用错误率高于基线
摘除版本发布后回归回滚兼容和数据状态旧版本无法读取新状态
扩容可并行且瓶颈确在本层下游被放大下游饱和或延迟不改善
重启资源失控且已有现场丢状态、惊群、根因丢失只分批并限制重连速率

数据演绎 11:恢复放量。 IoT(物联网)风暴止血后入口限为 5,000 条/秒,队列 60 万条、消费 8,000 条/秒,理论净消化 3,000 条/秒,约 200 秒清空。实际按每 2 分钟增加 10% 入口,观察事件循环 P99(99 分位响应时间)低于 10ms、不可写连接低于 1%、队列年龄下降;若任一超过阈值立即退回上一档。支付备用渠道切换则不能只看成功率,还要看未知状态年龄、重复扣款和对账差异。长期回归在峰值 1.3 倍持续 2 小时,并注入 1% 丢包、代理提前超时和进程终止,确认业务正确性与资源上界同时满足。

热门面试题

  1. 问题(基础题):止血和长期修复有什么区别?

    • 考点:影响控制与机制消除。
    • 回答思路:分别说明目标、时效和验收。
    • 详细答案:止血在事故中快速降低影响,允许使用限流、降级、暂停或切换等临时手段;长期修复要改变造成故障的代码、容量、状态机或反馈回路。止血以业务恢复和风险可控验收,长期修复还要通过同量级回归、故障注入和监控阈值验证不再复发。
    • 进阶追问:重启属于哪一类?
    • 进阶回答:通常只是止血,除非根因就是已修复版本尚未生效;重启前应保存现场并控制连接惊群。
  2. 问题(原理题):为什么恢复流量要渐进放量?

    • 考点:排队系统、反馈和隐藏积压。
    • 回答思路:解释故障解除后仍有队列和冷启动成本。
    • 详细答案:下游恢复不等于系统立即有余量,仍可能存在积压、缓存冷启动、连接重建和补偿任务。一次全量恢复会让到达率再次超过服务率并触发振荡。分档放量可以观察处理率、队列年龄、事件循环和错误率,在越过稳定点前回退。
    • 进阶追问:放量步长如何定?
    • 进阶回答:依据可用余量、积压净消化率和业务风险,常用固定百分比加观察窗,但需由实时服务率动态校准。
  3. 问题(项目题):支付事故中为什么可用性不能优先于资金正确性?

    • 考点:不可逆副作用和补偿边界。
    • 回答思路:说明错误成功比延迟确认更危险。
    • 详细答案:支付重复扣款、错误入账或状态倒退会形成真实资损,后续补偿成本和法律风险高。网络不确定时宁可保持处理中、限制新操作并加强查单,也不能绕过验签、唯一约束或状态机换取表面成功率。恢复还需对账确认历史在途,而不是只看接口变绿。
    • 进阶追问:冻结写入会不会影响收入?
    • 进阶回答:会,但应按风险缩小到异常渠道或操作类型,并保留查询;短期可用性损失通常小于不可控资损。

1.12 设计思想、容量模型与项目口述结构

精通级表达不仅列工具,还要上升到设计思想:分层用于缩小责任边界,分治把大导出和大流量拆成可独立恢复单元;排队论解释为什么增加并发不一定增加吞吐;背压让上游到达率服从下游服务率;幂等与状态机吸收网络重复和结果未知;舱壁把一个渠道或租户的失败限制在局部;可观测性把设计假设转换为可验证指标。项目口述按“背景量级、挑战、设计、失败时序、证据、错误判断、止血、回滚、长期修复、结果与反思”展开。

mindmap
  root(("项目设计思想"))
    分层
      责任边界
      双证据
    分治
      分片任务
      独立恢复
    排队与背压
      有界并发
      剩余预算
    正确性
      幂等
      状态机
      对账
    隔离
      租户
      渠道
      优先级
    验证
      指标
      故障注入
      容量回归
设计原则解决问题项目落点关键指标
分治单任务过大、失败重做昂贵导出分片、轨迹游标分片耗时、恢复点
背压到达率超过服务率长连接写水位、任务队列队列年龄、不可写比例
幂等重试与重复投递支付回调、库存流水重复副作用、未知年龄
舱壁故障跨业务传播渠道池、租户配额各舱错误率和饱和度
随机抖动同步重试与重连IoT(物联网)设备恢复每秒建连、重试分布
容量准入并发配置靠猜导出、Runner(执行器)到达率、服务率、在途量

数据演绎 12:容量不是线程数。 Runner(执行器)关键任务到达率 60 个/秒,单任务外部等待 P95(95 分位响应时间)1.2s,按 Little’s Law(利特尔法则)稳定在途约 72;考虑 P99(99 分位响应时间)和 30% 余量设置 100 个槽位,而不是直接开 500 线程。若下游限额只有 80,则本地最多 80,并把其余留在有年龄指标的队列。导出单任务写速率 35MiB(兆字节)/秒、设备可为导出提供 320MiB(兆字节)/秒,安全并发不超过 8 至 9。IoT(物联网)恢复按 10 分钟摊平 6 万设备,目标平均 100 次建连/秒并允许短峰 500。三者共同说明容量由服务率、预算、资源和业务时效决定。

热门面试题

  1. 问题(基础题):为什么增加并发不一定提高处理速度?

    • 考点:瓶颈服务率与排队。
    • 回答思路:区分可并行工作和共享瓶颈。
    • 详细答案:当任务可并行且资源有余量时,并发能隐藏等待并提高利用率;但一旦数据库锁、设备、远端配额或单事件循环成为瓶颈,更多并发只增加排队、内存、连接和切换,完成率不会提高。应通过压测寻找吞吐拐点,并给关键业务预留余量。
    • 进阶追问:如何找到合理并发?
    • 进阶回答:逐级增加并发,记录吞吐、P99(99 分位响应时间)、队列、错误率和下游饱和度,在吞吐趋平而延迟陡升前取值并留故障余量。
  2. 问题(原理题):分治思想为什么能提高系统可恢复性?

    • 考点:故障域、检查点和重做成本。
    • 回答思路:用导出分片和轨迹游标解释。
    • 详细答案:把大任务拆成拥有稳定标识和独立结果的小单元后,每个单元可以限并发、重试、校验和恢复;失败只重做未确认部分,减少内存峰值与锁持有时间。分治也引入顺序、合并和跨分片一致性成本,因此需要检查点、幂等键和最终汇总状态。
    • 进阶追问:分片越小越好吗?
    • 进阶回答:不是,过小会放大调度、元数据、网络和提交开销;应在恢复粒度与固定成本之间压测取舍。
  3. 问题(项目题):高级面试中怎样讲一次线上事故最有说服力?

    • 考点:量化、机制、决策和反思。
    • 回答思路:用背景、时序、双证据、动作与结果形成闭环。
    • 详细答案:先给流量、延迟、错误和业务影响;再讲正常/失败时序与最早异常信号,说明为何排除其他候选。给出止血动作、风险和回滚条件,长期修复落到设计机制与容量;最后用同量级回归和业务正确性指标证明,并主动说明当时的错误判断和下一次如何更快定位。
    • 进阶追问:没有精确历史数字怎么办?
    • 进阶回答:明确哪些是区间或教学换算,不编造精确值;强调证据类型、趋势和决策逻辑,并在真实项目中补齐可核验报表。

2. 跨案例图形与数据演绎补充

flowchart LR
    A["WMS(仓储管理系统)库存"] -->|"唯一流水"| I["幂等与状态机"]
    P["支付回调"] -->|"主动查单"| I
    T["跨境轨迹"] -->|"游标与事件键"| I
    M["MQTT(消息队列遥测传输协议)消息"] -->|"设备序号"| I
    I --> C["对账、补偿与最终收敛"]
sequenceDiagram
    participant O as "过载入口"
    participant Q as "有界队列"
    participant W as "工作线程/事件循环"
    participant D as "下游依赖"
    O->>Q: 到达率 12,000/秒
    Q->>W: 按服务率 8,000/秒出队
    W->>D: 遵守下游配额
    alt 队列年龄越过阈值
        Q-->>O: 背压、限流或降级
    else 仍在预算内
        D-->>W: 完成并释放槽位
    end
flowchart TB
    N["正常基线"] --> F["注入单一故障"]
    F --> E["验证预期第一/第二证据"]
    E --> S["执行止血并验证回滚"]
    S --> R["恢复同量级流量"]
    R --> B["比较业务、资源、正确性与低水位"]
    B --> G{"是否达到阈值"}
    G -- "否" --> F
    G -- "是" --> D["固化运行手册和告警"]
跨案例维度库存支付轨迹IoT(物联网)
稳定身份订单行/预占号支付单/渠道流水承运商事件键设备/事件序号
未知恢复查询预占流水主动查单与对账保留游标重放会话重传与幂等
过载保护热点限流渠道舱壁每承运商配额重连抖动与削峰
最终验收库存与流水差异 0资金三方差异 0游标连续且无漏轨迹状态变化不重复报警

数据演绎 13:重试预算。 用户总预算 2s,本地处理 200ms、回包预留 200ms,首次下游预算最多 1.2s,只剩 400ms 时不能再发一个 1.2s 重试。若 1,000 次/秒请求有 20% 超时且立即重试两次,入口会短时增至 1,400 次/秒,可能把瞬时抖动变成过载。正确做法是原业务键、限次、指数退避、随机抖动和剩余预算检查,未知写操作优先查证。

数据演绎 14:积压恢复。 队列 120 万条,正常消费 2 万条/秒,恢复后安全消费 3 万条/秒,入口仍为 1.5 万条/秒,净消化 1.5 万条/秒,理论 80 秒清空;若盲目把消费升到 8 万条/秒而数据库只能承受 4 万,会使锁等待和失败重试上升,实际净处理反降。恢复计划以队列年龄、下游 P99(99 分位响应时间)和错误率分档放量。

数据演绎 15:证据和因果。 发布后 10:00 事件循环延迟先升高,10:01 写缓冲增长,10:02 直接内存增长,10:03 客户端重连,10:04 软中断上升。这个顺序支持“事件循环阻塞是触发,慢写与重连是放大器”,不支持“网卡软中断最先导致事故”。回滚发布后前四项按逆序恢复,且复现阻塞处理器时再次出现同序列,因果证据增强。

3. 跨章节综合面试题库

题库使用说明

以下题目按八条追问树组织,但不把分类标题标记为知识小节。口述时应先给结论,再依次讲分层假设、命令证据、机制、误判边界、项目落地和修复验证;命令中的占位参数必须替换为事故对象,并限定采样时长和权限。

  1. 问题:线上接口变慢时,如何先判断是 CPU(中央处理器)、内存、磁盘还是网络?

    • 考点:资源分层、采样边界、第二证据、容量与回归。
    • 回答思路:先固定业务窗口和资源归属,再由低开销信号定形,最后跨层验证并用同量级流量回归。
    • 口述答案:我的第一步不是同时执行一堆命令,而是固定异常窗口、接口、实例、容器、版本、流量、P99(99 分位响应时间)和错误率,并把当前值与同星期同流量基线比较。然后用低开销信号做四向定形:mpstat -P ALL 1 5vmstat 1 5 看每核用户态、内核态、软中断、运行队列与阻塞任务;free/proc/meminfo、控制组事件和进程驻留集看可用内存、交换、回收与容器上限;iostat -xz 1 5pidstat -d 看设备延迟、队列和责任进程;ss -tinapnstat -azsar -n DEV,TCP,ETCP 1 5 看套接字队列、重传、网卡错误和包率。第一轮只形成候选,随后必须到进程和线程层交叉验证:计算热点应有稳定线程热点,内存压力应有低水位抬升或终止事件,磁盘等待应与责任写入和业务刷盘同窗,网络问题应有流级重传、路径或远端日志。还要排除容器节流、数据库锁和远端排队,因为它们都能表现为接口超时。止血动作根据分支选择限流、暂停低优先任务、切依赖或隔离流量,并预设回滚阈值。修复后在同量级流量下复跑原命令,要求业务延迟、错误率和第二证据同步恢复;若只看到某个资源数字下降而业务不变,我会撤销根因结论继续排查。 形成结论后,我还会把资源判断写成容量约束:明确有效核心、内存低水位、允许排队时间和下游并发上限,并注明本次采样的主机、容器和进程归属。随后在预发布复现相同任务量,只改变一个变量验证因果;若资源信号改善而业务尾延迟不变,就回滚结论。最终把基线、阈值、自动保存现场和降级开关固化到运行手册,确保下一次不是重新猜测。
    • 进阶追问:如果资源数字与业务表现不同步,如何避免错误归因?
    • 进阶回答:撤销单指标结论,重新核对采样对象、时间窗口和下游状态,用独立第二证据及单变量实验重建因果。
    • 追问 1:为什么先看业务时间窗口?
    • 直接回答 1:只有把不同层信号对齐到同一异常窗口,才能区分事故触发与事故后的重试、日志和补偿放大。
    • 追问 2:负载高能直接说明处理器不足吗?
    • 直接回答 2:不能,负载还包含不可中断等待,需结合运行队列、阻塞任务、每核利用率和容器配额。
    • 追问 3:如何证明修复有效?
    • 直接回答 3:同流量下原始业务指标、责任层第一证据和独立第二证据同时回到基线,并通过故障注入验证不复发。
    • 详细章节:Linux(操作系统)资源证据链
  2. 问题:8 核主机 Load Average(平均负载)为 18,但 CPU(中央处理器)仍有 50% 空闲,如何解释和排查?

    • 考点:资源分层、采样边界、第二证据、容量与回归。
    • 回答思路:先固定业务窗口和资源归属,再由低开销信号定形,最后跨层验证并用同量级流量回归。
    • 口述答案:Load Average(平均负载)不是处理器利用率,它近似反映一段时间内可运行任务和不可中断等待任务的数量。8 核主机负载 18、空闲 50% 并不矛盾:大量线程可能处于 D 状态等待块设备、网络文件系统或驱动;也可能容器只获得 2 核配额,容器内部排队和节流而宿主机其他核心空闲。我的排查先确认 1、5、15 分钟趋势与有效核心数,再用 vmstat 1 5 分开 rb。若 r 高,继续看 mpstat 每核分布、控制组 cpu.stat 节流增量和 pidstat -u -w -t 的热点及切换;若 b 高,保存 ps 的状态与等待通道、目标线程内核栈,再到 iostat、挂载点或远端存储验证。若两者当前都低,可能只是短峰值被平滑窗口保留,不能追着历史数字调参。在 Runner(执行器)事故里,200 个线程等待第三方套接字时宿主机空闲 62%,根因是远端读取和任务槽耗尽,不是算力不足;增加线程反而扩大在途量。止血应限制故障下游并发、暂停低优先任务或隔离实例。回归要求负载来源、队列年龄、任务完成率和等待证据共同恢复。告警阈值也不机械设为“负载不得超过核数”,而应按稳定期基线、有效配额和服务级目标建立。 形成结论后,我还会把资源判断写成容量约束:明确有效核心、内存低水位、允许排队时间和下游并发上限,并注明本次采样的主机、容器和进程归属。随后在预发布复现相同任务量,只改变一个变量验证因果;若资源信号改善而业务尾延迟不变,就回滚结论。最终把基线、阈值、自动保存现场和降级开关固化到运行手册,确保下一次不是重新猜测。
    • 进阶追问:如果资源数字与业务表现不同步,如何避免错误归因?
    • 进阶回答:撤销单指标结论,重新核对采样对象、时间窗口和下游状态,用独立第二证据及单变量实验重建因果。
    • 追问 1D 状态为什么计入负载?
    • 直接回答 1:它代表尚未完成、等待不可中断内核条件的任务需求,虽然当时不占处理器,仍纳入系统负载观察。
    • 追问 2:增加线程什么时候可能有效?
    • 直接回答 2:任务主要等待且下游、内存和连接仍有余量时可隐藏等待;共享瓶颈已饱和时只会扩大排队。
    • 追问 3:容器场景还要看什么?
    • 直接回答 3:必须同时看容器配额、节流、宿主机全局争用和目标进程,不能把容器视图等同整机。
    • 详细章节:资源、进程与排障
  3. 问题:单个 Java(编程语言)线程持续 100%,如何定位到代码并判断是否真是根因?

    • 考点:资源分层、采样边界、第二证据、容量与回归。
    • 回答思路:先固定业务窗口和资源归属,再由低开销信号定形,最后跨层验证并用同量级流量回归。
    • 口述答案:单线程 100% 通常表示它在采样窗口接近占满一个逻辑核,8 核主机上约占整机理论算力八分之一;若容器只有 1 核配额,它却可能已经触顶。这个值只能确定热点执行体,不能证明整机满载或代码错误。我的流程是先记录宿主机核数、容器 cpu.max 与节流,再用 pidstat -u -t -p <PID> 1 5 连续确认责任 TID(线程标识),把十进制 TID(线程标识)转换为十六进制,在同一窗口匹配三份 Java(编程语言)线程栈。若栈稳定落在压缩、序列化、死循环或锁自旋,且该任务位于关键路径,再在评估开销后对目标进程做十秒左右受限热点采样。还要看其他线程是在等该结果、等锁还是等下游,以及流量和任务类型是否发生变化。异步导出中一个线程 100% 可能只是单文件压缩阶段,若队列年龄持续增长且多实例扩容不能提高单任务速度,说明有串行瓶颈;若它是正常后台任务且不影响服务级目标,就不构成事故。止血可暂停大任务、限制入口或隔离实例,长期可能是分片、算法优化或移除共享锁。验证不以线程从 100% 降到 80% 为完成,而要看同输入下吞吐、队列年龄、P99(99 分位响应时间)和热点位置同步改善,并排除把瓶颈转移到磁盘或下游。 形成结论后,我还会把资源判断写成容量约束:明确有效核心、内存低水位、允许排队时间和下游并发上限,并注明本次采样的主机、容器和进程归属。随后在预发布复现相同任务量,只改变一个变量验证因果;若资源信号改善而业务尾延迟不变,就回滚结论。最终把基线、阈值、自动保存现场和降级开关固化到运行手册,确保下一次不是重新猜测。
    • 进阶追问:如果资源数字与业务表现不同步,如何避免错误归因?
    • 进阶回答:撤销单指标结论,重新核对采样对象、时间窗口和下游状态,用独立第二证据及单变量实验重建因果。
    • 追问 1:为什么需要连续多份线程栈?
    • 直接回答 1:单份栈只是瞬时切片,多份同窗样本稳定在同一路径才支持持续热点,而不是偶然经过。
    • 追问 2:什么时候不应使用热点采样?
    • 直接回答 2:尚未缩小目标、生产延迟已极端恶化、权限或符号条件不足时,应先用低开销指标或在副本复现。
    • 追问 3:线程标识映射错会怎样?
    • 直接回答 3:会把另一个线程栈当成热点,因此必须对齐进程、采样时间并正确完成十进制与十六进制转换。
    • 详细章节:线程与热点证据
  4. 问题:容器被 OOM(内存溢出) Killer(内存不足终止器)终止,但宿主机还有大量可用内存,怎样解释?

    • 考点:资源分层、采样边界、第二证据、容量与回归。
    • 回答思路:先固定业务窗口和资源归属,再由低开销信号定形,最后跨层验证并用同量级流量回归。
    • 口述答案:容器内存边界由 cgroup(控制组)独立约束,宿主机有可用内存不代表目标控制组仍可分配。我的第一步是区分三种事件:Java(编程语言)堆内 OOM(内存溢出)、进程本地内存增长,以及控制组达到 memory.max 后由内核终止。先固定容器、进程和终止时间,读取 memory.currentmemory.maxmemory.eventsoomoom_kill 增量,再对齐编排平台事件和内核日志。随后用进程 smaps_rollup、线程数、直接内存指标、内存映射和 Java(编程语言)堆低水位分解责任量。若堆在垃圾回收后稳定,但线程栈、ByteBuf(字节缓冲区)直接内存或文件映射持续增长,就不能只调大堆;若控制组上限 4GiB(吉字节),堆 2.5GiB(吉字节)、直接内存 1GiB(吉字节)、线程栈和元数据合计 0.8GiB(吉字节),终止完全可能发生。异步导出还可能通过页缓存和本地缓冲放大容器记账。止血是限制大任务和并发、保留现场后分批重启或临时扩容,并设置回滚和宿主机安全余量。长期要建立“堆+本地内存+线程栈+映射+页缓存”的总预算,修复泄漏或流式处理。回归覆盖多轮任务后的内存低水位,要求不再抬升,且控制组事件、任务成功率和处理延迟稳定。 形成结论后,我还会把资源判断写成容量约束:明确有效核心、内存低水位、允许排队时间和下游并发上限,并注明本次采样的主机、容器和进程归属。随后在预发布复现相同任务量,只改变一个变量验证因果;若资源信号改善而业务尾延迟不变,就回滚结论。最终把基线、阈值、自动保存现场和降级开关固化到运行手册,确保下一次不是重新猜测。
    • 进阶追问:如果资源数字与业务表现不同步,如何避免错误归因?
    • 进阶回答:撤销单指标结论,重新核对采样对象、时间窗口和下游状态,用独立第二证据及单变量实验重建因果。
    • 追问 1:RSS(驻留集大小)等于 Java(编程语言)堆吗?
    • 直接回答 1:不等于,还包括线程栈、代码、共享库、直接内存和内存映射等驻留页,统计共享页时也有口径差异。
    • 追问 2:直接提高容器上限可以吗?
    • 直接回答 2:可作为有余量时的临时止血,但必须先确认宿主机容量并设置回滚,不能替代泄漏和工作集治理。
    • 追问 3:如何证明不是正常池化保留?
    • 直接回答 3:看同负载多周期低水位是否无界抬升,以及停止任务、关闭连接后责任内存是否按设计释放。
    • 详细章节:内存与容器边界
  5. 问题:IoT(物联网)高峰中软中断很高,但应用进程 CPU(中央处理器)不高,如何定位?

    • 考点:资源分层、采样边界、第二证据、容量与回归。
    • 回答思路:先固定业务窗口和资源归属,再由低开销信号定形,最后跨层验证并用同量级流量回归。
    • 口述答案:网卡收包后的大量协议处理可能在软中断上下文完成,这部分时间记在处理器的软中断而非应用用户态。因此小包风暴时会出现应用 %usr 不高、某些核心 %soft 很高、事件循环却拿不到足够调度时间。我的第一步用 mpstat -P ALL 1 5 看软中断是否集中在少数核心,再比较 /proc/softirqs/proc/interrupts 的单位时间增量,不能看系统启动以来累计值。第二层用 sar -n DEV 1 5ip -s link 和网卡统计确认包率、丢包、错误与队列;再看 ss 套接字队列、Netty(网络通信框架)EventLoop(事件循环)延迟、任务队列和 MQTT(消息队列遥测传输协议)确认重发。相同带宽下 65 万个小包每秒比少量大包消耗更多固定处理成本,因此“带宽未满”不能排除网络接入过载。还要区分触发和放大:区域恢复导致 6 万设备同步重连是触发,确认延迟引起 QoS(服务质量)1 重发是放大,事件循环中执行业务规则是暴露缺陷。止血优先按设备分组限重连、对非关键遥测降采样并暂停重复报警,任何网卡队列或亲和性调整都先核对硬件、内核和自动均衡策略。回归看每核 %soft 分布、包率、事件循环延迟、重复消息率和在线恢复时间共同达标。 形成结论后,我还会把资源判断写成容量约束:明确有效核心、内存低水位、允许排队时间和下游并发上限,并注明本次采样的主机、容器和进程归属。随后在预发布复现相同任务量,只改变一个变量验证因果;若资源信号改善而业务尾延迟不变,就回滚结论。最终把基线、阈值、自动保存现场和降级开关固化到运行手册,确保下一次不是重新猜测。
    • 进阶追问:如果资源数字与业务表现不同步,如何避免错误归因?
    • 进阶回答:撤销单指标结论,重新核对采样对象、时间窗口和下游状态,用独立第二证据及单变量实验重建因果。
    • 追问 1:为什么看单位时间增量?
    • 直接回答 1:累计计数包含历史,只有事故窗口增量才能与当前流量和延迟建立时序关系。
    • 追问 2:可以直接修改中断亲和性吗?
    • 直接回答 2:不能作为默认动作,应先确认队列拓扑和自动均衡,在压测环境验证并保留原值与回滚。
    • 追问 3:应用重启为何可能短暂恢复?
    • 直接回答 3:它清空连接和队列并改变流量分布,但设备同步重连和包率根因仍在,随后会再次积累。
    • 详细章节:IoT(物联网)报警风暴
  6. 问题:上下文切换很高时,如何判断是正常并发还是线程过量?

    • 考点:资源分层、采样边界、第二证据、容量与回归。
    • 回答思路:先固定业务窗口和资源归属,再由低开销信号定形,最后跨层验证并用同量级流量回归。
    • 口述答案:上下文切换是调度器保存和恢复执行实体的正常成本,不能用一个固定每秒次数判定故障。我会先把它与流量、线程数、吞吐、P99(99 分位响应时间)和运行队列放到同一时间线:vmstat 1 5 看全局切换趋势,pidstat -w -t -p <PID> 1 5 找责任线程并区分自愿与非自愿切换,线程栈与等待通道再判断是锁、队列、套接字还是时间片抢占。若线程从 32 增到 256 后,切换增长八倍、运行队列持续超过有效核心、缓存命中和吞吐下降、尾延迟上升,才支持线程过量;若吞吐同步增长且延迟仍满足目标,较高切换可能是合理成本。Runner(执行器)等待第三方时增加线程会提高自愿切换、连接和在途量,却不改变下游服务率;WMS(仓储管理系统)热点锁下也会让更多线程睡眠和唤醒。止血是回退线程数、限制入口并按下游舱壁隔离,而不是一次性把线程降到极小。长期通过阶梯压测,每次只改变线程数,记录吞吐拐点、等待比例、内存、切换和下游饱和度。回归要求更少线程下吞吐不降或提升、队列年龄和尾延迟下降,并覆盖峰值与故障场景,避免只在正常流量下得出配置。 形成结论后,我还会把资源判断写成容量约束:明确有效核心、内存低水位、允许排队时间和下游并发上限,并注明本次采样的主机、容器和进程归属。随后在预发布复现相同任务量,只改变一个变量验证因果;若资源信号改善而业务尾延迟不变,就回滚结论。最终把基线、阈值、自动保存现场和降级开关固化到运行手册,确保下一次不是重新猜测。
    • 进阶追问:如果资源数字与业务表现不同步,如何避免错误归因?
    • 进阶回答:撤销单指标结论,重新核对采样对象、时间窗口和下游状态,用独立第二证据及单变量实验重建因果。
    • 追问 1:自愿切换高就一定是锁竞争吗?
    • 直接回答 1:不一定,也可能是正常等待网络、队列或定时器,需要等待对象、线程栈和下游时序作为第二证据。
    • 追问 2:非自愿切换高说明什么?
    • 直接回答 2:可能时间片耗尽、运行队列拥挤或高优先级任务抢占,应结合每核利用率和迁移继续判断。
    • 追问 3:线程池大小能跨机器照搬吗?
    • 直接回答 3:不能,有效核心、容器配额、任务等待比例、下游限额和单任务内存都不同,必须重新压测。
    • 详细章节:调度与上下文切换
  7. 问题:删除大日志后 df 空间没有恢复,而 du 已明显下降,如何排查?

    • 考点:文件生命周期、页缓存、持久化边界、设备排队和任务恢复。
    • 回答思路:从应用确认时点沿页缓存、文件系统、块层和设备追踪,以责任进程和恢复实验闭环。
    • 口述答案du 从目录树遍历仍有名字的文件,df 根据文件系统已分配块统计;进程如果仍持有已删除文件的打开描述符,目录项消失后 du 看不到,但块仍归该打开文件对象,直到最后一个引用关闭才释放。我的流程先确认挂载点,避免在另一个文件系统上比较;用 df -hTdf -ih 区分块和 inode(索引节点)问题,再对目标挂载点做受限 du -x,最后用 lsof +L1 找链接数为 0 但仍被进程持有的文件,记录 PID(进程标识)、文件描述符、大小和责任服务。不能看到差异就直接重启或截断 /proc/<PID>/fd/<FD>,因为可能破坏正在写入的事务日志或应用状态。若是普通滚动日志,优先让日志框架重新打开文件或对单服务执行可控重载;空间危急时先停止非关键写入、扩临时容量并保存现场。长期修复日志轮转要通知进程重开、设置保留和容量阈值,并监控“删除后打开文件字节数”。回归通过相同轮转流程验证旧描述符关闭、df 释放、应用继续写入新文件且日志无断档。还要排除快照、保留块、挂载遮挡和 inode(索引节点)耗尽,它们也能造成 df 与业务观察不一致。这个证据链把文件名生命周期和打开文件生命周期区分开,而不是把命令差异归为工具错误。 对文件与设备结论,我还会检查挂载点、底层设备、文件生命周期和任务标识是否一致,避免把另一个卷或历史累计值当现场。修复后的回归必须覆盖正常完成、中途取消、进程终止和磁盘压力四条路径,比较应用确认时点与真实持久化边界;同时验证临时文件、打开描述符、脏页和队列都能回到稳定低水位,不把一次空间释放当长期完成。
    • 进阶追问:如果设备指标恢复但任务仍失败,下一步看什么?
    • 进阶回答:继续核对文件状态、检查点、应用错误和远端存储,说明设备排队可能只是放大因素而非唯一根因。
    • 追问 1:为什么文件名删除后进程还能写?
    • 直接回答 1:打开描述符引用的是内核打开文件对象和 inode(索引节点),目录项删除只移除名字,不会立即销毁仍被引用的数据。
    • 追问 2:重启能释放吗?
    • 直接回答 2:能关闭描述符但只是高风险止血,可能中断服务;应优先让应用重开日志并修复轮转协议。
    • 追问 3df -ih 解决什么疑问?
    • 直接回答 3:它检查 inode(索引节点)是否耗尽;即使字节空间充足,inode(索引节点)用尽也无法创建新文件。
    • 详细章节:文件删除生命周期
  8. 问题:WMS(仓储管理系统)批量导出为什么会拖慢支付流水同步刷盘?

    • 考点:文件生命周期、页缓存、持久化边界、设备排队和任务恢复。
    • 回答思路:从应用确认时点沿页缓存、文件系统、块层和设备追踪,以责任进程和恢复实验闭环。
    • 口述答案:两类业务若共享同一文件系统和块设备,导出的大量顺序写与支付的小量同步写会在页缓存、文件系统日志、块层队列和设备上竞争。事故开始时导出 write 很快,是页缓存吸收了数据;64 个任务把脏页推到 18GiB(吉字节)后集中回写,设备队列深度从 3 升到 71,await 从 4ms 升到 96ms,支付每笔同步刷盘也要排在长队后,P99(99 分位响应时间)从 7ms 升至 190ms。排查时先用 iostat -xz 1 5 看设备延迟、队列、吞吐和请求大小,用 pidstat -d -p <PID> 1 5 找责任进程,再看脏页、回写、挂载点和支付刷盘分位;必须确认二者落在同一底层设备,不能只看路径不同就认为隔离。止血暂停低优先导出、保留已完成检查点,把每机并发降到设备可承受值;若交易延迟未恢复,再把导出切到独立节点或存储。长期按设备可提供吞吐减去交易预留,除以单任务实测写速率计算准入,并把导出、交易日志和临时文件做资源隔离。回归需要在相同导出量下运行数小时,确认队列、脏页、支付刷盘和任务完成率均稳定,而不是只观察短时间平均吞吐。 对文件与设备结论,我还会检查挂载点、底层设备、文件生命周期和任务标识是否一致,避免把另一个卷或历史累计值当现场。修复后的回归必须覆盖正常完成、中途取消、进程终止和磁盘压力四条路径,比较应用确认时点与真实持久化边界;同时验证临时文件、打开描述符、脏页和队列都能回到稳定低水位,不把一次空间释放当长期完成。
    • 进阶追问:如果设备指标恢复但任务仍失败,下一步看什么?
    • 进阶回答:继续核对文件状态、检查点、应用错误和远端存储,说明设备排队可能只是放大因素而非唯一根因。
    • 追问 1:路径不同是否代表设备不同?
    • 直接回答 1:不代表,需要通过挂载、块设备拓扑和云盘映射确认最终是否共享同一设备或后端限额。
    • 追问 2:为什么 write 快仍会有事故?
    • 直接回答 2:它可能只写入页缓存,真实设备服务率在后续回写和同步刷盘时才暴露。
    • 追问 3:最稳妥的长期隔离是什么?
    • 直接回答 3:独立节点、独立存储配额与有界任务准入,同时保留可恢复分片,避免共享设备争抢。
    • 详细章节:文件系统与 I/O(输入输出)
  9. 问题iostat 显示 %util=100,是否可以直接认定磁盘饱和?

    • 考点:文件生命周期、页缓存、持久化边界、设备排队和任务恢复。
    • 回答思路:从应用确认时点沿页缓存、文件系统、块层和设备追踪,以责任进程和恢复实验闭环。
    • 口述答案:不能。%util 描述采样窗口中设备有 I/O(输入输出)在处理的时间比例,不同内核、设备和并行队列下含义有限;现代并行设备即使持续有请求也可能还有吞吐余量。判断饱和要同时看 await、平均队列深度、每秒操作数、吞吐、请求大小、读写比例和业务完成率,并与设备规格和稳定基线比较。比如顺序大写时 %util=100、吞吐接近规格、await=4ms 且业务正常,不一定故障;随机小同步写时同样 100%,await=90ms、队列 70、支付刷盘 P99(99 分位响应时间)190ms,则支持排队。还要用 pidstat -d 或受控工具找责任进程,检查是否有脏页集中回写、日志轮转、删除文件占用或云盘限速。不能直接修改全局回写参数、切调度器或长期运行高开销跟踪。止血根据业务优先级暂停导出、降低并发或切隔离设备,并声明若交易延迟不改善就回滚磁盘结论。长期使用混合负载压测建立设备服务曲线,把交易预留和突发额度写入容量模型。修复后在相同读写混合下要求业务尾延迟、设备等待和队列同时恢复;若只有 %util 降低,可能只是流量下降,不能证明根因消失。 对文件与设备结论,我还会检查挂载点、底层设备、文件生命周期和任务标识是否一致,避免把另一个卷或历史累计值当现场。修复后的回归必须覆盖正常完成、中途取消、进程终止和磁盘压力四条路径,比较应用确认时点与真实持久化边界;同时验证临时文件、打开描述符、脏页和队列都能回到稳定低水位,不把一次空间释放当长期完成。
    • 进阶追问:如果设备指标恢复但任务仍失败,下一步看什么?
    • 进阶回答:继续核对文件状态、检查点、应用错误和远端存储,说明设备排队可能只是放大因素而非唯一根因。
    • 追问 1await 包含什么?
    • 直接回答 1:通常包含请求在设备队列等待和实际服务的总时间,需结合队列与设备实现解释。
    • 追问 2:云盘还要看什么?
    • 直接回答 2:看供应商的 IOPS(每秒输入输出操作数)、吞吐、突发额度和限速指标,主机视图可能看不到后端节流细节。
    • 追问 3:为什么平均值会掩盖问题?
    • 直接回答 3:少量同步关键写可能有极高尾延迟,却被大量顺序异步写稀释,因此要看业务分位和负载类型。
    • 详细章节:块层与设备证据
  10. 问题writefsync 和任务成功状态之间应该如何设计边界?

  • 考点:文件生命周期、页缓存、持久化边界、设备排队和任务恢复。
  • 回答思路:从应用确认时点沿页缓存、文件系统、块层和设备追踪,以责任进程和恢复实验闭环。
  • 口述答案write 通常把数据复制到页缓存并更新内核状态,返回并不代表断电后仍在;fsync 请求把文件数据和必要元数据同步到稳定存储,但具体保证仍受文件系统、设备缓存和挂载配置影响。业务是否需要同步必须由丢失语义决定。异步导出文件可以分片重建,不应每小块都同步刷盘;它可以在完成一个可恢复段后记录检查点,最终原子发布。支付流水和任务状态若是恢复依据,则要由数据库或日志系统提供经过验证的持久化语义,应用只有在关键事务提交后才能返回“已受理”或“成功”。还要区分文件内容、目录项和原子改名:创建临时文件、同步内容、改名并在严格场景同步目录,才能缩小崩溃窗口。排查时对齐应用返回、系统调用耗时、脏页、设备队列和崩溃恢复结果,不能看到 fsync 成功就忽略底层错误。止血可降低非关键同步频率、暂停共享设备导出,但不能为了延迟绕过资金关键持久化。长期按业务等级划分写策略、设备隔离和批量提交。回归要在写入不同阶段注入进程终止和节点重启,验证已确认数据可恢复、未确认数据可重放、任务不会发布半文件,并记录同步延迟分位。 对文件与设备结论,我还会检查挂载点、底层设备、文件生命周期和任务标识是否一致,避免把另一个卷或历史累计值当现场。修复后的回归必须覆盖正常完成、中途取消、进程终止和磁盘压力四条路径,比较应用确认时点与真实持久化边界;同时验证临时文件、打开描述符、脏页和队列都能回到稳定低水位,不把一次空间释放当长期完成。
  • 进阶追问:如果设备指标恢复但任务仍失败,下一步看什么?
  • 进阶回答:继续核对文件状态、检查点、应用错误和远端存储,说明设备排队可能只是放大因素而非唯一根因。
  • 追问 1:每次写都同步是否最安全?
  • 直接回答 1:它会显著降低吞吐并放大排队,也未自动解决跨文件和业务事务原子性;应按一致性边界批量或由数据库保证。
  • 追问 2:原子改名解决什么?
  • 直接回答 2:让读者只看到旧完整文件或新完整文件,避免暴露半成品,但持久化目录项仍需按故障要求验证。
  • 追问 3:任务何时可以标记完成?
  • 直接回答 3:所有必需分片校验通过、最终对象可读取且完成状态持久化后,不能以最后一次 write 返回作为完成。
  • 详细章节:同步刷盘与稳定落盘
  1. 问题:如何设计一个既不会 OOM(内存溢出)又不会占满磁盘的批量导出?
  • 考点:文件生命周期、页缓存、持久化边界、设备排队和任务恢复。
  • 回答思路:从应用确认时点沿页缓存、文件系统、块层和设备追踪,以责任进程和恢复实验闭环。
  • 口述答案:我会先把大导出当成有状态、可恢复的流式任务,而不是一次请求里把全部数据和文件放进内存。任务创建时记录查询快照边界、稳定排序键、租户、预估行数和配额;执行器按 5,000 行左右分片读取,只保留当前编码缓冲,写入临时文件或对象存储分段,并在每段确认后持久化游标、字节数和校验和。内存容量按“并发任务×单分片工作集+运行时余量”计算,磁盘容量按临时文件峰值、上传滞留和清理时窗计算;每机并发再受设备吞吐、脏页和交易预留约束。任务使用同一标识重试,失败从最后检查点恢复;取消时停止新分片并延迟清理,最终通过条件更新发布下载地址,防止半文件可见。入口有租户配额、队列年龄和预计完成时间,不能无限接受。排查关注堆与本地内存低水位、临时文件字节、删除后打开文件、设备 await、上传速率和对象校验。止血可暂停低优先任务、降并发和扩临时空间,但要保留检查点。回归使用 80 万行、2GiB(吉字节)文件和中途终止,验证内存有上界、磁盘可回收、恢复不重复数据、交易刷盘不受影响,且任务状态与最终文件一致。 对文件与设备结论,我还会检查挂载点、底层设备、文件生命周期和任务标识是否一致,避免把另一个卷或历史累计值当现场。修复后的回归必须覆盖正常完成、中途取消、进程终止和磁盘压力四条路径,比较应用确认时点与真实持久化边界;同时验证临时文件、打开描述符、脏页和队列都能回到稳定低水位,不把一次空间释放当长期完成。
  • 进阶追问:如果设备指标恢复但任务仍失败,下一步看什么?
  • 进阶回答:继续核对文件状态、检查点、应用错误和远端存储,说明设备排队可能只是放大因素而非唯一根因。
  • 追问 1:为什么稳定排序键重要?
  • 直接回答 1:它让分片游标可重复定位,避免分页期间数据变化造成重复或遗漏;还需定义快照或增量边界。
  • 追问 2:对象存储分段上传失败怎么办?
  • 直接回答 2:保留上传标识和已确认分段,重试未确认部分;超过租约的残留上传由清理任务回收。
  • 追问 3:如何保护交易业务?
  • 直接回答 3:导出使用独立队列、线程、节点或存储配额,动态并发以设备水位和交易 P99(99 分位响应时间)为门禁。
  • 详细章节:WMS(仓储管理系统)导出案例
  1. 问题:请完整讲清 TCP(传输控制协议)三次握手以及连接队列满时的故障证据。
  • 考点:连接状态、窗口、重传、端口、时间预算和结果未知。
  • 回答思路:按两端四元组和统一时间线定位报文阶段,再结合套接字、路径与业务状态交叉验证。
  • 口述答案:三次握手让双方确认收发能力、初始序列号和连接参数:客户端发送 SYN,服务端记录半连接并返回 SYN+ACK,客户端确认后服务端把连接转入已完成队列,应用 accept 取走。它不仅是“多一次确认”,还防止陈旧请求直接建立错误连接,并同步双方序列空间。连接失败要区分监听不存在、半连接队列压力、已完成队列未及时消费、路径丢包和应用线程未接收。我的证据链先用 ss -lntp 确认地址端口和责任进程,再看 ss -snstat -az 中握手重传、监听溢出等增量,结合 sar -n TCP,ETCP 1 5 和受限 tcpdump 的目标主机端口过滤观察哪一步缺失;同时检查 Netty(网络通信框架)接收线程和 EventLoop(事件循环)是否阻塞。若客户端只发 SYN 无返回,可能是路径或服务端未监听;若服务端反复发 SYN+ACK 无第三次确认,关注回程路径;若握手完成但应用超时,进入已完成队列、事件循环或业务层。止血可限新连接、恢复接收线程、切健康实例,不能看到队列指标就直接改内核上限。长期提高连接复用、匹配接收能力并做重连抖动。回归在目标建连率下验证握手成功率、队列溢出、接收延迟和业务成功率。 网络判断还必须对齐两端和中间代理的时钟、四元组、连接年龄与请求标识,明确证据采集点能看到什么、看不到什么。修复后我会在相同往返时间、连接建立率和受控丢包下回归,观察握手成功率、重传、套接字队列、端口分配和业务未知状态;若只靠增加超时或重试获得表面成功,就说明反馈回路仍未真正治理。
  • 进阶追问:如果单侧网络证据与对端日志冲突,怎样处理?
  • 进阶回答:先统一时钟、四元组和采集点,考虑卸载与代理边界,再取得另一侧或中间点证据,保留不确定性。
  • 追问 1:为什么不能只看端口能否连通?
  • 直接回答 1:握手成功只证明传输连接建立,不证明应用已接收、解析、鉴权或有能力处理请求。
  • 追问 2:调大队列能解决吗?
  • 直接回答 2:只能增加吸收窗口,应用接收或处理率不足时会把过载延后并占更多资源,需先修复服务率和背压。
  • 追问 3:设备重连风暴如何保护握手队列?
  • 直接回答 3:客户端指数退避加随机抖动,服务端按设备限建连并分散实例,同时保持会话减少重复认证工作。
  • 详细章节:TCP/IP(传输控制协议/互联网协议)握手与队列
  1. 问题TIME_WAIT 很多是否就是端口耗尽,应该如何判断?
  • 考点:连接状态、窗口、重传、端口、时间预算和结果未知。
  • 回答思路:按两端四元组和统一时间线定位报文阶段,再结合套接字、路径与业务状态交叉验证。
  • 口述答案TIME_WAIT 是主动关闭方在连接结束后保留一段时间的状态,用于吸收旧报文并确保最后确认有机会重传,本身不是故障。判断端口耗尽要看四元组可用范围、每秒新建连接率、状态持续时间、目标地址分布和实际分配失败,而不是只看数量。我的流程先用 ss -s 和按目标聚合的 ss -tan 观察状态与连接创建趋势,再核对客户端临时端口范围、连接池复用率、应用的 Cannot assign requested address 等错误和 NAT(网络地址转换)设备会话限制。若同一客户端到同一目标每秒创建 2 万短连接,端口空间约 2.8 万且状态保留约 60 秒,理论需求远超可用组合,才支持风险;若目标分散、连接创建低且无分配失败,大量状态可能只是正常历史连接。还要区分 CLOSE_WAIT,它表示对端已关闭而本地应用未关闭,治理完全不同。止血优先启用或修复连接池、限制短连接创建和重试,必要时扩客户端源地址或分散实例;不默认修改状态回收内核参数,因为可能破坏报文安全假设。支付与跨境调用还需对齐代理空闲寿命,避免复用陈旧连接。回归看新建率、端口分配错误、连接复用、P99(99 分位响应时间)和业务成功率,不以状态数量降为零为目标。 网络判断还必须对齐两端和中间代理的时钟、四元组、连接年龄与请求标识,明确证据采集点能看到什么、看不到什么。修复后我会在相同往返时间、连接建立率和受控丢包下回归,观察握手成功率、重传、套接字队列、端口分配和业务未知状态;若只靠增加超时或重试获得表面成功,就说明反馈回路仍未真正治理。
  • 进阶追问:如果单侧网络证据与对端日志冲突,怎样处理?
  • 进阶回答:先统一时钟、四元组和采集点,考虑卸载与代理边界,再取得另一侧或中间点证据,保留不确定性。
  • 追问 1:谁通常进入 TIME_WAIT
  • 直接回答 1:主动完成连接关闭的一方通常进入,但具体取决于关闭时序,客户端并非永远是主动方。
  • 追问 2CLOSE_WAIT 多说明什么?
  • 直接回答 2:对端已发关闭而本地应用迟迟未关闭套接字,应检查连接生命周期、异常路径和资源释放。
  • 追问 3:为什么优先连接复用?
  • 直接回答 3:它直接降低握手、临时端口、服务端队列和安全握手成本,从源头减少短连接压力。
  • 详细章节:TCP(传输控制协议)状态与端口
  1. 问题:出现 TCP(传输控制协议)重传时,怎样判断责任方向并避免误判?
  • 考点:连接状态、窗口、重传、端口、时间预算和结果未知。
  • 回答思路:按两端四元组和统一时间线定位报文阶段,再结合套接字、路径与业务状态交叉验证。
  • 口述答案:重传说明发送方没有按预期获得确认或通过快速重传判断缺段,但不能直接说“服务端网络差”。先统一两端时间、连接四元组和请求标识,用 ss -ti 看目标流的重传、往返时间和拥塞窗口,用 nstatsar -n ETCP 看事故窗口增量,再在批准范围内对单主机、单端口、短时长进行受限抓包。若客户端发出的序列段在客户端出口可见、服务端入口不可见,问题在中间或接收前;若服务端收到并确认,但客户端看不到确认,检查回程;若双方都看到报文而应用仍慢,转事件循环、套接字队列和业务处理。还要看网卡丢包、错误、路径变化和 MTU(最大传输单元)探测,重传也可能由接收端处理不及时、拥塞或抓包点卸载机制造成观察偏差。跨境链路 1% 丢包会显著放大尾延迟,固定间隔重试又可能制造更多拥塞。止血可切备用路径、降低并发、限制重试和扩大合理预算,但写操作仍须原键幂等与结果查证。长期优化连接复用、路径监控、拥塞算法和代理预算。回归在相同 RTT(往返时间)与故障注入下,要求重传、业务尾延迟、请求放大和未知状态年龄共同下降,并保存两端证据而不是只引用单侧累计计数。 网络判断还必须对齐两端和中间代理的时钟、四元组、连接年龄与请求标识,明确证据采集点能看到什么、看不到什么。修复后我会在相同往返时间、连接建立率和受控丢包下回归,观察握手成功率、重传、套接字队列、端口分配和业务未知状态;若只靠增加超时或重试获得表面成功,就说明反馈回路仍未真正治理。
  • 进阶追问:如果单侧网络证据与对端日志冲突,怎样处理?
  • 进阶回答:先统一时钟、四元组和采集点,考虑卸载与代理边界,再取得另一侧或中间点证据,保留不确定性。
  • 追问 1:单侧抓包能确定丢包点吗?
  • 直接回答 1:通常不能,只能证明该采集点看到或没看到;确定方向需要两端或多点证据并考虑网卡卸载和采样丢包。
  • 追问 2:重传一定由物理丢包造成吗?
  • 直接回答 2:不一定,也可能拥塞、乱序、确认延迟、接收处理不足或中间设备行为,需要结合窗口与路径判断。
  • 追问 3:为什么不能无过滤长期抓包?
  • 直接回答 3:会带来性能、磁盘和敏感数据风险;应限定接口、主机、端口、大小、时长并使用环形缓冲。
  • 详细章节:TCP(传输控制协议)重传与拥塞
  1. 问题:滑动窗口、拥塞窗口和零窗口分别解决什么问题,线上如何区分?
  • 考点:连接状态、窗口、重传、端口、时间预算和结果未知。
  • 回答思路:按两端四元组和统一时间线定位报文阶段,再结合套接字、路径与业务状态交叉验证。
  • 口述答案:接收窗口解决接收方缓冲和消费能力,发送方在途未确认数据不能超过对方通告的窗口;拥塞窗口由发送方根据路径拥塞信号调节,保护网络;实际可发送量受两者较小值约束。零窗口是接收方通告暂时没有空间,发送方停止正常发送并周期探测,它更像接收应用或缓冲压力,不等同路径丢包。线上我先用 ss -ti 观察目标连接的发送/接收队列、往返时间、重传、窗口和拥塞状态,再对齐接收端应用处理率、事件循环延迟与线程栈。若接收队列持续增长、窗口降为零,而网卡无丢包,说明数据已到内核但应用消费跟不上;Netty(网络通信框架)事件循环阻塞、解码等待或主动关闭 autoRead 都可能造成。若接收窗口充足但拥塞窗口收缩、重传和往返时间上升,更偏路径拥塞或丢包。还要排除抓取时点、窗口缩放和单次样本误差。IoT(物联网)风暴中业务处理器占用 EventLoop(事件循环)会让接收消费下降,设备继续发送,最终表现为队列和窗口压力;单纯调大缓冲只会增加内存并延后背压。止血应限入口、卸载阻塞任务或暂停非关键读取,长期建立端到端背压。回归看窗口恢复、队列下降、事件循环延迟与业务吞吐同步正常,并验证慢消费者不会拖垮其他连接。 网络判断还必须对齐两端和中间代理的时钟、四元组、连接年龄与请求标识,明确证据采集点能看到什么、看不到什么。修复后我会在相同往返时间、连接建立率和受控丢包下回归,观察握手成功率、重传、套接字队列、端口分配和业务未知状态;若只靠增加超时或重试获得表面成功,就说明反馈回路仍未真正治理。
  • 进阶追问:如果单侧网络证据与对端日志冲突,怎样处理?
  • 进阶回答:先统一时钟、四元组和采集点,考虑卸载与代理边界,再取得另一侧或中间点证据,保留不确定性。
  • 追问 1:零窗口时连接是否断开?
  • 直接回答 1:通常不会,发送方保留连接并做窗口探测;持续时间过长才可能触发应用超时或策略关闭。
  • 追问 2:调大接收缓冲是否有效?
  • 直接回答 2:只扩大吸收窗口,应用服务率不变时最终仍会填满,还增加每连接内存,应先修复消费和背压。
  • 追问 3:发送队列大说明什么?
  • 直接回答 3:数据尚未被对端确认,可能对端慢、窗口小、路径拥塞或本地生产过快,需结合窗口与重传区分。
  • 详细章节:TCP(传输控制协议)窗口机制
  1. 问题:连接出现大量 CLOSE_WAIT,怎样从套接字定位到应用代码?
  • 考点:连接状态、窗口、重传、端口、时间预算和结果未知。
  • 回答思路:按两端四元组和统一时间线定位报文阶段,再结合套接字、路径与业务状态交叉验证。
  • 口述答案CLOSE_WAIT 表示本地已经收到对端关闭方向的报文,内核在等待本地应用关闭套接字,因此长期大量出现通常指向应用连接生命周期或异常路径,而不是让内核“加速回收”。我会先按进程和目标地址聚合 ss -tanp state close-wait,记录增长速率、存活时间和文件描述符占用;再用 lsof -p <PID>/proc/<PID>/fd 确认责任进程及连接对象。Java(编程语言)服务继续检查连接池借还、响应体关闭、异常/取消分支和线程栈,关联请求标识判断是否集中在特定渠道或接口。若对端主动关闭后,本地线程仍阻塞在业务逻辑,或连接对象没有进入清理回调,就形成应用证据;若状态只是短暂出现并快速下降,则可能是正常关闭窗口。还要检查文件描述符上限和新建连接失败,因为 CLOSE_WAIT 泄漏会逐步耗尽资源。止血可摘除异常实例、限制入口并分批重启,但重启前保存连接分布和线程现场,避免只清空证据。长期修复使用结构化资源管理、在成功、异常、超时和取消路径都关闭连接,连接池增加借出年龄和泄漏告警。回归对远端主动关闭、半响应、超时取消和解析异常做自动化注入,要求状态在预期时间内归零、文件描述符低水位稳定且业务重试不放大。 网络判断还必须对齐两端和中间代理的时钟、四元组、连接年龄与请求标识,明确证据采集点能看到什么、看不到什么。修复后我会在相同往返时间、连接建立率和受控丢包下回归,观察握手成功率、重传、套接字队列、端口分配和业务未知状态;若只靠增加超时或重试获得表面成功,就说明反馈回路仍未真正治理。
  • 进阶追问:如果单侧网络证据与对端日志冲突,怎样处理?
  • 进阶回答:先统一时钟、四元组和采集点,考虑卸载与代理边界,再取得另一侧或中间点证据,保留不确定性。
  • 追问 1CLOSE_WAITTIME_WAIT 谁更偏应用问题?
  • 直接回答 1:长期堆积的 CLOSE_WAIT 更直接表示本地应用未关闭;TIME_WAIT 多是正常传输状态,需结合端口压力判断。
  • 追问 2:修改内核参数能解决吗?
  • 直接回答 2:不能替应用关闭套接字,根因是资源生命周期;参数调整可能掩盖问题或破坏连接语义。
  • 追问 3:为何要测取消路径?
  • 直接回答 3:请求取消和超时最容易跳过正常释放逻辑,线上间歇泄漏往往来自这些分支。
  • 详细章节:TCP(传输控制协议)关闭状态
  1. 问题:支付跨境链路 RTT(往返时间)高时,如何设超时、重试和连接池?
  • 考点:连接状态、窗口、重传、端口、时间预算和结果未知。
  • 回答思路:按两端四元组和统一时间线定位报文阶段,再结合套接字、路径与业务状态交叉验证。
  • 口述答案:我不会按国内链路复制一个统一超时,而是先用生产分段数据建立预算:域名解析、池等待、建连、安全握手、首字节、读取和回包各有分位值,再从用户总截止时间倒推。假设总预算 2.5s,解析 100ms、建连与握手 600ms、渠道处理 1.2s、回包 300ms,还要保留清理和查证余量;代理和内层超时必须小于外层剩余预算,避免外层已返回而内层继续扣款。连接池通过复用减少高 RTT(往返时间)下的握手成本,但最大连接数受渠道并发配额约束,客户端空闲寿命应短于代理回收时间并监控陈旧连接复位。重试只针对明确可重试且仍有预算的故障,使用同一支付业务键、指数退避和随机抖动;写请求超时进入未知状态时优先主动查单,而不是启动第二笔扣款。证据上用分段请求耗时、池借出等待、连接年龄、ss -ti 的往返与重传、代理日志和渠道流水交叉验证。止血可切备用渠道、降低并发、延长合理首字节预算,但要预先核对在途状态和备用容量。回归在目标 RTT(往返时间)、1% 丢包和代理提前超时下注入,要求成功率、未知年龄、重复副作用、连接复用和尾延迟同时达标,不能只追求平均更快。 网络判断还必须对齐两端和中间代理的时钟、四元组、连接年龄与请求标识,明确证据采集点能看到什么、看不到什么。修复后我会在相同往返时间、连接建立率和受控丢包下回归,观察握手成功率、重传、套接字队列、端口分配和业务未知状态;若只靠增加超时或重试获得表面成功,就说明反馈回路仍未真正治理。
  • 进阶追问:如果单侧网络证据与对端日志冲突,怎样处理?
  • 进阶回答:先统一时钟、四元组和采集点,考虑卸载与代理边界,再取得另一侧或中间点证据,保留不确定性。
  • 追问 1:连接池越大越好吗?
  • 直接回答 1:不是,超过渠道服务率只会扩大排队、内存和在途未知,还可能触发对方限流。
  • 追问 2:为什么要传播截止时间?
  • 直接回答 2:让每层知道剩余预算,避免启动必然来不及完成的下游调用和超预算重试。
  • 追问 3:网络超时如何保证资金正确?
  • 直接回答 3:稳定支付单号、唯一流水、状态机、主动查单、幂等回调、对账和补偿共同兜底。
  • 详细章节:跨境连接与结果未知
  1. 问题:HTTP(超文本传输协议)504 是否表示上游业务没有执行,支付回调应如何处理?
  • 考点:应用协议语义、安全身份、连接复用、业务幂等和失败恢复。
  • 回答思路:拆分协议阶段与业务提交时点,先证明网络事实,再用权威状态、查证和对账保证结果。
  • 口述答案504 通常表示代理没有在自身等待预算内获得上游响应,只描述代理观察,不证明请求未到达或业务未提交。支付回调或扣款可能已经通过网关、进入应用并完成数据库事务,只是响应晚到或回程丢失。我的处理首先保留端到端请求标识、支付业务键和各层接收/提交时间,在代理日志确认超时点,在应用日志和权威数据库核对是否受理,再到渠道主动查单。客户端或渠道重试必须携带原业务键,服务端以渠道流水唯一约束和状态机复用既有结果;不能收到 504 就生成新单再次扣款。超时预算要外层大于内层并传播截止时间,应用在剩余预算不足时拒绝启动新副作用,但已提交的结果仍需返回或通过查询暴露。止血可临时放宽与真实 P99(99 分位响应时间)不匹配的代理超时、限重试并增加查单频率,同时以未知状态年龄和重复回调率监控;如果放宽导致连接池饱和则立即回滚。长期优化慢处理、异步化非关键通知并建立对账。回归在“提交后响应丢失”和“代理先超时”两个窗口下注入,验证只有一条资金分录、重复回调返回同一结果、未知状态最终清零,且接口延迟与连接占用满足容量。 应用协议层的验收不能止于状态码或握手成功,还要把代理、应用提交、外部流水和最终业务状态串起来。修复后我会覆盖新连接与复用连接、正常响应与响应丢失、重复请求与证书切换,验证身份校验不降级、同一业务意图只产生一次副作用、未知结果能够查证,并监控分段耗时、连接年龄和状态收敛时间。
  • 进阶追问:协议恢复后为什么还要核对业务终态?
  • 进阶回答:连接和状态码恢复只证明通信可用,事故窗口内已提交、重复或未知的业务仍需查询、对账和补偿。
  • 追问 1:什么情况下可以把调用记为明确失败?
  • 直接回答 1:权威系统返回不会再提交的失败终态,或本地在副作用开始前原子拒绝,才可明确失败。
  • 追问 2:代理取消上游请求能解决吗?
  • 直接回答 2:不能消除提交竞态,取消可减少无效工作,但资金正确性仍依赖幂等、查单和对账。
  • 追问 3:为什么响应要尽快返回?
  • 直接回答 3:减少渠道重发和连接占用;非关键后续处理可通过可靠事件异步执行。
  • 详细章节:HTTP(超文本传输协议)结果未知
  1. 问题:HTTPS(安全超文本传输协议)握手失败,如何区分证书、域名、协议和网络问题?
  • 考点:应用协议语义、安全身份、连接复用、业务幂等和失败恢复。
  • 回答思路:拆分协议阶段与业务提交时点,先证明网络事实,再用权威状态、查证和对账保证结果。
  • 口述答案:我先把域名解析、TCP(传输控制协议)建连和 TLS(传输层安全协议)握手分开,因为“安全连接失败”可能发生在不同阶段。用 dig +stats <HOST> 确认解析结果与耗时,用 curl -v --connect-timeout ... 或分段指标确认是否完成建连,再以限定主机名的 openssl s_client -connect <HOST>:<PORT> -servername <HOST> 查看服务端证书链、有效期、主机名、协商版本和告警;命令输出可能含敏感信息,生产需脱敏并限时。若建连失败,转路由、监听和握手队列;若证书链不受信,核对客户端信任库和中间证书;若主机名不匹配,检查 SNI(服务器名称指示)和负载均衡证书路由;若无共同协议或密码套件,核对两端版本策略;若 ALPN(应用层协议协商)不一致,可能回退或应用协议失败。还要比较不同实例和网络路径,防止单节点证书未更新。支付场景绝不能通过关闭证书校验止血;可切已验证的备用域名或渠道,并确认在途请求状态。长期做证书到期、链完整性和域名覆盖自动巡检,发布前在真实信任库验证。回归需覆盖新连接、会话恢复、不同客户端版本和代理路径,要求握手成功率、耗时、证书剩余天数与业务成功率达标。 应用协议层的验收不能止于状态码或握手成功,还要把代理、应用提交、外部流水和最终业务状态串起来。修复后我会覆盖新连接与复用连接、正常响应与响应丢失、重复请求与证书切换,验证身份校验不降级、同一业务意图只产生一次副作用、未知结果能够查证,并监控分段耗时、连接年龄和状态收敛时间。
  • 进阶追问:协议恢复后为什么还要核对业务终态?
  • 进阶回答:连接和状态码恢复只证明通信可用,事故窗口内已提交、重复或未知的业务仍需查询、对账和补偿。
  • 追问 1:为什么必须设置 SNI(服务器名称指示)?
  • 直接回答 1:同一地址可能托管多个域名,服务端需要主机名选择正确证书;缺失时可能返回默认且不匹配的证书。
  • 追问 2:证书未过期为何仍失败?
  • 直接回答 2:可能中间链缺失、主机名不匹配、信任库过旧、用途不符或客户端与服务端协议不兼容。
  • 追问 3:关闭校验为何不可接受?
  • 直接回答 3:它破坏身份认证,使中间人可伪装渠道,支付和隐私数据将失去安全边界。
  • 详细章节:TLS(传输层安全协议)与证书
  1. 问题:HTTP(超文本传输协议)连接复用偶发复位,如何证明是陈旧连接?
  • 考点:应用协议语义、安全身份、连接复用、业务幂等和失败恢复。
  • 回答思路:拆分协议阶段与业务提交时点,先证明网络事实,再用权威状态、查证和对账保证结果。
  • 口述答案:陈旧连接的核心是客户端和中间层对连接存活状态认知不一致:代理已在 60 秒关闭空闲连接,客户端池仍保留 5 分钟,下一次借出后首次写入才收到复位。证明需要连接年龄与失败分布,而不是看到一次 Connection reset 就下结论。我会记录连接创建、最后使用、借出次数、目标地址、失败阶段和重试结果,核对代理空闲回收配置;用 ss 观察连接状态和受限抓包确认复位发生在空闲后的首次使用。若失败集中在 70 至 110 秒旧连接,而新建连接立即成功,缩短客户端空闲寿命到 45 秒后同样负载下复位消失,就形成较强证据。还要排除服务端过载主动复位、进程重启、连接池误共享身份和路径设备超时。止血可淘汰超过阈值的连接、借出前校验并在幂等和剩余预算允许时限次重试;不能对所有支付写请求自动重发。长期统一客户端、代理和服务端的连接寿命,监控连接年龄、池等待、新建率和复位率。回归包含跨过代理回收阈值的空闲测试、并发借还和中间层滚动重启,要求无重复副作用且尾延迟恢复,而不是用无界重试掩盖首请求失败。 应用协议层的验收不能止于状态码或握手成功,还要把代理、应用提交、外部流水和最终业务状态串起来。修复后我会覆盖新连接与复用连接、正常响应与响应丢失、重复请求与证书切换,验证身份校验不降级、同一业务意图只产生一次副作用、未知结果能够查证,并监控分段耗时、连接年龄和状态收敛时间。
  • 进阶追问:协议恢复后为什么还要核对业务终态?
  • 进阶回答:连接和状态码恢复只证明通信可用,事故窗口内已提交、重复或未知的业务仍需查询、对账和补偿。
  • 追问 1:传输层保活能完全避免吗?
  • 直接回答 1:不能保证,默认探测周期可能大于代理阈值,中间层也可能按自身策略回收;应用池寿命仍要对齐。
  • 追问 2:借出前校验是否有成本?
  • 直接回答 2:有额外调用或系统检查成本,应结合连接年龄和失败概率使用,不能让校验本身成为瓶颈。
  • 追问 3:重试成功能证明陈旧连接吗?
  • 直接回答 3:单次不能,还需失败与连接年龄、代理阈值的统计相关,以及调整寿命后的对照实验。
  • 详细章节:HTTP(超文本传输协议)连接复用
  1. 问题:HTTP(超文本传输协议)协议幂等和支付业务幂等有什么不同?
  • 考点:应用协议语义、安全身份、连接复用、业务幂等和失败恢复。
  • 回答思路:拆分协议阶段与业务提交时点,先证明网络事实,再用权威状态、查证和对账保证结果。
  • 口述答案:协议幂等描述重复同一请求意图后资源效果等价,例如对固定资源执行覆盖;它不保证两次响应相同,也不知道跨实例、跨渠道的两次请求是否属于同一笔支付。支付业务幂等必须先定义稳定身份,例如商户订单号、支付单号和渠道流水,再由数据库唯一约束做原子受理,状态机限制 PROCESSINGSUCCESSFAILED 等合法迁移,重复请求读取并复用第一次结果。网络超时后请求可能未到达、处理中或已成功,协议方法名称不能消除未知窗口;需要主动查单、幂等回调、账务分录和日终对账。随机请求标识如果每次重试都变化,只能追踪网络尝试,不能防重复扣款。实现时验签后先落回调唯一流水,在事务中条件迁移并写可靠事件;外部扣款使用同一渠道请求号。止血期间宁可保持处理中并限制用户再次支付,也不能生成新键重复调用。回归要并发提交相同业务键、在提交后断开、重复回调十次并模拟查单超时,验证资金副作用一次、状态不倒退、返回结果一致和差异最终清零。设计边界是幂等防重复,不自动保证顺序、金额正确或跨系统原子性,这些仍需校验、状态机和补偿。 应用协议层的验收不能止于状态码或握手成功,还要把代理、应用提交、外部流水和最终业务状态串起来。修复后我会覆盖新连接与复用连接、正常响应与响应丢失、重复请求与证书切换,验证身份校验不降级、同一业务意图只产生一次副作用、未知结果能够查证,并监控分段耗时、连接年龄和状态收敛时间。
  • 进阶追问:协议恢复后为什么还要核对业务终态?
  • 进阶回答:连接和状态码恢复只证明通信可用,事故窗口内已提交、重复或未知的业务仍需查询、对账和补偿。
  • 追问 1POST 能否实现幂等?
  • 直接回答 1:可以由业务要求稳定幂等键并持久化结果,使重复提交复用同一实体,尽管方法本身通常不保证。
  • 追问 2:仅用分布式锁够吗?
  • 直接回答 2:不够,锁可能失效且不保存结果;最终仍需唯一约束、状态机和账务边界。
  • 追问 3:幂等是否意味着重复请求都返回成功?
  • 直接回答 3:不是,应返回第一次业务的真实终态,首次明确失败时重复仍应失败或按状态机允许重试。
  • 详细章节:协议与业务幂等
  1. 问题:MQTT(消息队列遥测传输协议)QoS(服务质量)1 重复消息如何做到业务只处理一次?
  • 考点:应用协议语义、安全身份、连接复用、业务幂等和失败恢复。
  • 回答思路:拆分协议阶段与业务提交时点,先证明网络事实,再用权威状态、查证和对账保证结果。
  • 口述答案:QoS(服务质量)1 提供至少一次交付:发送方在未收到确认时会重发,接收方必须接受协议重复。业务层“只处理一次”不是依赖连接内的重复标志,而是用跨重连稳定的事件身份,例如设备编号、单调事件序号和消息类型组成唯一键。接入层完成认证、报文上限与基本校验后,把原始事件可靠写入分区队列;消费事务先尝试插入事件流水或条件更新设备最后序号,已存在则返回既有结果,不再触发报警和通知。乱序场景不能简单丢弃小序号,因为设备可能离线补传,需按业务定义允许窗口、事件时间和状态版本。确认时点也重要:过早确认会在后续写入失败时丢数据,过晚确认会增加重复,因此应在可靠接管后确认。IoT(物联网)风暴中 35% 重复会把规则计算和通知成倍放大,所以报警层还要按设备、规则和窗口聚合,只对状态变化通知。止血可降低非关键遥测采样、限制重连并暂停重复通知,不能破坏关键事件可靠接管。回归模拟确认丢失、进程终止、会话恢复和乱序重放,要求原始事件可追踪、业务状态正确、重复报警低于阈值,队列与事件循环不失控。 应用协议层的验收不能止于状态码或握手成功,还要把代理、应用提交、外部流水和最终业务状态串起来。修复后我会覆盖新连接与复用连接、正常响应与响应丢失、重复请求与证书切换,验证身份校验不降级、同一业务意图只产生一次副作用、未知结果能够查证,并监控分段耗时、连接年龄和状态收敛时间。
  • 进阶追问:协议恢复后为什么还要核对业务终态?
  • 进阶回答:连接和状态码恢复只证明通信可用,事故窗口内已提交、重复或未知的业务仍需查询、对账和补偿。
  • 追问 1:升级 QoS(服务质量)2 是否可删除业务幂等?
  • 直接回答 1:不可以,协议边界外的桥接、消费重试、数据库提交响应丢失和人工补发仍可能重复。
  • 追问 2:设备时间能作为唯一依据吗?
  • 直接回答 2:不能,设备时钟可能漂移或回拨,应优先单调序号并把事件时间作为业务排序维度。
  • 追问 3:何时返回确认?
  • 直接回答 3:当平台已把消息可靠接管到可恢复存储或队列后确认,具体由丢失与重复成本权衡。
  • 详细章节:MQTT(消息队列遥测传输协议)可靠性
  1. 问题:HTTP(超文本传输协议)2 多路复用为什么仍会出现队头阻塞,是否应直接升级 HTTP(超文本传输协议)3?
  • 考点:应用协议语义、安全身份、连接复用、业务幂等和失败恢复。
  • 回答思路:拆分协议阶段与业务提交时点,先证明网络事实,再用权威状态、查证和对账保证结果。
  • 口述答案:HTTP(超文本传输协议)2 在应用层把多个流的帧交错到一条 TCP(传输控制协议)连接,消除了响应必须按请求顺序完成的应用层队头阻塞,但底层仍是可靠有序字节流。一个关键字节丢失时,后续已经到达的其他流字节也要等缺口重传,因此高丢包路径上单连接会同时影响许多流。HTTP(超文本传输协议)3 基于 QUIC(快速互联网连接协议)把不同流的可靠交付状态分离,单流丢包通常不阻塞其他流,但仍共享带宽和拥塞控制,也受代理、用户数据报协议路径、端点实现和观测能力限制。选型前我会按真实地区、资源数量、连接复用、丢包、RTT(往返时间)和代理支持做灰度,比较首字节、整体完成时间、尾延迟、处理器成本和失败回退,而不是只看协议名称。跨境轨迹 API(应用程序接口)若每次只有一个小请求,升级收益可能小于连接复用和预算治理;前端大量并发资源更可能受益。止血网络抖动优先限制重试、切路径和降低单连接影响面,不在事故中临时更换协议。长期迁移必须保留 HTTP(超文本传输协议)2/1.1 回退、证书与安全策略、流量观测。回归注入 1% 丢包和不同代理,确认业务正确性、兼容率和资源成本,而不是只比较实验室平均时延。 应用协议层的验收不能止于状态码或握手成功,还要把代理、应用提交、外部流水和最终业务状态串起来。修复后我会覆盖新连接与复用连接、正常响应与响应丢失、重复请求与证书切换,验证身份校验不降级、同一业务意图只产生一次副作用、未知结果能够查证,并监控分段耗时、连接年龄和状态收敛时间。
  • 进阶追问:协议恢复后为什么还要核对业务终态?
  • 进阶回答:连接和状态码恢复只证明通信可用,事故窗口内已提交、重复或未知的业务仍需查询、对账和补偿。
  • 追问 1:HTTP(超文本传输协议)3 是否没有队头阻塞?
  • 直接回答 1:单流内部仍需有序,且共享拥塞、应用线程和下游仍会排队,只是缩小了跨流传输阻塞。
  • 追问 2:单条 HTTP(超文本传输协议)2 连接一定最佳吗?
  • 直接回答 2:不一定,高丢包、代理限制或单连接拥塞时可能放大影响,需要按场景测试连接策略。
  • 追问 3:协议升级能解决服务端慢吗?
  • 直接回答 3:不能,它优化传输并发,数据库锁、线程池、业务处理和下游瓶颈仍需单独治理。
  • 详细章节:HTTP(超文本传输协议)版本对比
  1. 问题:select(选择)、poll(轮询)和 epoll(事件轮询机制)的核心差异是什么?
  • 考点:就绪通知、非阻塞读写、线程模型、事件预算和公平性。
  • 回答思路:从事件注册、就绪、实际读写到任务队列逐步说明,并用每事件循环指标验证。
  • 口述答案:三者都用于在一个线程中等待多个文件描述符的就绪状态,不会自动执行应用读写。select(选择)通常用位图传入集合,受集合大小与重复复制扫描影响;poll(轮询)用数组表达描述符,减少固定上限问题但每次仍传递并扫描关注集合;epoll(事件轮询机制)把关注关系注册到内核对象,等待时返回就绪事件,适合大量连接中少量活跃的场景。不能简单说 epoll(事件轮询机制)所有操作都是常数复杂度或永远更快,注册修改、就绪回调、锁、缓存、活跃比例和批处理都有成本。epoll_wait 返回只表示某个操作可能不阻塞,应用仍需用非阻塞 read/write 处理到合适边界,并正确面对半包、短写、关闭和错误。10 万低活跃连接时,避免每轮扫描全部描述符收益明显;若几乎所有连接持续活跃,用户态处理和数据复制可能成为主成本。线上判断事件模型问题要看系统调用频率、每轮就绪数、事件循环延迟、任务队列和业务耗时,而不是从连接数直接推断。止血事件循环空转要查兴趣集和未消费状态,不能盲目增加线程。长期按连接活跃度、单事件预算和线程归属设计。回归同时覆盖低活跃、大包、连接风暴和错误事件,确认吞吐、延迟、处理器和公平性。 事件模型的结论最终要落到每轮处理预算和公平性:记录每个循环而不是全局平均的就绪数、任务年龄、最长任务和连接分布。回归会分别注入低活跃多连接、单连接大流量、业务阻塞和重连洪峰,确认事件被完整消费、健康连接不被饥饿、任务队列有界;若增加线程只是把瓶颈转移到业务池或下游,则不把它视为修复。
  • 进阶追问:增加事件循环线程后延迟仍高说明什么?
  • 进阶回答:瓶颈可能在业务任务、单连接热点、软中断或下游;应按每循环和队列证据定位,不能继续盲目加线程。
  • 追问 1:epoll(事件轮询机制)会把数据交给业务线程吗?
  • 直接回答 1:不会,它只报告就绪;应用事件循环仍要调用非阻塞读写并决定是否卸载业务。
  • 追问 2:为什么高活跃场景优势可能缩小?
  • 直接回答 2:大多数描述符都就绪时,返回集合和实际处理本身占主导,避免全量扫描的收益变小。
  • 追问 3:连接多就必须增加线程吗?
  • 直接回答 3:不一定,连接数不等于活跃事件数;线程数由事件处理预算、活跃率和核心数决定。
  • 详细章节:epoll(事件轮询机制)基础
  1. 问题:边缘触发为什么必须非阻塞并循环读到 EAGAIN(暂不可用)?
  • 考点:就绪通知、非阻塞读写、线程模型、事件预算和公平性。
  • 回答思路:从事件注册、就绪、实际读写到任务队列逐步说明,并用每事件循环指标验证。
  • 口述答案:边缘触发关注状态从“不可读”变为“可读”的变化,如果一次通知只读取部分数据,描述符可能仍保持可读,却没有新的状态边缘,应用就可能长时间收不到下一次提醒。套接字必须设为非阻塞,事件到达后循环读取,直到返回 EAGAIN(暂不可用),表示当前缓冲已被读空;否则阻塞读可能在事件循环里等待未来数据,拖住其他连接。假设内核已有 64KiB(千字节),处理器只读 4KiB(千字节)就返回业务,剩余 60KiB(千字节)没有新边缘,解码器会像“卡住”;水平触发则只要仍可读通常会继续提醒,但错误实现会造成频繁唤醒。循环读还要有公平性预算,单连接大流量不能无限占用一轮,应读到 EAGAIN(暂不可用)或达到字节/时间上限后合理重新调度。线上证据包括接收队列有数据、应用无读取进展、事件循环线程栈和系统调用轨迹;受限 strace 只在缩小到目标线程后短时使用。止血可切回已验证的水平触发配置或重启清状态,但需防重连风暴。长期封装正确读循环、关闭和错误处理,并用半包、大包、并发连接测试。回归验证接收队列可清空、消息完整、单连接不饿死其他连接且事件循环 P99(99 分位响应时间)稳定。 事件模型的结论最终要落到每轮处理预算和公平性:记录每个循环而不是全局平均的就绪数、任务年龄、最长任务和连接分布。回归会分别注入低活跃多连接、单连接大流量、业务阻塞和重连洪峰,确认事件被完整消费、健康连接不被饥饿、任务队列有界;若增加线程只是把瓶颈转移到业务池或下游,则不把它视为修复。
  • 进阶追问:增加事件循环线程后延迟仍高说明什么?
  • 进阶回答:瓶颈可能在业务任务、单连接热点、软中断或下游;应按每循环和队列证据定位,不能继续盲目加线程。
  • 追问 1:读到 0 表示什么?
  • 直接回答 1:流式套接字通常表示对端有序关闭读方向,应进入连接关闭处理;它不是 EAGAIN(暂不可用)。
  • 追问 2:为什么循环读还要预算?
  • 直接回答 2:避免一个高流量连接占满事件循环,使其他连接和定时任务饥饿。
  • 追问 3:水平触发是否不用非阻塞?
  • 直接回答 3:事件循环仍应使用非阻塞套接字,防止状态竞争或错误判断使单次读写阻塞整个线程。
  • 详细章节:边缘触发与读循环
  1. 问题:单 Reactor(反应器模型)、多线程 Reactor(反应器模型)和主从 Reactor(反应器模型)如何选?
  • 考点:就绪通知、非阻塞读写、线程模型、事件预算和公平性。
  • 回答思路:从事件注册、就绪、实际读写到任务队列逐步说明,并用每事件循环指标验证。
  • 口述答案:单 Reactor(反应器模型)单线程把接收、读写、编解码和业务都放在一个循环,结构简单且无跨线程同步,适合连接与业务都很轻的场景,但任何阻塞会影响全部连接。单 Reactor(反应器模型)多线程通常仍由一个循环处理 I/O(输入输出),耗时业务卸载到线程池,能利用多核,却要处理结果回投、顺序、队列和线程安全。主从 Reactor(反应器模型)把监听接收与已连接通道分给不同事件循环组,适合高建连率和大量长连接,但增加线程归属、负载均衡和关闭复杂度。选型依据不是架构名,而是连接建立率、同时在线数、活跃率、每事件处理时间、业务等待和核心数。IoT(物联网)10 万连接平时低活跃但恢复时每秒数千建连,主从模型有助于隔离接收与读写;业务规则仍必须卸载,否则从循环照样阻塞。线程越多不一定越快,跨线程回投、缓存和任务队列会增加成本。线上看各循环事件数、延迟、任务队列、连接分布和建连队列,避免只看总平均。止血可降建连率、卸载阻塞任务和隔离异常连接。长期通过不同连接/消息模型压测。回归要求接收和工作循环都不过载、连接分布合理、同连接消息顺序和优雅关闭正确。 事件模型的结论最终要落到每轮处理预算和公平性:记录每个循环而不是全局平均的就绪数、任务年龄、最长任务和连接分布。回归会分别注入低活跃多连接、单连接大流量、业务阻塞和重连洪峰,确认事件被完整消费、健康连接不被饥饿、任务队列有界;若增加线程只是把瓶颈转移到业务池或下游,则不把它视为修复。
  • 进阶追问:增加事件循环线程后延迟仍高说明什么?
  • 进阶回答:瓶颈可能在业务任务、单连接热点、软中断或下游;应按每循环和队列证据定位,不能继续盲目加线程。
  • 追问 1:业务线程处理完如何回写?
  • 直接回答 1:将结果提交回该 Channel(通道)所属事件循环,保持连接状态和出站顺序由同一线程管理。
  • 追问 2:主从模型能解决慢业务吗?
  • 直接回答 2:不能,它主要分离接收与已连接 I/O(输入输出);慢业务仍需有界卸载和背压。
  • 追问 3:怎样判断连接分配不均?
  • 直接回答 3:比较每事件循环连接数、活跃事件、任务队列和延迟,不能只看连接数,因为活跃度不同。
  • 详细章节:Reactor(反应器模型)线程模型
  1. 问题:事件循环延迟突然升高,如何区分业务阻塞、任务队列堆积和写事件空转?
  • 考点:就绪通知、非阻塞读写、线程模型、事件预算和公平性。
  • 回答思路:从事件注册、就绪、实际读写到任务队列逐步说明,并用每事件循环指标验证。
  • 口述答案:我先记录每个事件循环而不是全局平均的循环延迟、每轮 I/O(输入输出)事件数、普通任务和定时任务队列、执行最长任务以及处理器时间。业务阻塞通常表现为某线程栈长期停在数据库、文件、锁或同步调用,单次任务耗时接近延迟尖峰;任务队列堆积则可能单任务短,但提交率超过消费率,队列年龄和长度持续增长;写事件空转常见于始终注册可写兴趣却没有待发送数据,系统调用和唤醒很高、实际写字节很低。再用 pidstat -t 看线程利用率和切换、ss 看套接字收发队列,必要时对目标线程短时系统调用跟踪,避免全进程长期附加。还要区分下游慢导致不可写和应用错误不断投递写任务。Netty(网络通信框架)案例中 80ms 数据库查询直接运行在 EventLoop(事件循环)上,1.6 万连接同窗变慢,随后写缓冲增长;时间先后支持业务阻塞为触发。止血摘除异常版本、关闭非关键推送、暂停不可写连接生产;若任务堆积则限制提交和按优先级丢弃可降级任务。长期建立单任务预算、有界队列、写兴趣按需注册和慢任务监控。回归分别注入阻塞、任务洪峰和慢客户端,确认三类证据走向不同告警与处置。 事件模型的结论最终要落到每轮处理预算和公平性:记录每个循环而不是全局平均的就绪数、任务年龄、最长任务和连接分布。回归会分别注入低活跃多连接、单连接大流量、业务阻塞和重连洪峰,确认事件被完整消费、健康连接不被饥饿、任务队列有界;若增加线程只是把瓶颈转移到业务池或下游,则不把它视为修复。
  • 进阶追问:增加事件循环线程后延迟仍高说明什么?
  • 进阶回答:瓶颈可能在业务任务、单连接热点、软中断或下游;应按每循环和队列证据定位,不能继续盲目加线程。
  • 追问 1:事件循环处理器高就等于框架问题吗?
  • 直接回答 1:不等于,业务处理器、解码、任务投递和空转都运行在其上,需要线程栈和每轮指标定位。
  • 追问 2:任务队列设为无界有什么风险?
  • 直接回答 2:把过载转成延迟和内存增长,故障解除后还会因积压回放形成第二波压力。
  • 追问 3:写事件为何可能空转?
  • 直接回答 3:描述符通常可写,若无待发送数据仍持续关注,就会不断收到无意义就绪通知。
  • 详细章节:事件循环故障证据
  1. 问题:10 万长连接低活跃场景如何估算事件循环容量?
  • 考点:就绪通知、非阻塞读写、线程模型、事件预算和公平性。
  • 回答思路:从事件注册、就绪、实际读写到任务队列逐步说明,并用每事件循环指标验证。
  • 口述答案:连接数本身不是事件循环负载,容量由活跃率、每连接事件率、单事件处理预算、突发建连、定时任务和内存共同决定。假设 10 万连接平时每 30 秒一个心跳,平均约 3,333 个事件/秒;若轻量解析和状态更新每次 50 微秒,纯处理约占单核 0.167 秒/秒,但还要加系统调用、批处理、写回和抖动。真正风险是区域恢复时 6 万连接在 30 秒重连,建连、认证和会话恢复完全不同于平时心跳,因此要分别建模稳态与突发。每个 EventLoop(事件循环)还承担所属 Channel(通道)的任务和定时器,不能把 100% 处理器作为目标,需给垃圾回收、内核软中断和尾延迟留余量。我会压测不同线程数,观察每循环事件率、P99(99 分位响应时间)、任务队列、每核利用率、连接分布和跨线程回投成本,在吞吐趋平前取保守值。设备端用指数退避和随机抖动把重连摊到 10 分钟,服务端按租户与设备组限建连,业务规则卸载到有界队列。内存还要按每连接 Channel(通道)状态、缓冲和安全会话计算。回归覆盖平时心跳、消息峰值、慢客户端和滚动重启,要求在线率、循环延迟、包率和内存低水位稳定。 事件模型的结论最终要落到每轮处理预算和公平性:记录每个循环而不是全局平均的就绪数、任务年龄、最长任务和连接分布。回归会分别注入低活跃多连接、单连接大流量、业务阻塞和重连洪峰,确认事件被完整消费、健康连接不被饥饿、任务队列有界;若增加线程只是把瓶颈转移到业务池或下游,则不把它视为修复。
  • 进阶追问:增加事件循环线程后延迟仍高说明什么?
  • 进阶回答:瓶颈可能在业务任务、单连接热点、软中断或下游;应按每循环和队列证据定位,不能继续盲目加线程。
  • 追问 1:线程数是否等于处理器核数?
  • 直接回答 1:只是起点,还要考虑事件成本、软中断、容器配额和跨线程开销,通过压测确定。
  • 追问 2:为什么要分别测重连?
  • 直接回答 2:重连包含握手、认证和状态恢复,单次成本远高于心跳,平均活跃率会掩盖突发。
  • 追问 3:如何保护单个事件循环?
  • 直接回答 3:限制每事件工作、卸载业务、有界任务、慢连接背压,并监控每循环而不是只看全局平均。
  • 详细章节:事件循环容量
  1. 问题:请讲清 Netty(网络通信框架)从连接建立到业务响应的线程与对象生命周期。
  • 考点:线程归属、处理链传播、缓冲所有权、背压和连接生命周期。
  • 回答思路:沿连接建立、入站、业务卸载、出站与关闭时序回答,再检查资源上界和异常分支。
  • 口述答案:服务端由 ServerBootstrap(服务端启动引导器)配置接收组、工作组、Channel(通道)类型、选项和初始化器。接收线程接受新连接后创建子 Channel(通道),把它注册到某个 EventLoop(事件循环);正常生命周期内这个 Channel(通道)固定由该事件循环处理 I/O(输入输出)和任务,从而避免连接状态被多个线程并发修改。入站字节到达后沿 Pipeline(处理流水线)从前向后经过解码、校验和业务处理,耗时数据库或第三方调用应提交到有界业务线程池;完成后通过 Channel(通道)写回,框架把任务回投到其 EventLoop(事件循环),出站事件从当前上下文向前经过编码、写缓冲和套接字。ChannelFuture(通道异步结果)表示操作最终结果,不能把发起成功当写出成功;监听器中处理失败和资源释放。关闭时先停止接收新连接,标记实例摘流,等待在途业务与写缓冲到期限,再关闭子 Channel(通道)和事件循环;强制期限避免无限等待。线上我观察每事件循环连接数、任务队列、Pipeline(处理流水线)处理器耗时、写缓冲和关闭阶段,而不是只看线程总数。IoT(物联网)场景还要控制滚动重启的重连速率。回归覆盖连接、半包、业务异步、写失败、对端关闭和优雅停机,确认同连接顺序、资源释放与状态一致。 框架层我还会核对 Channel(通道)线程归属、Pipeline(处理流水线)实际顺序、缓冲所有权和关闭状态,把连接级指标关联到具体事件循环。修复验收覆盖成功、异常、取消、慢客户端和滚动停机,要求写缓冲、直接内存、文件描述符与任务队列都有上界,同连接顺序和关键消息语义不被破坏;任何仅靠重启清空状态的方案都只能登记为止血。
  • 进阶追问:重启实例后指标恢复,能否证明框架缺陷?
  • 进阶回答:不能,重启同时清空连接、写队列和内存;需要复现线程阻塞、所有权或背压路径才能确认机制。
  • 追问 1:为什么 Channel(通道)固定一个 EventLoop(事件循环)?
  • 直接回答 1:通过线程封闭简化连接状态和 Pipeline(处理流水线)处理器并发,仍允许业务卸载后回投。
  • 追问 2:调用 writeAndFlush 就代表对端收到吗?
  • 直接回答 2:不代表,它只发起本地异步写;完成通常表示交给传输层,业务确认还需应用协议或对端响应。
  • 追问 3:优雅关闭为何要有强制期限?
  • 直接回答 3:防止慢连接或失控任务让实例永远无法退出,同时在期限前尽量排空并持久化状态。
  • 详细章节:Netty(网络通信框架)运行时
  1. 问题:Pipeline(处理流水线)入站、出站和异常传播方向是什么,顺序错误会造成什么问题?
  • 考点:线程归属、处理链传播、缓冲所有权、背压和连接生命周期。
  • 回答思路:沿连接建立、入站、业务卸载、出站与关闭时序回答,再检查资源上界和异常分支。
  • 口述答案:Pipeline(处理流水线)是按顺序连接的 ChannelHandler(通道处理器)链。入站事件通常从头向尾传播,例如读取、激活和用户事件;出站操作通常从当前 ChannelHandlerContext(处理器上下文)向头方向传播,例如写、刷新和关闭。处理器调用上下文继续传播时,会从当前位置寻找下一类匹配处理器;直接从 Channel(通道)发起通常经过完整出站链。顺序决定字节和消息看到的形态:长度帧解码器应在业务消息处理前,压缩和加密的出站/入站顺序必须镜像,鉴权应在危险业务前。异常若被某处理器吞掉且既不关闭也不继续传播,连接可能保持半坏状态;重复传播又可能多次释放 ByteBuf(字节缓冲区)。线上问题表现为部分消息无法解码、签名对象不一致、写出未加密或异常连接泄漏。我会输出实际 Pipeline(处理流水线)顺序,结合处理器入出站类型、日志中的消息形态和受限报文样本定位,不凭类名猜测。处理器若标记共享,还必须无连接可变状态或自行保证线程安全。止血可回滚顺序变更、关闭异常协议流量并摘除版本。长期用嵌入式通道做正常、半包、恶意长度、异常和出站顺序测试。回归验证每一步输入输出类型、异常只处理一次、资源释放和协议互通。 框架层我还会核对 Channel(通道)线程归属、Pipeline(处理流水线)实际顺序、缓冲所有权和关闭状态,把连接级指标关联到具体事件循环。修复验收覆盖成功、异常、取消、慢客户端和滚动停机,要求写缓冲、直接内存、文件描述符与任务队列都有上界,同连接顺序和关键消息语义不被破坏;任何仅靠重启清空状态的方案都只能登记为止血。
  • 进阶追问:重启实例后指标恢复,能否证明框架缺陷?
  • 进阶回答:不能,重启同时清空连接、写队列和内存;需要复现线程阻塞、所有权或背压路径才能确认机制。
  • 追问 1:为什么出站方向看起来是反的?
  • 直接回答 1:它从业务消息向底层字节和套接字转换,沿链向头部寻找出站处理器,与入站数据进入方向相反。
  • 追问 2:处理器能同时处理入站和出站吗?
  • 直接回答 2:可以实现两类接口,但要清楚状态和传播位置;职责过多会增加顺序与资源所有权复杂度。
  • 追问 3:异常后一定关闭连接吗?
  • 直接回答 3:取决于错误是否可恢复;协议越界、解码状态损坏通常关闭,业务校验失败可返回错误后保持连接。
  • 详细章节:Pipeline(处理流水线)传播
  1. 问题:ByteBuf(字节缓冲区)引用计数泄漏和过早释放分别如何发生、如何证明?
  • 考点:线程归属、处理链传播、缓冲所有权、背压和连接生命周期。
  • 回答思路:沿连接建立、入站、业务卸载、出站与关闭时序回答,再检查资源上界和异常分支。
  • 口述答案:引用计数用于管理池化或直接内存的所有权。处理器接收 ByteBuf(字节缓冲区)后,如果框架约定该处理器拥有释放责任,就必须在所有成功、异常和异步分支最终 release;若把缓冲交给异步线程或保存切片,需要先明确所有权并在必要时 retain,完成后对应释放。泄漏是少释放:流量结束、连接关闭后直接内存低水位仍抬升,泄漏检测给出分配/访问线索;过早释放是多释放或异步前未保留,后续访问会报非法引用计数或出现数据损坏。slice(切片)和 duplicate(重复视图)通常共享底层存储及引用计数,copy(复制)才有独立数据,不能把视图当新所有者。证明时我关联分配量、活动缓冲、写队列、连接数和流量,先排除慢客户端导致的合法在途缓冲;开启适当等级泄漏检测或在测试环境提高采样,结合异常栈和代码所有权审查。止血可关闭高风险功能、限制消息大小和慢连接,必要时分批重启但先保存低水位与连接证据。长期规定“谁创建、谁转交、谁释放”的接口契约,使用框架自动释放基类时避免再次释放。回归覆盖异步成功、异常、取消、写失败和连接关闭,要求引用计数闭合、直接内存有稳定上界且无误释放。 框架层我还会核对 Channel(通道)线程归属、Pipeline(处理流水线)实际顺序、缓冲所有权和关闭状态,把连接级指标关联到具体事件循环。修复验收覆盖成功、异常、取消、慢客户端和滚动停机,要求写缓冲、直接内存、文件描述符与任务队列都有上界,同连接顺序和关键消息语义不被破坏;任何仅靠重启清空状态的方案都只能登记为止血。
  • 进阶追问:重启实例后指标恢复,能否证明框架缺陷?
  • 进阶回答:不能,重启同时清空连接、写队列和内存;需要复现线程阻塞、所有权或背压路径才能确认机制。
  • 追问 1:slice(切片)为何危险?
  • 直接回答 1:它与原缓冲共享底层内存,原缓冲释放后视图也可能失效;跨生命周期使用必须明确保留关系。
  • 追问 2:直接内存高就一定泄漏吗?
  • 直接回答 2:不一定,池化保留和慢连接写缓冲也会高;关键看负载回落后的低水位、所有权和泄漏证据。
  • 追问 3:生产可一直开最高泄漏检测吗?
  • 直接回答 3:通常开销较高,应按版本和风险选择等级,异常时受控提升,并在测试环境做更全面检测。
  • 详细章节:ByteBuf(字节缓冲区)内存所有权
  1. 问题:TCP(传输控制协议)粘包拆包如何处理,恶意长度字段有什么风险?
  • 考点:线程归属、处理链传播、缓冲所有权、背压和连接生命周期。
  • 回答思路:沿连接建立、入站、业务卸载、出站与关闭时序回答,再检查资源上界和异常分支。
  • 口述答案:TCP(传输控制协议)提供有序字节流,不保留应用写入边界;一次读可能得到半条、正好一条或多条消息,因此所谓粘包拆包不是传输错误,而是应用协议必须定义帧边界。常见方案是固定长度、分隔符、长度字段或自描述协议。长度字段解码要明确字段位置、字节序、长度是否包含头、最大帧长和丢弃策略;解码器在累积区等待完整帧,不能收到半包就当失败。恶意客户端若声明 2GiB(吉字节)长度但持续慢发,可能让每连接累计缓冲增长并耗尽直接内存;如果长度计算溢出或偏移错误,还可能绕过限制。设计上在读到头部后立即校验协议版本、最小/最大长度和租户权限,对超过上限的帧记录受限信息并关闭连接;限制单连接未完成帧字节、读取超时和全局在途内存。线上证据包括累计缓冲、帧长分布、解码失败、慢连接、直接内存和套接字接收队列,不能只看异常栈。止血可在网关封禁异常来源、降低最大帧长并停止自动读取,但变更协议上限要评估兼容。长期做随机分片、合并、边界值和慢速发送测试。回归确认正常大包可解析、半包不丢、多个帧不串、恶意长度在小内存上界内被拒绝。 框架层我还会核对 Channel(通道)线程归属、Pipeline(处理流水线)实际顺序、缓冲所有权和关闭状态,把连接级指标关联到具体事件循环。修复验收覆盖成功、异常、取消、慢客户端和滚动停机,要求写缓冲、直接内存、文件描述符与任务队列都有上界,同连接顺序和关键消息语义不被破坏;任何仅靠重启清空状态的方案都只能登记为止血。
  • 进阶追问:重启实例后指标恢复,能否证明框架缺陷?
  • 进阶回答:不能,重启同时清空连接、写队列和内存;需要复现线程阻塞、所有权或背压路径才能确认机制。
  • 追问 1:一次 read 对应一次 write 吗?
  • 直接回答 1:不对应,字节可能被协议栈、缓冲和网络任意分段或合并,应用必须自己恢复消息边界。
  • 追问 2:分隔符方案有什么风险?
  • 直接回答 2:载荷转义、超长无分隔符和扫描成本,需要最大帧长与转义规则,二进制协议常更适合长度字段。
  • 追问 3:为什么要限制未完成帧时间?
  • 直接回答 3:防止慢速客户端长期占用连接和累计缓冲,形成资源耗尽攻击。
  • 详细章节:粘包拆包与解码
  1. 问题:Netty(网络通信框架)写缓冲超过高水位后,业务应该如何背压?
  • 考点:线程归属、处理链传播、缓冲所有权、背压和连接生命周期。
  • 回答思路:沿连接建立、入站、业务卸载、出站与关闭时序回答,再检查资源上界和异常分支。
  • 口述答案:当 Channel(通道)待写字节超过高水位时,isWritable 变为 false(假值),表示本地生产速度超过套接字和对端消费能力。框架只暴露状态,不会自动替业务决定丢弃、暂停还是持久化。业务应停止为该连接继续生成非必要推送,或把少量必须消息放入有界、可度量队列;对请求响应可暂停读取或降低上游消费,但必须防止所有连接共享队列被单个慢客户端占满。待写字节降到低水位后再恢复,两个阈值形成迟滞避免频繁开关。IoT(物联网)网关可合并遥测状态,只保留最新值;支付和控制指令不能随意丢,应可靠落队列或断开后由业务状态重查。线上我看不可写连接比例、持续时间、每连接待写字节、套接字发送队列、直接内存、事件循环延迟和远端确认,区分路径慢、客户端不读和应用批量推送。止血关闭非关键推送、按租户限速并断开超过期限的慢连接,避免继续堆内存。长期把背压传播到消息消费和任务生产,设置每连接/租户/实例上限。回归用 20% 慢客户端验证健康连接延迟不受影响、内存有上界、关键消息语义正确,恢复后不会一次性回放形成第二波洪峰。 框架层我还会核对 Channel(通道)线程归属、Pipeline(处理流水线)实际顺序、缓冲所有权和关闭状态,把连接级指标关联到具体事件循环。修复验收覆盖成功、异常、取消、慢客户端和滚动停机,要求写缓冲、直接内存、文件描述符与任务队列都有上界,同连接顺序和关键消息语义不被破坏;任何仅靠重启清空状态的方案都只能登记为止血。
  • 进阶追问:重启实例后指标恢复,能否证明框架缺陷?
  • 进阶回答:不能,重启同时清空连接、写队列和内存;需要复现线程阻塞、所有权或背压路径才能确认机制。
  • 追问 1:为什么不能只调高水位?
  • 直接回答 1:它只允许积累更多内存,不提高对端和网络服务率,会放大故障影响与恢复回放。
  • 追问 2:关闭 autoRead 有什么副作用?
  • 直接回答 2:会停止继续从套接字读,远端窗口可能收缩;必须按连接状态恢复并避免协议心跳超时。
  • 追问 3:慢客户端是否一律断开?
  • 直接回答 3:按业务等级、不可写时长和数据可恢复性决定;关键控制连接可降频并保留状态查询能力。
  • 详细章节:Netty(网络通信框架)背压
  1. 问题:Netty(网络通信框架)服务如何优雅停机并避免 IoT(物联网)重连风暴?
  • 考点:线程归属、处理链传播、缓冲所有权、背压和连接生命周期。
  • 回答思路:沿连接建立、入站、业务卸载、出站与关闭时序回答,再检查资源上界和异常分支。
  • 口述答案:优雅停机不是先杀进程,而是分阶段改变流量与连接状态。首先从注册和负载均衡摘除实例,停止接收新连接,保留现有 Channel(通道);随后拒绝新长任务,等待短请求、业务线程池和写缓冲在明确期限内排空,持久化会话、消费位点和未确认关键消息。对 IoT(物联网)连接可通过协议通知或服务端分批关闭,让客户端按指数退避和随机抖动重连,而不是同一秒切断 2 万连接。到期限仍未完成的请求按业务语义处理:幂等任务记录可重试状态,支付未知结果进入查单,普通推送可丢弃并由状态同步恢复。然后关闭子 Channel(通道)、工作 EventLoopGroup(事件循环组)、接收组和外部线程池,检查 ByteBuf(字节缓冲区)、文件描述符和直接内存低水位。观测包括新建连接率、在线率、在途请求、不可写连接、任务队列、重连失败和状态恢复。止血式重启也要分批,并限制单批实例和设备重连配额。长期在发布平台配置摘流等待、最大排空时间和回滚触发。回归做滚动升级、进程强杀对照和网络抖动,要求服务容量始终有余量、关键状态可恢复、无连接惊群和重复副作用。 框架层我还会核对 Channel(通道)线程归属、Pipeline(处理流水线)实际顺序、缓冲所有权和关闭状态,把连接级指标关联到具体事件循环。修复验收覆盖成功、异常、取消、慢客户端和滚动停机,要求写缓冲、直接内存、文件描述符与任务队列都有上界,同连接顺序和关键消息语义不被破坏;任何仅靠重启清空状态的方案都只能登记为止血。
  • 进阶追问:重启实例后指标恢复,能否证明框架缺陷?
  • 进阶回答:不能,重启同时清空连接、写队列和内存;需要复现线程阻塞、所有权或背压路径才能确认机制。
  • 追问 1:为什么先摘流再停止监听?
  • 直接回答 1:给负载均衡传播时间,减少新请求继续进入即将关闭实例,并保留在途请求完成窗口。
  • 追问 2:所有连接都等到自然关闭可行吗?
  • 直接回答 2:长连接可能永不自然结束,因此必须有分批通知和强制期限,同时保证客户端可平滑重连。
  • 追问 3:如何判断停机完成?
  • 直接回答 3:新流量为零、在途与写缓冲达到可接受值、关键状态持久化、线程池和事件循环正常终止且资源释放。
  • 详细章节:Channel(通道)生命周期与关闭
  1. 问题:请给出一次“命令证据链”的完整结构,为什么禁止命令堆砌?
  • 考点:可证伪假设、命令安全、时间先后、双证据和因果验证。
  • 回答思路:先区分事实与推断,让每条命令回答一个问题,再用单变量动作和原指标回归。
  • 口述答案:完整证据链固定从现象与影响开始:哪类用户、什么接口、何时、错误率和 P99(99 分位响应时间)如何变化。第二步保存现场并限定对象,明确主机、容器、PID(进程标识)、TID(线程标识)、文件、套接字四元组、网卡和远端请求号。第三步提出一个可证伪主假设,例如“容器节流导致任务消费下降”,并写出若它成立应看到什么、什么能推翻。第四步选择第一条低开销命令,解释每个关键字段、正常参照和采样窗口;第五步用来源不同的第二信号交叉验证,例如控制组节流配合每线程运行队列和队列消费率。随后列出排除项、根因、触发原因与放大器。止血动作要写预期、风险、观察窗和回滚条件,长期修复落到代码、容量或拓扑,最后复跑原命令和业务回归。命令堆砌的问题是没有假设,容易把累计值、别的实例或事故后放大指标当根因,也让高开销工具增加风险。比如先执行无过滤抓包、长时间系统调用跟踪和全机热点采样,不仅噪声大,还可能泄露敏感数据或加重故障。合格记录保留命令原文、执行人、时区、版本、关键输出和不确定项,使其他人可复核。结论若不能被某个条件推翻,就不是工程证据而是故事。 为了让证据可复核,我会保留原始命令、关键输出、采样时区、环境版本、执行人和能够推翻结论的条件,并把事实、推断、未验证项分栏。事故结束后通过单变量故障注入复现时间顺序,确认告警能指向正确层级、止血有回滚且修复改变了触发机制;如果无法复现,就明确残余不确定性,不把相关性包装成确定因果。
  • 进阶追问:若无法复现事故,应怎样给出结论?
  • 进阶回答:把已证事实、最可能推断和待验证项分开,注明可推翻条件与残余风险,不把相关性写成确定根因。
  • 追问 1:第二证据必须是另一条命令吗?
  • 直接回答 1:不必,可以是应用指标、线程栈、远端流水或可控实验,关键是来源和机制相对独立。
  • 追问 2:止血动作能作为因果实验吗?
  • 直接回答 2:若只改变一个关键变量并预先声明预期与回滚,可增强证据;多变量动作只能证明组合有效。
  • 追问 3:为什么记录排除项?
  • 直接回答 3:防止后续重复调查,也说明结论覆盖了哪些相似现象和仍有哪些不确定边界。
  • 详细章节:证据模型
  1. 问题:生产环境如何安全使用 tcpdump(抓包工具)、strace(系统调用跟踪工具)和 perf(性能采样工具)?
  • 考点:可证伪假设、命令安全、时间先后、双证据和因果验证。
  • 回答思路:先区分事实与推断,让每条命令回答一个问题,再用单变量动作和原指标回归。
  • 口述答案:三类工具都不是第一步。tcpdump(抓包工具)可能消耗处理器和磁盘并采集凭证或业务数据;strace(系统调用跟踪工具)附加关键进程可能放大系统调用延迟;perf(性能采样工具)高频全机采样会带来开销、噪声和符号数据风险。我的原则是先用业务指标、mpstatpidstatss 和线程栈缩小到具体时间、主机、进程、线程或连接,再获得值班授权,写明目的、权限、持续时间、采样频率、输出位置、敏感数据处理和停止阈值。抓包限定接口、主机、端口、方向、包长和几十秒窗口,使用环形缓冲防磁盘打满;系统调用跟踪限定 PID(进程标识)、调用类别和短时间,优先统计模式;热点采样限定目标进程或线程、较低频率和十秒左右,并同步观察被测服务延迟。若业务进一步恶化、采样工具资源异常或超时,立即停止。替代方案包括应用分段指标、Java(编程语言)飞行记录、代理日志和在同版本副本复现。采样产物按生产数据权限加密、脱敏和到期删除。解释结果还要考虑网卡卸载、符号缺失、即时编译和采样偏差,用第二证据复核。工具结束后以业务和原始指标回归,不能把一张图或一个报文当完整因果。 为了让证据可复核,我会保留原始命令、关键输出、采样时区、环境版本、执行人和能够推翻结论的条件,并把事实、推断、未验证项分栏。事故结束后通过单变量故障注入复现时间顺序,确认告警能指向正确层级、止血有回滚且修复改变了触发机制;如果无法复现,就明确残余不确定性,不把相关性包装成确定因果。
  • 进阶追问:若无法复现事故,应怎样给出结论?
  • 进阶回答:把已证事实、最可能推断和待验证项分开,注明可推翻条件与残余风险,不把相关性写成确定根因。
  • 追问 1:为什么抓包要统一时钟?
  • 直接回答 1:需要和代理、应用、远端日志对齐请求时序,否则无法判断报文在哪一段延迟或丢失。
  • 追问 2:没有权限怎么办?
  • 直接回答 2:使用低权限指标和日志,或由授权值班人员执行最小命令;不能绕过安全边界。
  • 追问 3:如何避免采样文件打满磁盘?
  • 直接回答 3:限制时长和包长、使用文件大小/数量轮转,选择独立空间并实时监控产物增长。
  • 详细章节:证据采样安全
  1. 问题:接口 P99(99 分位响应时间)升高但平均值稳定,怎样排查?
  • 考点:可证伪假设、命令安全、时间先后、双证据和因果验证。
  • 回答思路:先区分事实与推断,让每条命令回答一个问题,再用单变量动作和原指标回归。
  • 口述答案:平均值稳定说明多数请求仍正常,尾部少量请求出现等待或重试,不能用整体资源平均掩盖。先按租户、地区、实例、渠道、接口参数、连接新旧和响应码切分分布,确认是固定群体还是随机尾部;记录 P50(50 分位响应时间)、P95(95 分位响应时间)、P99(99 分位响应时间)、最大值、错误率和样本数。再把请求总耗时拆成池等待、建连、安全握手、应用排队、数据库锁、文件同步、下游首字节和读取。支付案例若失败集中在空闲 70 至 110 秒旧连接,而新连接正常,平均值可能几乎不变但 P99(99 分位响应时间)被复位重试拉高;库存案例则可能只有热点 SKU(库存单位)等待锁。系统层看每事件循环最大延迟、设备 await 分位、套接字重传和队列,不只看主机平均处理器。用请求标识抽取慢样本与快样本做差异对照,找到慢样本共有条件。止血可隔离异常渠道、淘汰旧连接、热点限流或暂停导出,并预设回滚。长期建立分桶指标和慢样本追踪,修复连接寿命、锁或资源隔离。回归要求同样样本分布下尾部下降、平均和吞吐不恶化,并确认没有通过超时截断把慢请求变成错误率。 为了让证据可复核,我会保留原始命令、关键输出、采样时区、环境版本、执行人和能够推翻结论的条件,并把事实、推断、未验证项分栏。事故结束后通过单变量故障注入复现时间顺序,确认告警能指向正确层级、止血有回滚且修复改变了触发机制;如果无法复现,就明确残余不确定性,不把相关性包装成确定因果。
  • 进阶追问:若无法复现事故,应怎样给出结论?
  • 进阶回答:把已证事实、最可能推断和待验证项分开,注明可推翻条件与残余风险,不把相关性写成确定根因。
  • 追问 1:为什么只看最大值也不行?
  • 直接回答 1:单个极端样本可能噪声,分位和分桶能表达影响比例;仍需保留最大值用于发现罕见严重事件。
  • 追问 2:P99(99 分位响应时间)下降但错误率上升算修复吗?
  • 直接回答 2:不算,可能只是更早超时或拒绝,必须同时看成功率、业务结果和吞吐。
  • 追问 3:如何选择慢样本?
  • 直接回答 3:在同一窗口按分位阈值采样,并保留租户、实例、连接年龄、下游和请求特征用于对照。
  • 详细章节:跨层项目证据闭环
  1. 问题:一次故障中 CPU(中央处理器)、重传和重试都升高,如何区分触发原因与放大器?
  • 考点:可证伪假设、命令安全、时间先后、双证据和因果验证。
  • 回答思路:先区分事实与推断,让每条命令回答一个问题,再用单变量动作和原指标回归。
  • 口述答案:我会构建分钟甚至秒级时间线,而不是把同时异常的指标并列成三个根因。先找最早偏离基线的信号,并验证它能否解释后续链条:例如 10:00 远端首字节升高,10:01 客户端固定重试增加,10:02 新建连接和重传上升,10:03 本机软中断与处理器升高,说明远端慢是触发,重试策略是放大器,本机资源不足是结果或暴露缺陷。反过来若发布后事件循环先阻塞,随后写缓冲、重连和软中断升高,则应用阻塞更早。时间先后还不够,要做可控动作:限制重试后若本机资源和错误率恢复但远端延迟仍高,证明重试确实放大;切远端或回滚发布后最早信号消失,进一步增强根因。证据来自应用分段耗时、线程栈、连接创建、nstat 增量、网卡包率和远端日志,并统一时钟。止血优先切断反馈回路,如限重试、熔断和背压,再处理触发源。长期修复既消除触发机制,也要让相同外部故障不再演化成本机雪崩。回归分别注入远端慢、丢包和事件循环阻塞,验证告警顺序、限流和隔离符合设计。复盘中把确定事实、推断和待验证项分栏,不把所有伴随指标都称为根因。 为了让证据可复核,我会保留原始命令、关键输出、采样时区、环境版本、执行人和能够推翻结论的条件,并把事实、推断、未验证项分栏。事故结束后通过单变量故障注入复现时间顺序,确认告警能指向正确层级、止血有回滚且修复改变了触发机制;如果无法复现,就明确残余不确定性,不把相关性包装成确定因果。
  • 进阶追问:若无法复现事故,应怎样给出结论?
  • 进阶回答:把已证事实、最可能推断和待验证项分开,注明可推翻条件与残余风险,不把相关性写成确定根因。
  • 追问 1:最早变化一定是根因吗?
  • 直接回答 1:不一定,它可能是更上游问题的第一可见信号,还需机制解释、第二证据和可控实验。
  • 追问 2:根因可以有多个吗?
  • 直接回答 2:可以区分触发原因、放大器和暴露缺陷,但不要把所有异常平铺成无法行动的“多根因”。
  • 追问 3:为什么先切断反馈回路?
  • 直接回答 3:即使触发源暂时无法修复,限制重试和在途量也能防止局部故障扩大为全站资源雪崩。
  • 详细章节:统一事故模板
  1. 问题:请完整复述一次 WMS(仓储管理系统)库存接口抖动事故。
  • 考点:项目量级、故障时序、技术机制、业务正确性、回滚和复盘表达。
  • 回答思路:按背景、挑战、证据、止血、长期修复、量化结果与设计反思形成可直接复述的闭环。
  • 口述答案:大促峰值约 2,000 次/秒,正常库存预占 P99(99 分位响应时间)170ms,依靠订单行唯一流水、库存条件更新和状态机防超卖。事故中 P99(99 分位响应时间)升到 2.6s,最初有人判断网络抖动。我先固定热点 SKU(库存单位)、实例和五分钟窗口:宿主机空闲 38%、容器无节流,事件循环 P99(99 分位响应时间)2ms,套接字重传率 0.03%,都不支持算力或网络主因;应用有 120 个线程等待数据库,数据库锁链显示一个批量校准事务持热点行 1.4s,且活动让 72% 请求集中在同一 SKU(库存单位)。客户端每 200ms 固定重试把入口放大到 4,800 次/秒,线程池与连接池随后被占满,其他商品也变慢。止血先暂停校准事务,对热点键限流并拒绝已超过剩余预算的请求,保留原预占号查询结果;若预占成功率下降超过 2% 就回退限流档位。长期把校准拆成短事务,入口使用退避和随机抖动,热点与普通流量隔离,数据库约束继续做最终正确性。回归按相同 72% 热点比例压到 2,100 次/秒,P99(99 分位响应时间)165ms、锁等待低于 20ms,库存数量、预占流水和事件三方差异为 0。反思是分布式锁或扩线程都不能替代权威约束和背压。 项目复盘还会把技术指标翻译成业务结果:库存看数量与流水差异,支付看渠道账单和账户分录,物流看游标连续与事件缺口,设备看在线率和状态变化报警。修复后以峰值一点三倍持续压测并叠加单一故障,验证限流、幂等、背压、查证和渐进恢复按设计工作;同时记录当时的错误判断、替代方案与成本取舍,形成可直接复述的闭环。
  • 进阶追问:项目方案取得结果后还要讲什么?
  • 进阶回答:补充替代方案、成本、失败边界和当时的错误判断,说明如何把经验固化为容量、告警、演练和运行手册。
  • 追问 1:为什么不先扩容?
  • 直接回答 1:热点行串行服务率不因应用实例增加而提高,扩容还会增加数据库并发和等待。
  • 追问 2:限流会不会造成少卖?
  • 直接回答 2:短时可能降低受理率,因此按热点和剩余预算精细限流,并让用户查询原结果;它避免全站雪崩和重复扣减。
  • 追问 3:如何证明没有超卖?
  • 直接回答 3:用库存条件更新保证不为负,唯一流水保证一单一次,并核对库存、流水和履约事件差异为零。
  • 详细章节:WMS(仓储管理系统)库存案例
  1. 问题:请完整复述一次支付回调和渠道超时事故。
  • 考点:项目量级、故障时序、技术机制、业务正确性、回滚和复盘表达。
  • 回答思路:按背景、挑战、证据、止血、长期修复、量化结果与设计反思形成可直接复述的闭环。
  • 口述答案:支付服务约 800 次/秒回调,正常 P99(99 分位响应时间)220ms。事故表现为少量连接复位、回调重复和部分支付长时间处理中。第一条线是连接:应用池空闲寿命 5 分钟,边缘代理 60 秒回收;失败集中在空闲 70 至 110 秒后第一次复用,新连接成功,受限抓包显示首次写入收到复位。第二条线是业务:某笔扣款在客户端 700ms 超时,但渠道 820ms 已成功,因此超时不能记失败。止血把客户端空闲寿命降至 45 秒、借出前做适度校验,对网络错误仅在原支付单号和剩余预算内限次重试;未知支付提高主动查单频率,异常渠道限并发,若新建连接率超过容量或成功率下降则回滚。资金边界没有放在网络上:回调先验签,以渠道流水唯一记录,在事务中条件迁移支付状态并写账户分录;重复回调返回第一次结果,日终按渠道账单、支付流水和账户分录对账。长期统一代理与客户端连接生命周期、传播截止时间并建设未知年龄告警。回归跨过 120 秒空闲、注入响应丢失和重复回调十次,只有一条入账,连接复位消失,未知状态按查单清零,三方资金差异为 0。反思是网络恢复和资金正确性必须分别设计。 项目复盘还会把技术指标翻译成业务结果:库存看数量与流水差异,支付看渠道账单和账户分录,物流看游标连续与事件缺口,设备看在线率和状态变化报警。修复后以峰值一点三倍持续压测并叠加单一故障,验证限流、幂等、背压、查证和渐进恢复按设计工作;同时记录当时的错误判断、替代方案与成本取舍,形成可直接复述的闭环。
  • 进阶追问:项目方案取得结果后还要讲什么?
  • 进阶回答:补充替代方案、成本、失败边界和当时的错误判断,说明如何把经验固化为容量、告警、演练和运行手册。
  • 追问 1:为什么不关闭证书校验切流?
  • 直接回答 1:那会破坏渠道身份认证并引入中间人风险,支付止血也不能跨越安全和资金边界。
  • 追问 2:回调事务后响应丢失怎么办?
  • 直接回答 2:渠道原流水重试会命中唯一记录并返回既有结果,主动查单与对账仍能确认终态。
  • 追问 3:未知状态多久告警?
  • 直接回答 3:按渠道正常终态分位和业务风险分层,超过短查单窗口进入高频补查,超过结算窗口进入差错与人工流程。
  • 详细章节:支付回调案例
  1. 问题:请完整复述一次 IoT(物联网)MQTT(消息队列遥测传输协议)报警风暴事故。
  • 考点:项目量级、故障时序、技术机制、业务正确性、回滚和复盘表达。
  • 回答思路:按背景、挑战、证据、止血、长期修复、量化结果与设计反思形成可直接复述的闭环。
  • 口述答案:平台稳定承载 10 万长连接和 5,000 条消息/秒。区域网络恢复后,6 万设备因没有随机抖动在 30 秒集中重连,峰值 4,000 次建连/秒、2 万条消息/秒,QoS(服务质量)1 重复达到 35%。带宽未满,但小包率升至 65 万/秒,软中断集中两核 78%,Netty(网络通信框架)事件循环队列 18 万;业务又在 EventLoop(事件循环)里同步执行报警规则,确认延迟使设备继续重发,最终生成 120 万重复报警。证据时间线是重连率先升、随后包率和软中断、再到循环延迟与重复消息,说明重连是触发,同步规则和确认重发是放大。止血按设备组限制建连,对非关键遥测降采样,把重连窗口扩到 10 分钟;报警只保留状态升级与恢复,若在线恢复过慢就每分钟增加 10% 配额。长期让客户端指数退避加随机抖动,接入层可靠接管后再确认,以设备事件序号幂等;规则计算卸载到有界队列,按设备和窗口聚合通知,并对不可写连接背压。回归 6 万设备恢复时峰值建连低于 500 次/秒、事件循环 P99(99 分位响应时间)低于 10ms、重复报警低于 0.1%,10 分钟在线率超过 99%。反思是带宽、消息数和业务报警必须分层治理。 项目复盘还会把技术指标翻译成业务结果:库存看数量与流水差异,支付看渠道账单和账户分录,物流看游标连续与事件缺口,设备看在线率和状态变化报警。修复后以峰值一点三倍持续压测并叠加单一故障,验证限流、幂等、背压、查证和渐进恢复按设计工作;同时记录当时的错误判断、替代方案与成本取舍,形成可直接复述的闭环。
  • 进阶追问:项目方案取得结果后还要讲什么?
  • 进阶回答:补充替代方案、成本、失败边界和当时的错误判断,说明如何把经验固化为容量、告警、演练和运行手册。
  • 追问 1:为何不直接丢所有重复消息?
  • 直接回答 1:需要稳定设备事件键才能判重,连接内标记和到达时间不足;误丢关键状态变化比重复更危险。
  • 追问 2:为什么规则不能在事件循环执行?
  • 直接回答 2:单次慢规则会阻塞该循环上成千连接的读写、确认和心跳,必须有界卸载。
  • 追问 3:报警聚合会不会漏告警?
  • 直接回答 3:聚合保留首次、持续、升级和恢复状态及计数,原始事件仍可追踪,只减少重复通知而非删除状态变化。
  • 详细章节:IoT(物联网)报警案例
  1. 问题:如果让你统一设计 WMS(仓储管理系统)、支付、物流和 IoT(物联网)的稳定性底座,你会怎样分层?
  • 考点:项目量级、故障时序、技术机制、业务正确性、回滚和复盘表达。
  • 回答思路:按背景、挑战、证据、止血、长期修复、量化结果与设计反思形成可直接复述的闭环。
  • 口述答案:我会把底座分成入口契约、执行隔离、正确性、资源背压、证据与恢复六层。入口层统一截止时间、请求/事件标识、认证、大小限制和租户配额,防止过期请求继续制造副作用;执行层按渠道、租户、任务优先级和远端依赖建立舱壁,线程池、连接池和队列全部有界。正确性层不追求网络“恰好一次”,而是用库存预占号、支付单和渠道流水、轨迹事件键、设备事件序号定义稳定身份,以唯一约束、条件更新和状态机吸收重复;长时间未知由主动查询、重放、对账和补偿收敛。资源层按主机、容器、进程、线程、文件、套接字、网卡和远端建立容量与背压,导出分片、长连接写水位、重连抖动和 Runner(执行器)下游配额分别落地。证据层统一时钟、请求标识、分段耗时、队列年龄和业务正确性指标,每个告警能落到至少两类独立证据。恢复层规定止血、回滚、渐进放量和故障演练,支付优先资金正确,库存优先不超卖,物流优先不漏事件,IoT(物联网)优先保留状态变化。最终用峰值 1.3 倍和丢包、慢依赖、进程终止、磁盘等待、重连风暴组合演练,验证故障被限制在舱内、状态最终收敛、资源有上界,而不是只看接口恢复。 项目复盘还会把技术指标翻译成业务结果:库存看数量与流水差异,支付看渠道账单和账户分录,物流看游标连续与事件缺口,设备看在线率和状态变化报警。修复后以峰值一点三倍持续压测并叠加单一故障,验证限流、幂等、背压、查证和渐进恢复按设计工作;同时记录当时的错误判断、替代方案与成本取舍,形成可直接复述的闭环。
  • 进阶追问:项目方案取得结果后还要讲什么?
  • 进阶回答:补充替代方案、成本、失败边界和当时的错误判断,说明如何把经验固化为容量、告警、演练和运行手册。
  • 追问 1:为什么不建设一个统一大线程池?
  • 直接回答 1:不同业务与下游服务率、风险和优先级不同,共享池会让一个慢依赖占满资源并跨域传播。
  • 追问 2:最核心的统一指标是什么?
  • 直接回答 2:没有单一指标;至少需要成功率/尾延迟、队列年龄、资源饱和、未知状态年龄和业务差异共同描述。
  • 追问 3:如何控制底座复杂度?
  • 直接回答 3:统一接口和观测规范,但让幂等键、状态机和降级策略由领域拥有;平台提供机制而不替业务定义语义。
  • 详细章节:项目设计思想

4. 复习清单

  • 能按主机、容器、进程、线程、文件、套接字、网卡和远端解释一条完整证据链。
  • 能分别复述 WMS(仓储管理系统)库存、批量导出、跨境轨迹、支付、Runner(执行器)、IoT(物联网)和 Netty(网络通信框架)长连接事故。
  • 能解释超时为何不等于失败,以及幂等、状态机、主动查询和对账如何收敛未知结果。
  • 能用到达率、服务率、在途量、队列年龄和资源余量计算有界并发,而不是凭线程数配置容量。
  • 能说明每个止血动作的风险、回滚阈值和同量级回归方法。
  • 能安全说明 tcpdump(抓包工具)、strace(系统调用跟踪工具)和 perf(性能采样工具)的权限、开销、时长与替代方案。
  • 能把“触发原因、放大器、暴露缺陷”分开,不把同时异常的指标并列为根因。
  • 能在 3 至 5 分钟内按“结论、假设、证据、机制、误判、项目、验证”完整回答综合题。

5. 版本与事实边界

  • Linux(操作系统)命令字段、控制组文件、网卡统计和内核行为以目标生产内核与发行版手册为准。
  • Netty(网络通信框架)传输实现、默认水位、内存分配器和 API(应用程序接口)行为以项目实际小版本与官方文档为准。
  • HTTP(超文本传输协议)、TLS(传输层安全协议)和 MQTT(消息队列遥测传输协议)协议事实应结合实际代理、客户端和服务端兼容矩阵验证。
  • 所有流量、延迟、容量和单号为面试教学数据,真实表达时应替换为可核验区间,不能虚构精确生产数字。