微服务间异步请求处理完成时,如何通知客户端并获取资源创建详情?
微服务多下游任务完成通知解决方案
方案1:服务端长连接推送(实时性最优,推荐)
- Service A完成主资产记录创建后,生成唯一资产ID,先返回该ID给客户端,同时在本地维护资产子任务状态表,记录Service B、Service C的执行状态(待执行/成功/失败)、返回结果、错误信息
- Service A通过异步RPC或事件驱动的方式调用Service B、Service C,两个服务处理完成后将结果/错误回调给Service A,更新对应子任务的状态
- 客户端和Service A建立WebSocket或SSE长连接,绑定对应的资产ID;Service A检测到两个子任务都处理完成(或任意一个失败)时,直接通过长连接将最终结果(成功的详细数据/失败的错误信息)推送给客户端
- 优势:完全避免无效轮询,实时性高,错误感知及时
方案2:聚合状态轮询(改造成本最低)
如果不适合引入长连接,可以对原有轮询方案做优化:
- 取消客户端直接轮询Service B、Service C的逻辑,改为由Service A统一提供
GET /api/assets/{assetId}/status状态查询接口,聚合两个子任务的状态统一返回 - 客户端采用指数退避的轮询策略:首次间隔1s查询,之后每次间隔翻倍,最高间隔不超过30s,设置最大等待阈值(比如5分钟),超过阈值直接提示操作超时
- 状态接口返回三种结果:
- 处理中:客户端继续轮询
- 全部成功:返回Service B、C创建的所有子元素详细信息
- 处理失败:返回具体错误原因,终止轮询
- 优势:无需修改服务间调用逻辑,客户端只需要对接Service A单个服务,适配成本极低
方案3:分布式事务协调(强一致性场景适用)
如果要求两个子元素必须同时创建成功、不能出现单边创建的脏数据,可以引入分布式事务方案:
- 采用Saga事件编排模式,由事务协调器管控Service B、C的执行流程,两个服务都执行成功才标记事务完成,任意一个失败则触发已执行服务的回滚逻辑
- 事务完成后统一将结果同步给Service A,再按方案1或2的方式通知客户端
通用注意事项
- 所有服务间调用必须带上唯一请求ID,实现幂等控制,避免重试导致重复创建数据
- 要给Service B、C的调用设置超时阈值,超过阈值直接标记为失败,避免客户端无限等待

内容的提问来源于stack exchange,提问作者Moha
相关产品推荐
相关产品推荐

