00-web请求不适合跑长任务

  1. web请求的本质设计目标
  2. 灾难性体验
  3. 怎么解决?(任务系统)
    1. 任务角度
    2. 好处
    3. 架构设计
  4. 小例子

web请求的本质设计目标

Web请求模型假设

发起 → 立刻完成 → 返回结果

核心点:

  • HTTP是短连接/请求响应模型
  • 面向交互而非计算任务
  • 默认假设: 毫秒~秒级完成

如果耗时太长

  • 浏览器默认超时
  • 反向代理超时
  • 负载均衡超时
  • 网关超时

长任务的本质

发起 → 排队 → 执行 → 多阶段推进 → 完成

灾难性体验

如果使用web请求直接来做会发什么什么?

服务端:

如果一个任务要跑2分钟

  • 长任务 = worker 被锁死
  • 一个请求占一个 worker

用户端:

当页面一直都在加载,用户会怀疑是网卡了

很有可能继续刷新页面的操作,导致请求中断,浪费后端计算资源,前端的体验也不好

架构层面:

  • 不能横向扩展
  • 不能拆步骤
  • 不能并行
  • 不能调度优先级

如果一天 10 万个长任务怎么办?

怎么解决?(任务系统)

(任务系统)Task System

使用任务系统的好处

维度 Web 同步 任务系统
超时 必然
并发
容错
可恢复
进度
扩展 困难 天生支持

任务角度

Task 是一种有状态的工作实体

请求是无状态的:

  • 一断就没了
  • 不关心过程

任务是有生命周期的:

CREATED
QUEUED
RUNNING
STEP_1_DONE
STEP_2_DONE
SUCCESS / FAILED / RETRYING

好处

  1. 排队(削峰)

高峰请求不压垮系统

  1. 解耦

触发者 ≠ 执行者

  1. 调度
  • 并发限制
  • 优先级
  • 延迟执行
  1. 生命周期管理

状态 + 进度 + 审计

  1. 容错
  • 自动重试
  • 断点恢复
  • 死信
  1. 拓展

机器随便加

架构设计

Task System

小例子

  1. chat-gpt 生成图片

chat-gpt

前端隔一段时间向后端询问图片是否创建完毕,如果查询到结果就展示

github