我正在构建一个必须处理大量传入 Webhooks 的后端,而这些对响应时间的要求非常高。
我的后端在 Koa 中,我只想立即发送 200 响应,然后继续执行代码并执行较长的任务,例如处理(计算、访问数据库等)。
我尝试了多种方法,但是通过调用 next() 和 wait next() ,只有当所有中间件都执行了其部分代码时才会发送响应。
注意:我已经阅读了SO
上的这些答案我的基本代码如下所示:
const webhookHandler = async (ctx: Context, next: Next): Promise<void> => {
console.log('Handling webhook event');
// 1 check request
const event = ctx.request.body;
if (!event || !event.type) {
ctx.status = 400;
ctx.body = { received: false };
return;
}
// 2 send response immediately
ctx.status = 200;
ctx.body = { received: true };
next();
// 3 handle event
switch (event.type) {
case 'a':
// long running task here
break;
default:
console.log(`Unhandled event type: ${event.type}`);
break;
}
};
在你的中间件函数结束之前,Koa 不会发送请求。假设您的任务可以异步处理,则该任务可能需要包装在您不等待的异步函数中。
如果您的任务完全受 CPU 限制,那么您必须重新考虑在进程中运行该任务