Nodejs 天生异步 为什么还需要异步队列

Nodejs 天生异步 为什么还需要异步队列

发送短信,邮件这些耗时任务,本来就是异步请求,不会阻塞后面的逻辑。为什么还需要 redis 队列来处理。

12 回复

因为你不能保证你的系统全是 nodejs 服务,实际的情况是生产中 nodejs 只是很小一部分,大部分还是 java 做服务层

然后还需要考虑量级的场景,虽然是异步,但是 qps 一上去,一样能把 nodejs 服务器打垮。这个时候就需要 消息队列来承担这种量级的请求


因为需要持久化,以及服务平台化的需求
一旦你的 node 挂掉了,这些存在内存里面的队列都会没了
另外现在流行服务平台化,专用的任务用专用服务去做

感谢楼上几位大佬的回答

队列用处是超过 qps 的请求缓存起来慢慢来做
和语言无关。

就是耗时太长,不友好,假如发个邮件要 5s, 那不用队列的话,就是要等待 5s, 如果用异步队列的,api 的相应可能是几十 ms 毫秒而已

发邮件这种异步请求不需要等待啊,后面直接返回就行了,除非 await 改成同步的写法。

需要持久化吧,nodejs 的队列万一挂掉就 GG 了。

我觉得不需要 redis,前提是你的应用服务器做好柔性重启,关闭前执行完内存中遗留的任务
队列的作用是削峰,应对突发流量,如果常时流量就很大,你需要的是提高硬件 /改善架构,而不是靠队列解决,因为处理不过来在队列里也会堆积

松耦合,例如你发 http 请求,这在服务层面其实是同步的,需要通信双方都在场,而异步队列就不需要了

没有需求就不要用,建议避免过度设计。

如果你现在有个问题,需要依赖 Redis 来帮忙解决,这时候再引入 Redis 就好了。

队列能实现的是削峰填谷和松散耦合的效果,比如你的负载是时而 30%、时而 130%,这样高负载的时候你的服务就卡(有可能引发雪崩),低负载的时候机器空转浪费钱,如果业务上能接受异步处理的话,就全塞到队列里,然后消费者按照正好 100%的负载匀速消费,这样可以达到资源的最大利用。

还是那句话,没有需要不用硬上。

两码事

Node.js之所以天生异步,是因为其设计初衷就是处理高并发和I/O密集型任务,通过异步编程模型来提高效率。然而,即便Node.js本身支持异步操作,异步队列的使用在某些场景下仍然是有必要的。

首先,异步队列可以确保任务按照特定顺序执行。在Node.js中,异步操作虽然不会阻塞主线程,但它们的完成顺序是不确定的。通过使用异步队列,我们可以控制任务的执行顺序,这对于需要依赖先前任务结果的场景至关重要。

以下是一个简单的异步队列示例,使用Node.js的async库(需先安装):

const async = require('async');

const tasks = [
  (callback) => {
    setTimeout(() => {
      console.log('Task 1 complete');
      callback();
    }, 1000);
  },
  (callback) => {
    setTimeout(() => {
      console.log('Task 2 complete');
      callback();
    }, 500);
  }
];

async.series(tasks, (err) => {
  if (err) throw err;
  console.log('All tasks complete');
});

在这个示例中,async.series函数创建了一个异步队列,并按顺序执行tasks数组中的任务。每个任务都是一个接受回调函数的异步操作,当任务完成时调用回调函数。

总之,异步队列在Node.js中仍然有其独特的价值,它可以帮助我们更好地控制异步任务的执行顺序和流程。

回到顶部