Google Cloud Tasks执行成功后是否会自动删除?
Cloud Tasks相关问题解答
核心疑问解答
- 任务执行成功后会自动删除吗?
是的,Cloud Tasks默认规则下,只要你的业务端点返回2xx系列状态码,任务被判定为执行成功,就会自动被系统删除。你在控制台执行完成后短时间还能看到任务属于正常现象,控制台数据同步有几分钟的延迟,等待片刻后任务就会消失,不需要手动调用删除接口。 - 任务没执行失败但retries数值为4是什么原因?
你的业务代码存在两个错误,导致Cloud Tasks判定任务执行失败触发了重试:- 响应没有正确结束:你只写了
res.status(200),没有调用.send()、.json()或者.end()方法结束请求,会导致请求超时,Cloud Tasks侧判定为执行失败触发重试。 - 数据库查询漏加await:
let { expirationTask } = admin.firestore().doc(payload.docPath).get()这行代码中,get()方法返回的是Promise对象,你没有加await等待查询完成,直接解构取值会导致expirationTask为undefined,后续调用taskClient.deleteTask时报错,代码进入catch分支返回500错误,也会触发重试。
- 响应没有正确结束:你只写了
修正后的代码示例
exports.firestoreTtlCallback = functions.https.onRequest(async (req, res) => { try { const payload = req.body; const docSnap = await admin.firestore().doc(payload.docPath).get(); const entry = docSnap.data(); const userSnap = await admin.firestore().doc(`/users/${payload.uid}`).get(); const tokens = userSnap.get('tokens'); // 发送推送通知 try { const response = await admin.messaging().sendMulticast({ tokens, notification: { title: "App", body: entry['text'] } }); log('Successfully sent message:') log(response) } catch (error) { log('Error in sending Message') log(error) } // 可选:如果你还是要手动删任务,补充await即可,其实不需要这部分逻辑 // const taskClient = new CloudTasksClient(); // const expirationTask = docSnap.get('expirationTask'); // await taskClient.deleteTask({ name: expirationTask }); // await admin.firestore().doc(payload.docPath).update({ expirationTask: admin.firestore.FieldValue.delete() }) // 正确返回响应结束请求 res.status(200).send('ok'); } catch (err) { log(err) res.status(500).send(err) } })
额外优化建议
你不需要在业务代码里手动调用deleteTask删除任务,Cloud Tasks的自动清理逻辑已经可以满足需求,删掉这部分逻辑还可以减少不必要的API调用,降低代码出错概率。
内容的提问来源于stack exchange,提问作者pythonNovice
相关产品推荐
相关产品推荐

