长耗时回测和下单为何采用异步任务加 SSE,而非同步 HTTP?
未标记
考查重点:任务生命周期与连接解耦。长回测/下单与连接解耦,提交即返任务 ID,SSE 送进度,持久状态可恢复;资金动作另有幂等和确认
本题目录
参考答案
本答案基于相关资料,由 AI 辅助编写,供学习与面试准备参考。如有疏漏,欢迎反馈指正。
核心回答
长耗时回测适合采用“提交任务、持久执行、订阅进度”的方式:提交接口快速返回任务标识,工作进程异步执行,SSE 推送进度,查询接口提供最终状态和结果。这样浏览器刷新、连接超时或断开,不必意味着整次任务丢失。
SSE 只负责把事件送给前端,不负责持久执行、重试或恰好执行一次。下单这类资金相关动作还要有稳定业务操作标识、权限与业务校验,以及订单状态确认;连接重连不能触发重复下单。
一条可落地的链路
- 提交回测参数,完成校验后写入任务记录,返回任务
ID与状态查询地址。需要时用202 Accepted表达已接收但尚未完成。 - 可靠地将任务交给工作进程,记录待执行、运行中、成功、失败或取消状态;任务记录与投递之间采用可靠消息等一致性方案。
- 前端订阅这个任务的
SSE事件,展示阶段、当前进度和错误;连接失败后仍能通过查询接口知道任务状态。 - 结果落到持久存储,完成事件携带结果引用;取消通过独立命令提出,由工作进程按安全检查点处理。
为什么不一直等待同步响应
同步长请求实现简单,短任务可以使用;但执行时间不可预测时,代理总时长限制、连接中断和响应丢失会使客户端无法判断业务是否已成功。持久任务将“工作有没有完成”与“这条连接是否还活着”分开。
异步也增加队列、任务恢复和状态管理成本。若任务很短、结果无需恢复,不必为了使用 SSE 增加整套任务平台。回测可重算,而已发出的交易指令不能简单重跑,恢复策略应分别设计。
对应教程
- 电商问数第15章:API接口基础与FastAPI入门:回看流式响应与
SSE消息格式。 - 电商问数第17章:前后端联调与日志追踪:回看
progress、result、error的前后端约定。
参考资料
- 国内:阿里云:传统 HTTP 模式与 SSE:采用单向事件流可持续传递结果的机制,说明任务执行中如何反馈。
- 国内:阿里云百炼:流式输出:借鉴长时间等待与逐段反馈的差异,解释进度通道的体验价值。
- 国内:CloudWeGo:Hertz SSE:采用请求与流生命周期的约束,说明连接资源释放与后台工作需要分别管理。
- 国内:阿里云点金:Agent 事件数据模型:借鉴异步工具等待、挂起和终态事件的模型,组织任务状态与推送事件的分工。
- 国外:WHATWG:Server-sent events:核对
SSE只是HTTP事件传输,不赋予任务持久化或业务恰好一次语义。 - 国外:Microsoft:Fetch Event Source:采用断开、取消与重连由客户端控制的机制,说明它们不能替代后台任务状态。
- 国外:Microsoft:Asynchronous Request-Reply pattern:采用先返回
202 Accepted与状态地址、后台独立处理和保存状态的分工,解释事件订阅不能代替任务状态查询。
相关面经
1 篇字节跳动
Agent 开发工程师一面
为什么长耗时的回测、下单不使用同步 HTTP,要改成异步 + SSE?同步方案遇到了什么问题?
