拉卡拉开放平台
有些动作没法在几秒内给出结果:生成一份大文件、处理一批数据、触发一次全量核对。这类动作通常采用异步方式,分成提交与查询两步完成。
| 原因 | 说明 |
|---|---|
| 处理时间长 | 超过常见超时设定,连接会先断 |
| 结果不确定 | 无法预估完成时刻 |
| 占用资源久 | 同步等待会长期占用连接 |
与其让调用方一直等,不如先确认收到,处理完再通知或等待查询。
提交成功之后,通常会拿到一个任务标识。这个标识是后续一切动作的关键:
任务标识必须妥善保存。丢了它,就等于失去了与这次任务的唯一联系。
查得太频繁浪费资源,查得太稀疏影响及时性。常见的做法是:
异步结构的收益是显而易见的:调用方不用阻塞等待,处理方可以按自己的节奏推进。代价则是多了一次状态管理——但相比同步超时带来的不确定性,这点代价是值得的。
异步任务完成后,结果可以通过通知送达,也可以等待主动查询。两者的取舍与同步场景类似:
| 方式 | 优点 | 代价 |
|---|---|---|
| 通知 | 及时,无需轮询 | 需要接收端可用且能确认 |
| 查询 | 确定,不依赖接收端 | 有延迟,且消耗调用量 |
稳妥的做法是两者并行:以通知为主,查询作为兜底。
异步任务的结果不会永久保留,通常有一个可获取的期限。
任务失败后是否重试,取决于失败原因:
整体重提是最省事的做法,也最容易造成重复处理——在异步场景里,这个代价往往比想象中大。
异步任务长时间没有结果,系统不能一直等下去。应当设定一个总时长上限,超过之后转为人工处理或标记待核查。这个出口保证了任何任务都有终点,不会悄悄变成无人过问的死角。
异步任务的状态划分应当简洁但够用,通常包括排队中、处理中、已完成、已失败四类。
| 状态 | 含义 | 系统动作 |
|---|---|---|
| 排队中 | 已受理但未开始 | 继续等待 |
| 处理中 | 正在执行 | 继续等待 |
| 已完成 | 可以获取结果 | 立即取回并落库 |
| 已失败 | 明确失败 | 记录原因并决定后续 |
状态划分清楚之后,调用方的轮询逻辑会简单很多,不会出现「不知道该继续等还是该放弃」的困境。
上一篇:被限流之后:频次限制的理解与应对
下一篇:日志应该记录什么:可排查性设计
24小时免费咨询
请输入您的联系电话,座机请加区号
