01-长链路任务抽象模型

长链路任务模型的核心在于解耦

​ 通过消息队列将任务提交者与执行者分离,通过状态机明确任务生命周期,通过状态存储异步通知反馈进度和结果。Web‑Queue‑Worker 架构提供了一种简洁而有效的实现方式,使系统能够处理耗时任务而不阻塞用户请求,并支持扩展、幂等和容错。结合异步 HTTP 模式,可为客户端提供清晰的接口协议与状态反馈机制。遵循这些设计原则和实践建议,可以帮助开发者构建稳定、可伸缩的后台任务系统。

长链路抽象模型

痛点:

我在接触的很多AI相关应用的时候,发现AI调用过程是十分耗时,并且每次任务的执行是非常耗费资源。

比如:

用户上传一份扫描合同,要OCR解析,图片语义解析,Embedding、结构化提取,入库

每一个步骤都十分耗时,而且有很大的概率出现问题,十分耗时,且消耗资源

如果采用同步的方案,客户体验直接差到爆

所以得采用异步消息队列的方案

长链路任务不是函数调用,而是一个有生命周期的系统对象

任务 = 生命周期状态机

任务不是函数,是对象!

存在一系列状态的对象

简易版本

stateDiagram-v2
    [*] --> PENDING
    PENDING --> RUNNING
    RUNNING --> SUCCEEDED
    RUNNING --> FAILED
    RUNNING --> CANCELED

复杂版本

stateDiagram-v2
    [*] --> CREATED : create task

    CREATED --> QUEUED : publish to broker

    QUEUED --> DELIVERED : worker consume

    DELIVERED --> RUNNING : start execution

    RUNNING --> SUCCESS : finished ok
    SUCCESS --> [*] : ack & done

    RUNNING --> FAILED : exception / timeout / crash

    FAILED --> RETRYING : retry policy

    RETRYING --> QUEUED : re-enqueue

    FAILED --> DEAD : exceed max retries

  • 状态迁移
  • 持久化

执行 ≠ 触发

这是传统的WEB思维:

API 调用 = 执行任务

纠正:

API 只创建任务

Worker 才执行任务

生产者消费者模型

长链路任务的 task system 是一个生产者消费者的模型

flowchart LR
    P[Producer API] --> Q[Task Queue]
    Q --> C1[Worker 1]
    Q --> C2[Worker 2]
    C1 --> DB[Task Store]
    C2 --> DB

过程必须可观测

任务系统必须:

  • 有进度
  • 有事件
  • 有日志轨迹

服务流程

标准请求流程设计

这是一个标准的请求流程

sequenceDiagram

    autonumber
    participant C as 客户端
    participant API as API/任务管理
    participant Q as 队列
    participant W as Worker
    participant DB as 状态存储

    C->>API: POST /tasks (提交任务)
    API-->>C: 202 Accepted\nLocation: /tasks/{id}
    API->>Q: 发布任务 id
    Note over Q: 消息队列缓冲任务
    W->>Q: 拉取任务 id
    W->>DB: 更新状态(RUNNING)
    loop 轮询
        C->>API: GET /tasks/{id}
        API-->>C: 当前状态、进度
    end
    W->>DB: 写入结果并标记完成
    C->>API: GET /tasks/{id}
    API-->>C: 返回结果

web-queue-worker 流程设计

Web‑Queue‑Worker

sequenceDiagram
    participant Client as 客户端
    participant API as 接口服务
    participant Backend as 后端/Worker
    Client->>API: POST /tasks (提交任务)
    API-->>Client: HTTP 202 Accepted + Location: /status/{id}
    API->>Backend: 将任务推送至消息队列
    loop 客户端轮询
        Client->>API: GET /status/{id}
        alt 任务进行中
            API-->>Client: 200 OK (in progress)
        else 任务完成
            API-->>Client: 302 Found /result/{id}
        end
    end
    Client->>API: GET /result/{id}
    API-->>Client: 200 OK + 任务结果

行业解决方案

抽象概念 实际技术
Queue Redis / RabbitMQ / Kafka
Worker 后台进程 / 容器 / Serverless
State Store MySQL / Redis
Result Store 数据库 / 对象存储
github