异步执行场景疑问:Node.js中MongoDB与Kafka相关代码执行逻辑解析
代码片段
服务文件代码
const deleteData = async (result) => { await Promise.all([ deleteFromCollectionA(result), deleteFromCollectionB(result), deleteFromCollectionC(result), ]); }; const recalculateData = async () => { const rows = await database("someTable"); for (let i = 0; i < rows.length; i++) { const message = mapToMessage(record); await pushToQueue(message); } }; const recalculate = async (result) => { await deleteData(result); await recalculateData(result); };
控制器代码
async function recalculate(req, res) { await recalculate(); }
路由代码
router.post("/recalculate", recalculate);
疑问与解答
场景说明
deleteData() 负责从多个MongoDB集合中删除文档;recalculateData() 从SQL数据库拉取记录,遍历后映射为消息并逐个发送至Kafka Topic,由下游消费服务处理消息后将结果插入MongoDB集合。
问题1:recalculateData是否会等待deleteData完成所有文档删除后才开始执行?
是的,会完全等待。在recalculate函数中,await deleteData(result)会暂停后续代码执行,直到deleteData内部的Promise.all完成三个集合的所有删除操作(所有异步删除任务都执行完毕),才会启动recalculateData的执行。
问题2:当通过API端点触发recalculate()时,是否会阻塞该端点的请求处理,直到recalculateData触发的所有处理(含SQL记录获取、Kafka消息推送、消费服务完成处理并插入MongoDB)全部结束?
不会等待全部流程,仅阻塞到SQL查询完成、所有Kafka消息推送完成这一步。await pushToQueue(message)只是等待消息成功发送到Kafka的确认信号,而消费服务接收消息、处理并插入MongoDB的流程是独立的异步链路,和当前API请求的执行流程无关,当前请求不会跟踪或等待这部分后续操作完成。
内容的提问来源于stack exchange,提问作者Out Of Bounds
相关产品推荐
相关产品推荐

