如何执行一些相对耗时的操作
2019-10-25 本文已影响0人
黑曼巴yk
前言
假设我们有个操作相对耗时(5分钟)。假设我们等任务完成之后返回给前端。这时候肯定已经超时了。
class TradeController extends Controller {
async buy () {
const goods = {};
const result = await ctx.service.trade.buy(goods);
await ctx.service.trade.check(result);
ctx.body = { msg: '已下单' };
}
}
方案
如果是非常耗时的方案,最好最常用的方式是使用消息队列方式。
消息队列
消息队列是互联网解决异步的最常用的技术,但是同时要引入新的组件,增加技术复杂度
egg的处理方式ctx.runInBackground()
在处理完用户请求后,希望立即返回响应,但同时需要异步执行一些操作。可以使用这个API来操作
// app/controller/trade.js
class TradeController extends Controller {
async buy () {
const goods = {};
const result = await ctx.service.trade.buy(goods);
// 下单后需要进行一次核对,且不阻塞当前请求
ctx.runInBackground(async () => {
// 这里面的异常都会统统被 Backgroud 捕获掉,并打印错误日志
await ctx.service.trade.check(result);
});
ctx.body = { msg: '已下单' };
}
}