资讯详情

资讯详情

pure_live HLS 上游响应体空闲超时审计:录制 relay 的 body 空闲检测实现与验证

音视频直播移动开发【免费下载链接】pure_live纯粹直播:哔哩哔哩/虎牙/斗鱼/快手/抖音/网易cc/YY直播/Twitch直播/SOOP直播/M38自定义源应有尽有。项目地址https://gitcode.com/gh_mirrors/pur/pure_live点击查看免费下载导读本篇以 pure_live 仓库的 HLS 上游响应体空闲超时审计 为骨架深入讲解录制 relay 在先完整暂存、后发布路径上如何识别真正的上游网络空闲并以 504 超时、取消迭代器、释放 spool/暂存名额的方式结束挂起连接。读完本文你将掌握-rw_timeout微秒语义在本项目中的实际消费方式、_publishCompleteBody与_readManifest的空闲检测实现以及围绕真实 loopback TCP 服务的红绿测试与原生控制证据并了解当前修复的边界与未闭环风险。一、问题背景完整发布路径上的无界等待录制 relay 的设计目标是媒体响应被完整收齐后才发布给 FFmpeg 消费清单manifest也需先完整读取再重写详见 hls_media_spool.dart 中HlsMediaSpool的seal/read语义Only a complete HLS body may be published。这一设计保证了 native 侧永远看到完整分片但也引入了第一个错误状态_publishCompleteBody与_readManifest中的iterator.moveNext在修订前没有空闲超时上游先送部分数据然后停住relay 就会一直占有该上游连接、占用暂存槽stagingBodyCount以及可能已经创建的 spool 临时目录与此同时native 的rw_timeout作用于另一个 loopback 连接relay 与 FFmpeg 之间它并没有替 relay 关闭其上游读取单纯调大本地超时只会进一步放大这一缺口——空闲挂起的时间窗越长暂存名额与临时目录被占用的时间越长。二、-rw_timeout的语义与本次修订策略2.1 FFmpeg 的微秒语义FFmpeg 官方协议文档 中_inputProtocolOptions将秒级配置换算为微秒final timeoutMicros (rwTimeout.clamp(1, 3600) * 1000000).clamp(1, 2147483647).toString();其中clamp(1, 2147483647)将微秒值约束在 32 位有符号整数上限内这与生产命令构造的2147483647 微秒上限一致。2.2 用户设置与缺省值-rw_timeout的来源是录制设置中的网络读写超时单位秒recorder_config.dartrwTimeout读取HivePrefUtil持久化值缺省defaultRwTimeout 15秒合法取值集合supportedRwTimeouts int[15, 30, 60]normalizeRwTimeout对非法值回退到缺省 15 秒构建命令时经_inputProtocolOptions换算为微秒传入-rw_timeout。2.3 relay 侧的读取策略本修订在录制 relay 的每次上游 body 读取使用首个输入的正数rw_timeout缺省 15 秒具体规则如下只读输入侧参数_readBodyIdleTimeout只扫描第一个-i之前的-rw_timeout忽略输出侧同名参数ffmpeg_hls_input_relay.dart参数无效时保留缺省int.tryParse失败或值非正数时使用缺省 15 秒正数则clamp(1, 2147483647)微秒每次接收重新计时超时作用在相邻两次moveNext之间即每次分块接收都会重置空闲计时磁盘写入背压不计作网络空闲spool 落盘产生的等待不属于上游空闲不会触发超时持续交付总时长大于空闲预算仍可完成只要每个分块间隔不超过空闲预算一次持续数秒的完整交付不会被打断——这正是文档中8 块、每块间隔 120 ms、总交付超过 700 ms用例通过的原因。实现落在 hls_body_reader.dart 的HlsResponseBudget.wait每个等待使用剩余总量与空闲量中的较小值作为单次timeout并在此版本中先以idle为单次等待上限FutureT waitT(FutureT Function() action, {void Function()? abort}) async { try { check(); final left remaining; return await action().timeout(left idle ? left : idle); } on TimeoutException { abort?.call(); rethrow; } }三、超时后的错误路径与资源清理空闲超时沿已有 504 路径返回零 bodyffmpeg_hls_input_relay.dart 中TimeoutException分支回复HttpStatus.gatewayTimeout并在finally中取消真实迭代器HlsBodyReader.cancel释放 spoolbody.dispose()删除临时文件与临时目录归还暂存名额_stagingBodies--。同时刻意保持以下边界不变不关闭整台 relay 的共享 client超时只影响当前请求不影响其他并发请求不伪报用户停止不会伪造_HlsFetchStopped不尾片舍弃空闲超时不是丢掉输入尾巴inputTailDiscarded不会被设置停止已发出时保留_HlsFetchStopped的处理_nextBodyChunk在超时后检查_fetchStopped若用户已请求停止则抛出_HlsFetchStopped而非TimeoutExceptionffmpeg_hls_input_relay.dart。HlsBodyReaderhls_body_reader.dart保证超时取消真正生效StreamIterator.cancel单独调用不会在moveNext前订阅/取消原始 stream因此它显式维护_subscribed状态——未订阅时先_source.listen(null).cancel()再取消迭代器确保上游 socket 不会被留下未读而被保留。启用范围空闲检测仅对drainOnStop的录制路径启用。以下场景均未调整非录制播放 relay流式 pipe 路径请求头 / TLS / 重定向超时由HttpClient.connectionTimeout 15 秒承担见 ffmpeg_hls_input_relay.dart原生命令-i输入自身用户设置rwTimeout配置完整分片保护HlsMediaSpool的seal长度校验与 128 MiB 单响应上限。四、来源判定fork-regression文档将该缺陷归为fork-regression冻结上游c6c9bd70aedc503c003110dae10a83ad0bb891d8与 merge base527fea1b40885e3621d53c9646b523dd8522290c均没有该 relay 文件完整媒体暂存由维护提交6415d42e71aa76d5ab3304f737bebf593cb6a792引入本地 body 等待未承担对应的网络超时责任本批只做只读核对与局部修订没有合并上游。这也解释了为何不能简单依赖 native 的rw_timeoutnative 的超时作用于 loopback 连接而 relay 持有的是独立的上游连接两者生命周期不同。五、红绿证据真实 TCP 连接而非模拟 Future新增测试用例文档所述test/ffmpeg_hls_body_idle_test.dart直接经过生产 relay 与 loopback TCP 服务不以模拟 Future 替代真实连接关闭从而验证完整的连接生命周期。测试设计输入 idle 500 ms上游给出比实际 body 多 1 字节的Content-Length先发送完整前缀再保持连接不关闭媒体前缀 3 MiB 触发一次真实落盘HlsMediaSpool的 2 MiB 内存阈值之上即 spill 到临时文件另一个用例停住清单 body。修订前后对比阶段行为修订前两项均在观察上限 3 秒超时失败连续交付用例通过。失败是新回归要求未实现而非把旧等待视作成功修订后两项返回 504 / 零字节TCP 读端确认连接已断开stagingBodyCount 0临时目录为空无finishRequested/inputTailDiscarded随后同一 relay 再请求健康清单与媒体成功连续交付8 块、每块间隔 120 ms总交付超过 700 ms完整输出原始字符串01234567没有误用输出侧 1 微秒设置也没有把总传输时间误当空闲最终44/44 定向7 文件、两文件 fatal-infos 分析通过相邻覆盖完整/截断/超限/落盘失败、八响应名额、停止与 TLS 取消、源参数与诊断且没有改变这些断言来迁就修订。六、原生控制与额外风险复用已校验哈希的原 60 秒媒体夹具未修改滚动探针2/2统计回归 四场景原生控制通过既有断言。本批原件位于local-artifacts/hls-body-idle-20260909/controls/rolling-1788944790111390/。场景started / 字节缺片事件数停止 msforcedCancel / inputDrainedhealthy-10true / 18843240681false / truecontinuous-body-10false / 017026true / falsecontinuous-body-15true / 45195212531false / truedelayed-headers-15true / 45195212482false / true四场景inputIntegrityErrorfalse诊断省略数为零。产物与前一审计相同健康场景为正常video480/audio750包两个 15 秒慢场景为video120/audio188包、约 4 秒内容。持续传输没有被新 idle 检测截断但 10 秒 native 提前超时和 15 秒仍缺内容的问题依然存在。额外发现零输出场景的强制取消兜底本次观测中零输出场景触发了既有强制取消兜底前篇为正常排空其 relay 媒体在 36006 ms 返回 410后续缓存清单在 36008 ms 交付初始化请求在 36020 ms 返回 410native 到 41027 ms 才结束。没有未回收的 relay handler/暂存也没有录像文件但停止时延/排空差异仍是待复验风险。探针原断言没有要求该失败输入场景forcedCancelfalse故 2/2 通过不等于该差异已解决单次观测也不能证明由本次改动引起文档明确保留该对照作为下一次预算协调的重点且不篡改终态证据。七、资源、交付与下一步构建资源证据20260909T090311823Z-hls-body-idle-red.json1 通过 / 2 失败183.303 秒含排队峰值 CPU 8.58%WS 7937105920 B结束活跃重型数 020260909T090840594Z-hls-body-idle-final.json44 定向 原生 2 项通过、分析退出 0295.173 秒峰值 CPU 32.91%WS 8411709440 B结束活跃重型数 0所有重型工作串行使用build_resource_guard排队/运行中未编辑源码或测试使用原进程句柄等待没有终止其他 Gradle 工作check.ps1、red/final 源码哈希与直接 Tee 输出、native.log、各场景 JSON/TS 与artifact-index.json均留在本地证据目录。未闭环事项需要有界的完整事务预算与上游进展证据再解耦 loopback 完整发布等待与上游空闲时间并复验零输出停止路径当前只解决真正空闲的 body持续涓流的绝对时间上限、完整片段下载总时限、native 提前超时及低吞吐下的内容完整性仍待处理已存在的 128 MiB/响应、8 并发名额不是时间上限不能混为完成证据。后续进展见 HLS 响应预算与完整发布等待协调本篇所列待办中的累计预算与 native 等待已补实现与控制验证——HlsResponseBudget的总预算为单次空闲的4 倍录制 native 输入等待改为4 × 上游空闲秒数 15 秒连接预算 5 秒调度余量10 秒输入对应 60000000 微秒缺省 15 秒对应 80000000 微秒但真实 TTing 内容缺口继续保留历史停止差异不删除。八、状态总结版本 3.1.84121候选不变仍为 18 直播站点 IPTV、9 组未注册、42 宏观大项未闭环。没有设备、MT、Root/LSP、安装、数据清理、重启、构建候选或发布操作。回滚可对实现提交作反向补丁但会重新暴露已证明的响应体挂起问题——这正是本批修订的必要性所在先识别并终结真正空闲的上游 body 读取再为持续涓流与完整发布等待引入总预算协调。赞分享音视频直播移动开发【免费下载链接】pure_live纯粹直播:哔哩哔哩/虎牙/斗鱼/快手/抖音/网易cc/YY直播/Twitch直播/SOOP直播/M38自定义源应有尽有。项目地址https://gitcode.com/gh_mirrors/pur/pure_live点击查看免费下载相关推荐smallnest/rpcx连接管理策略空闲检测与保活机制实现smallnest/rpcx连接管理策略空闲检测与保活机制实现 在分布式系统中网络连接的稳定性直接影响服务可用性。当服务间通信量波动较大时大量空闲连接会消后端RPC框架微服务oh-my-pi Coding Agent 智能回顾机制recap 提示词设计与空闲检测实现oh my pi Coding Agent 智能回顾机制recap 提示词设计与空闲检测实现 用户暂时离开终端后再回来时最怕的是上下文断裂——不记得刚才人工智能AI Agent代码智能体工具调用CLIMCP ClientsConsul超时配置终极指南连接、请求与空闲超时全解析Consul超时配置终极指南连接、请求与空闲超时全解析 Consul作为一款分布式服务网格解决方案其超时配置直接影响服务间通信的可靠性与性能。本文将详细介绍服务网格服务注册发现API网关健康检查微服务上一篇终极指南如何用Glance打造一站式娱乐聚合中心下一篇React Native FBSDK Next Android配置解决常见问题的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →