长轮询机制(Preview Polling)
总体说明
针对文件下载、格式转换等异步耗时场景,系统在预览模块中内置了一套可配置、可限流、可自适应的长轮询机制。
- 客户端通过统一的轮询接口查询文件状态
- 服务端在超时时间内持续检查缓存与任务状态
- 一旦结果就绪立即返回,避免频繁短轮询带来的资源浪费
长轮询行为由 fileview.preview.polling 统一控制,并与缓存、网络下载、密码安全等机制协同工作。
一、长轮询核心配置:fileview.preview.polling
1. 基础参数(超时与频率边界)
yaml
fileview:
preview:
polling:
default-timeout: 20 # 默认超时时间(秒)
max-timeout: 300 # 最大超时时间(秒)
default-interval: 1000 # 默认检查间隔(毫秒)
min-interval: 500 # 最小检查间隔(毫秒)
max-interval: 5000 # 最大检查间隔(毫秒)2. 设计要点
默认值兜底
- 客户端未指定参数时,使用系统默认值:
default-timeout = 20sdefault-interval = 1000ms
强制边界约束
即使客户端传入极端参数,系统也会进行裁剪:
- 超时时间:
5s ≤ timeout ≤ 300s - 检查间隔:
500ms ≤ interval ≤ 5000ms
产品价值
- 防止恶意或误用请求长时间占用线程
- 防止过高频率轮询导致 Redis 与 CPU 压力激增
- 保证长轮询在可控范围内运行
二、智能轮询策略(自适应间隔)
1. 配置说明
yaml
fileview:
preview:
polling:
smart-strategy:
phase1-attempts: 10
phase1-interval: 1000
phase2-attempts: 20
phase2-interval: 2000
phase3-interval: 50002. 三阶段轮询策略
| 阶段 | 尝试次数范围 | 间隔 | 设计目的 |
|---|---|---|---|
| Phase 1 | 1 ~ 10 次 | 1s | 快速响应(大多数文件) |
| Phase 2 | 11 ~ 30 次 | 2s | 适度放缓(复杂文件) |
| Phase 3 | 31+ 次 | 5s | 明显降压(大文件 / 慢转换) |
实际效果(以 timeout = 60s 为例):
- 前 10 秒:高频检查,尽快返回结果
- 10 ~ 50 秒:降低频率,平衡响应与压力
- 50 秒后:显著降频,避免持续高压访问缓存
产品价值:
- 大幅减少无意义的高频 Redis 查询
- 在不牺牲用户体验的前提下,提升系统整体吞吐能力
- 对不同文件规模具备“自适应行为”
三、与缓存机制的协同(fileview.preview.cache)
1. 缓存配置
yaml
fileview:
preview:
cache:
enabled: true
conversion:
success-ttl: 86400 # 转换成功缓存 24 小时
failed-ttl: 60 # 转换失败缓存 60 秒
direct-preview-ttl: 864002. 长轮询与缓存的关系
- 长轮询每次循环都会查询 Redis 缓存
- 一旦命中以下终态之一,立即返回并结束轮询:
SUCCESSFAILEDNOT_SUPPORTEDPASSWORD_REQUIRED
设计要点:
- ✅ 成功结果缓存 24 小时:
- 同一文件重复预览可直接命中缓存,无需再次转换
- ✅ 失败结果仅缓存 60 秒:
- 避免错误状态被长期放大或“永久失败”
四、与网络文件下载的协同
1. 下载配置
yaml
fileview:
network:
download:
connect-timeout: 3000
read-timeout: 60000
max-retry: 32. 在长轮询中的表现
对于网络文件预览(URL 文件):
- 预览服务先异步触发下载任务
- 长轮询阶段优先检查下载任务状态:
DOWNLOADING→ 继续等待DOWNLOADED→ 进入转换状态检查FAILED→ 立即返回失败结果
下载失败不会继续无意义地等待转换。
产品价值:
- 下载失败能被快速感知并返回
- 避免“下载失败但仍长时间轮询转换状态”的无效等待
五、与加密文件 / 密码安全的协同
1. 密码安全配置
yaml
fileview:
preview:
security:
password:
ttlSeconds: 18002. 长轮询中的行为
对于加密文件(加密 Office / 压缩包):
- 若未解锁或解锁状态已过期
- 长轮询会直接返回
PASSWORD_REQUIRED - 不会返回任何预览 URL
安全设计要点:
- 密码解锁状态存储在 Redis 中,TTL 为 30 分钟
- 密码本身加密存储
- 防止通过轮询接口绕过密码校验获取预览链接
六、典型场景说明
场景 1:本地文件快速转换
- 默认超时
20s - 前期每秒检查一次
- 3 秒内完成转换,立即返回结果
- 转换结果缓存 24 小时
场景 2:网络文件 + 慢转换
- 客户端指定
timeout = 60s - 下载阶段 + 转换阶段统一由长轮询感知
- 前期密集、后期放缓
- 约 50 秒后返回最终结果
场景 3:加密文件未解锁
- 长轮询检测到文件已加密
- 校验解锁状态失败
- 立即返回
PASSWORD_REQUIRED,终止轮询
七、小结
- 长轮询机制由统一配置控制,具备默认兜底 + 边界保护
- 通过三阶段智能轮询策略,实现前快后慢、自动降压
- 与缓存、下载、密码安全机制深度协同
- 在保证用户体验的同时,有效控制系统资源消耗
适用场景:
- 大文件
- 网络文件
- 转换耗时不可预期的复杂场景