如何执行一些相对耗时的操作

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: '已下单' };
  }
}
上一篇 下一篇

猜你喜欢

热点阅读