async vs agenda vs bee-queue vs bull vs kue vs p-queue vs queue
작업 및 큐 관리 라이브러리
asyncagendabee-queuebullkuep-queuequeue유사 패키지:

작업 및 큐 관리 라이브러리

작업 및 큐 관리 라이브러리는 Node.js 애플리케이션에서 비동기 작업을 효율적으로 처리하고 관리하는 데 사용됩니다. 이러한 라이브러리는 작업을 큐에 넣고, 작업이 순차적으로 또는 병렬로 처리되도록 하며, 작업 실패 시 재시도 메커니즘을 제공합니다. 또한, 작업의 상태를 추적하고, 작업이 완료되었는지, 실패했는지, 또는 대기 중인지 확인할 수 있는 기능을 제공합니다. 이러한 라이브러리는 특히 대규모 애플리케이션에서 작업을 분산 처리하거나, 백그라운드 작업을 처리하는 데 유용합니다. agenda는 MongoDB를 기반으로 한 작업 스케줄러로, 복잡한 작업 스케줄링과 반복 작업에 적합합니다. async는 비동기 작업을 관리하기 위한 다양한 유틸리티 함수를 제공하는 라이브러리로, 작업 큐 기능도 포함되어 있습니다. bee-queue는 Redis를 기반으로 한 경량 작업 큐로, 빠르고 효율적인 작업 처리를 제공합니다. bull은 Redis를 기반으로 한 강력한 작업 큐 라이브러리로, 작업 재시도, 우선순위 큐, 작업 이벤트 등 다양한 기능을 제공합니다. kue는 Redis를 기반으로 한 작업 큐 라이브러리로, 작업의 상태를 시각화할 수 있는 대시보드를 제공합니다. p-queue는 Promise 기반의 작업 큐 라이브러리로, 작업의 동시 실행 수를 제한할 수 있습니다. queue는 간단한 작업 큐 라이브러리로, 작업을 순차적으로 처리하는 데 적합합니다.

npm 다운로드 트렌드

3 년

GitHub Stars 순위

통계 세부사항

패키지
다운로드
Stars
크기
Issues
발행일
라이선스
async144,719,72028,116808 kB372 年前MIT
agenda09,711301 kB493 個月前MIT
bee-queue04,039107 kB461 年前MIT
bull016,261309 kB1482 年前MIT
kue09,418-2869 年前MIT
p-queue04,304103 kB518 天前MIT
queue077019.6 kB194 年前MIT

기능 비교: async vs agenda vs bee-queue vs bull vs kue vs p-queue vs queue

기반 데이터베이스

  • async:

    async는 특정 데이터베이스에 의존하지 않습니다. 대신, 메모리 내에서 작업을 관리하며, 비동기 함수와 콜백을 사용하여 작업을 처리합니다. 이는 데이터베이스에 대한 의존성이 없는 가벼운 작업 관리에 적합합니다.

  • agenda:

    agenda는 MongoDB를 기반으로 작업을 저장하고 관리합니다. MongoDB의 강력한 쿼리 기능을 활용하여 작업을 스케줄링하고, 작업의 상태를 추적할 수 있습니다. 이는 특히 이미 MongoDB를 사용하고 있는 애플리케이션에 자연스럽게 통합될 수 있습니다.

  • bee-queue:

    bee-queue는 Redis를 기반으로 작업을 큐에 넣고 관리합니다. Redis의 빠른 인메모리 데이터 구조를 활용하여 작업을 효율적으로 처리하며, 작업의 상태를 실시간으로 추적할 수 있습니다.

  • bull:

    bull은 Redis를 기반으로 한 작업 큐 라이브러리로, 작업 재시도, 우선순위 큐, 작업 이벤트 등 다양한 기능을 제공합니다. Redis의 인메모리 특성을 활용하여 빠르고 신뢰성 있는 작업 처리를 보장합니다.

  • kue:

    kue는 Redis를 기반으로 작업을 큐에 넣고 관리합니다. Redis의 인메모리 데이터 구조를 활용하여 작업의 상태를 실시간으로 추적하고, 작업이 완료되었는지, 실패했는지 등을 확인할 수 있습니다.

  • p-queue:

    p-queue는 특정 데이터베이스에 의존하지 않고, 메모리 내에서 작업을 관리합니다. Promise 기반으로 작업을 처리하며, 동시 실행 수를 제한하는 기능을 제공합니다.

  • queue:

    queue는 데이터베이스에 의존하지 않고, 메모리 내에서 작업을 순차적으로 처리합니다. 간단한 작업 큐 기능을 제공하며, 외부 저장소 없이도 작업을 관리할 수 있습니다.

작업 스케줄링

  • async:

    async는 작업 스케줄링 기능을 직접 제공하지 않지만, 비동기 함수와 콜백을 사용하여 작업을 순차적 또는 병렬로 처리할 수 있습니다. 스케줄링이 필요한 경우, 별도의 스케줄링 라이브러리와 함께 사용해야 합니다.

  • agenda:

    agenda는 작업 스케줄링에 특화된 라이브러리로, 크론 표현식(Cron Expression)을 사용하여 작업을 예약할 수 있습니다. 반복 작업, 지연 작업, 특정 시간에 실행되는 작업 등을 쉽게 설정할 수 있으며, 작업의 우선순위도 관리할 수 있습니다.

  • bee-queue:

    bee-queue는 작업 스케줄링 기능을 기본적으로 제공하지 않지만, 작업을 큐에 넣을 때 지연 시간을 설정할 수 있습니다. 이를 통해 일정 시간 후에 작업이 실행되도록 할 수 있습니다.

  • bull:

    bull은 작업 스케줄링 기능을 내장하고 있어, 지연 작업(Delayed Jobs)과 반복 작업(Recurring Jobs)을 쉽게 설정할 수 있습니다. 크론 표현식을 사용하여 반복 작업을 예약할 수 있으며, 작업의 우선순위도 관리할 수 있습니다.

  • kue:

    kue는 작업 스케줄링 기능이 제한적이며, 지연 작업을 설정할 수 있지만, 반복 작업이나 크론 기반 스케줄링 기능은 제공하지 않습니다. 스케줄링이 필요한 경우, 별도의 라이브러리와 함께 사용해야 합니다.

  • p-queue:

    p-queue는 작업 스케줄링 기능을 제공하지 않지만, 작업의 동시 실행 수를 제한할 수 있습니다. 스케줄링이 필요한 경우, 별도의 스케줄링 라이브러리와 함께 사용해야 합니다.

  • queue:

    queue는 작업 스케줄링 기능을 제공하지 않으며, 작업을 순차적으로 처리하는 데 중점을 둡니다. 지연 작업이나 반복 작업을 설정하려면 추가 구현이 필요합니다.

작업 재시도

  • async:

    async는 작업 재시도 기능을 직접 제공하지 않지만, 재시도 로직을 수동으로 구현할 수 있습니다. 예를 들어, 재시도 횟수를 제한하는 루프를 작성하거나, 재시도 시 지연 시간을 두는 등의 방법을 사용할 수 있습니다.

  • agenda:

    agenda는 작업 실패 시 재시도 기능을 제공합니다. 작업이 실패하면 일정 시간 후에 자동으로 재시도할 수 있으며, 재시도 횟수와 간격을 설정할 수 있습니다. 이는 작업의 신뢰성을 높이고, 일시적인 오류로 인한 작업 실패를 최소화하는 데 도움이 됩니다.

  • bee-queue:

    bee-queue는 작업 재시도 기능을 기본적으로 제공하지 않지만, 작업이 실패했을 때 재시도 로직을 수동으로 구현할 수 있습니다. 작업이 실패하면 다시 큐에 넣는 방식으로 재시도를 처리할 수 있습니다.

  • bull:

    bull은 작업 재시도 기능을 내장하고 있어, 작업이 실패했을 때 자동으로 재시도할 수 있습니다. 재시도 횟수, 재시도 간격, 백오프 전략 등을 설정할 수 있어, 작업의 신뢰성을 높이는 데 유용합니다.

  • kue:

    kue는 작업 재시도 기능을 제공하지 않지만, 작업이 실패했을 때 수동으로 재시도할 수 있습니다. 재시도 로직을 직접 구현해야 하며, 자동 재시도 기능은 포함되어 있지 않습니다.

  • p-queue:

    p-queue는 작업 재시도 기능을 제공하지 않으며, 작업이 실패했을 때 재시도 로직을 수동으로 구현해야 합니다. 재시도 기능이 필요한 경우, 별도의 로직을 추가해야 합니다.

  • queue:

    queue는 작업 재시도 기능을 제공하지 않으며, 작업이 실패했을 때 재시도 로직을 직접 구현해야 합니다. 간단한 작업 큐이기 때문에 재시도 기능은 포함되어 있지 않습니다.

우선순위 큐

  • async:

    async는 우선순위 큐 기능을 제공하지 않지만, 작업을 우선순위에 따라 분류하고 처리하는 로직을 수동으로 구현할 수 있습니다. 예를 들어, 우선순위가 높은 작업을 먼저 처리하는 큐를 별도로 관리할 수 있습니다.

  • agenda:

    agenda는 작업의 우선순위를 설정할 수 있지만, 우선순위 큐 기능이 기본적으로 제공되지는 않습니다. 작업의 우선순위를 수동으로 관리할 수 있으며, 우선순위에 따라 작업을 처리하는 로직을 구현할 수 있습니다.

  • bee-queue:

    bee-queue는 우선순위 큐 기능을 기본적으로 제공하지 않지만, 작업을 우선순위에 따라 분류하고 처리하는 로직을 수동으로 구현할 수 있습니다. 작업의 우선순위를 나타내는 필드를 추가하고, 이를 기반으로 작업을 처리할 수 있습니다.

  • bull:

    bull은 우선순위 큐 기능을 내장하고 있어, 작업에 우선순위를 설정할 수 있습니다. 우선순위가 높은 작업이 먼저 처리되며, 작업의 우선순위를 동적으로 변경할 수도 있습니다. 이는 복잡한 작업 처리 시 우선순위를 효과적으로 관리하는 데 유용합니다.

  • kue:

    kue는 작업에 우선순위를 설정할 수 있으며, 우선순위에 따라 작업이 처리됩니다. 우선순위 큐 기능이 내장되어 있어, 작업의 중요도에 따라 처리 순서를 조정할 수 있습니다.

  • p-queue:

    p-queue는 우선순위 큐 기능을 제공하지 않으며, 작업의 동시 실행 수를 제한하는 데 중점을 둡니다. 우선순위 기반 작업 처리가 필요한 경우, 별도의 로직을 구현해야 합니다.

  • queue:

    queue는 우선순위 큐 기능을 제공하지 않으며, 작업을 순차적으로 처리합니다. 우선순위에 따라 작업을 처리하려면 추가 구현이 필요합니다.

작업 상태 추적

  • async:

    async는 작업 상태 추적 기능을 제공하지 않지만, 작업의 상태를 수동으로 관리할 수 있습니다. 예를 들어, 작업이 시작되었는지, 완료되었는지, 실패했는지 등을 나타내는 변수를 사용하여 상태를 추적할 수 있습니다.

  • agenda:

    agenda는 작업의 상태를 추적할 수 있는 기능을 제공합니다. 작업이 대기 중인지, 실행 중인지, 완료되었는지, 실패했는지 등의 상태를 확인할 수 있으며, MongoDB에 저장된 작업 데이터를 통해 상태를 관리합니다. 이는 작업의 진행 상황을 모니터링하고, 문제가 발생했을 때 신속하게 대응하는 데 도움이 됩니다.

  • bee-queue:

    bee-queue는 작업의 상태를 추적할 수 있는 기능을 제공합니다. 작업이 대기 중인지, 처리 중인지, 완료되었는지, 실패했는지 등의 상태를 실시간으로 확인할 수 있으며, Redis에 저장된 데이터를 통해 상태를 관리합니다.

  • bull:

    bull은 작업의 상태를 실시간으로 추적할 수 있는 기능을 제공합니다. 작업이 대기 중, 진행 중, 완료, 실패 등의 상태를 확인할 수 있으며, 작업의 진행 상황을 모니터링할 수 있는 대시보드도 제공합니다.

  • kue:

    kue는 작업의 상태를 추적할 수 있는 기능을 제공하며, 작업이 대기 중, 진행 중, 완료, 실패 등의 상태를 실시간으로 확인할 수 있습니다. 또한, 작업 상태를 시각화할 수 있는 대시보드를 제공하여, 작업의 진행 상황을 쉽게 모니터링할 수 있습니다.

  • p-queue:

    p-queue는 작업 상태 추적 기능을 제공하지 않으며, 작업이 완료되었는지 여부만 확인할 수 있습니다. 작업의 진행 상태를 자세히 추적하려면 별도의 로직을 구현해야 합니다.

  • queue:

    queue는 작업 상태 추적 기능을 제공하지 않으며, 작업이 완료되었는지 여부만 확인할 수 있습니다. 작업의 상태를 자세히 추적하려면 추가 구현이 필요합니다.

Ease of Use: Code Examples

  • async:

    async를 사용하여 비동기 작업을 순차적으로 처리하는 예제입니다.

    const async = require('async');
    
    // 작업 함수 정의
    const tasks = [
      (callback) => {
        setTimeout(() => {
          console.log('Task 1 완료');
          callback(null, '결과 1');
        }, 1000);
      },
      (callback) => {
        setTimeout(() => {
          console.log('Task 2 완료');
          callback(null, '결과 2');
        }, 500);
      },
      (callback) => {
        setTimeout(() => {
          console.log('Task 3 완료');
          callback(null, '결과 3');
        }, 2000);
      },
    ];
    
    // 작업 순차 실행
    async.series(tasks, (err, results) => {
      if (err) {
        console.error('작업 중 오류 발생:', err);
      } else {
        console.log('모든 작업 완료, 결과:', results);
      }
    });
    
  • agenda:

    agenda를 사용하여 작업을 스케줄링하고 실행하는 예제입니다.

    const { Agenda } = require('agenda');
    const agenda = new Agenda({ db: { address: 'mongodb://localhost/agenda' } });
    
    // 작업 정의
    agenda.define('send email', async (job) => {
      const { to, subject, body } = job.attrs.data;
      // 이메일 전송 로직
      console.log(`Sending email to ${to} with subject ${subject}`);
    });
    
    // 작업 스케줄링
    (async () => {
      await agenda.start();
      await agenda.schedule('in 2 minutes', 'send email', {
        to: '[email protected]',
        subject: 'Hello',
        body: 'This is a test email.',
      });
    })();
    
  • bee-queue:

    bee-queue를 사용하여 작업을 큐에 넣고 처리하는 예제입니다.

    const Queue = require('bee-queue');
    const emailQueue = new Queue('email');
    
    // 작업 처리기 정의
    emailQueue.process(async (job) => {
      const { to, subject, body } = job.data;
      // 이메일 전송 로직
      console.log(`Sending email to ${to} with subject ${subject}`);
      return Promise.resolve();
    });
    
    // 작업 큐에 추가
    const job = emailQueue.createJob({
      to: '[email protected]',
      subject: 'Hello',
      body: 'This is a test email.',
    });
    job.save();
    
  • bull:

    bull을 사용하여 작업을 큐에 넣고 처리하는 예제입니다.

    const Queue = require('bull');
    const emailQueue = new Queue('email');
    
    // 작업 처리기 정의
    emailQueue.process(async (job) => {
      const { to, subject, body } = job.data;
      // 이메일 전송 로직
      console.log(`Sending email to ${to} with subject ${subject}`);
      return Promise.resolve();
    });
    
    // 작업 큐에 추가
    emailQueue.add({
      to: '[email protected]',
      subject: 'Hello',
      body: 'This is a test email.',
    });
    
  • kue:

    kue를 사용하여 작업을 큐에 넣고 처리하는 예제입니다.

    const kue = require('kue');
    const queue = kue.createQueue();
    
    // 작업 처리기 정의
    queue.process('email', (job, done) => {
      const { to, subject, body } = job.data;
      // 이메일 전송 로직
      console.log(`Sending email to ${to} with subject ${subject}`);
      done();
    });
    
    // 작업 큐에 추가
    const job = queue.create('email', {
      to: '[email protected]',
      subject: 'Hello',
      body: 'This is a test email.',
    }).save();
    
  • p-queue:

    p-queue를 사용하여 동시 실행 수를 제한하며 작업을 처리하는 예제입니다.

    const PQueue = require('p-queue');
    const queue = new PQueue({ concurrency: 2 });
    
    // 작업 함수 정의
    const tasks = [
      () => new Promise((resolve) => setTimeout(() => {
        console.log('Task 1 완료');
        resolve('결과 1');
      }, 1000)),
      () => new Promise((resolve) => setTimeout(() => {
        console.log('Task 2 완료');
        resolve('결과 2');
      }, 500)),
      () => new Promise((resolve) => setTimeout(() => {
        console.log('Task 3 완료');
        resolve('결과 3');
      }, 2000)),
    ];
    
    // 작업 큐에 추가
    (async () => {
      for (const task of tasks) {
        queue.add(task);
      }
      await queue.onIdle();
      console.log('모든 작업 완료');
    })();
    
  • queue:

    queue를 사용하여 작업을 순차적으로 처리하는 예제입니다.

    const Queue = require('queue');
    const queue = new Queue();
    
    // 작업 함수 정의
    queue.push((cb) => {
      setTimeout(() => {
        console.log('Task 1 완료');
        cb();
      }, 1000);
    });
    queue.push((cb) => {
      setTimeout(() => {
        console.log('Task 2 완료');
        cb();
      }, 500);
    });
    queue.push((cb) => {
      setTimeout(() => {
        console.log('Task 3 완료');
        cb();
      }, 2000);
    });
    
    // 작업 실행
    queue.start(() => {
      console.log('모든 작업 완료');
    });
    

선택 방법: async vs agenda vs bee-queue vs bull vs kue vs p-queue vs queue

  • async:

    비동기 작업을 관리하는 다양한 유틸리티가 필요하고, 작업 큐 외에도 다양한 비동기 패턴을 구현해야 한다면 async를 선택하세요.

  • agenda:

    복잡한 작업 스케줄링이 필요하고 MongoDB를 이미 사용하고 있다면 agenda를 선택하세요. 반복 작업과 일정 기반 작업에 적합합니다.

  • bee-queue:

    빠르고 경량의 작업 큐가 필요하고, Redis를 사용하여 작업을 처리하고자 한다면 bee-queue를 선택하세요. 간단한 작업 처리에 적합합니다.

  • bull:

    강력한 기능과 확장성이 필요한 작업 큐가 필요하고, Redis를 기반으로 한 다양한 기능(재시도, 우선순위 등)을 활용하고자 한다면 bull을 선택하세요.

  • kue:

    작업 큐와 함께 작업 상태를 시각화할 수 있는 대시보드가 필요하다면 kue를 선택하세요. Redis를 기반으로 합니다.

  • p-queue:

    Promise 기반의 작업 큐가 필요하고, 작업의 동시 실행 수를 제한하고자 한다면 p-queue를 선택하세요. 간단한 동시성 제어에 적합합니다.

  • queue:

    간단한 작업 큐가 필요하고, 복잡한 기능 없이 작업을 순차적으로 처리하고자 한다면 queue를 선택하세요.

async의 README

Async Logo

Github Actions CI status NPM version Coverage Status Join the chat at https://gitter.im/caolan/async jsDelivr Hits

Async is a utility module which provides straight-forward, powerful functions for working with asynchronous JavaScript. Although originally designed for use with Node.js and installable via npm i async, it can also be used directly in the browser. An ESM/MJS version is included in the main async package that should automatically be used with compatible bundlers such as Webpack and Rollup.

A pure ESM version of Async is available as async-es.

For Documentation, visit https://caolan.github.io/async/

For Async v1.5.x documentation, go HERE

// for use with Node-style callbacks...
var async = require("async");

var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
var configs = {};

async.forEachOf(obj, (value, key, callback) => {
    fs.readFile(__dirname + value, "utf8", (err, data) => {
        if (err) return callback(err);
        try {
            configs[key] = JSON.parse(data);
        } catch (e) {
            return callback(e);
        }
        callback();
    });
}, err => {
    if (err) console.error(err.message);
    // configs is now a map of JSON data
    doSomethingWith(configs);
});
var async = require("async");

// ...or ES2017 async functions
async.mapLimit(urls, 5, async function(url) {
    const response = await fetch(url)
    return response.body
}, (err, results) => {
    if (err) throw err
    // results is now an array of the response bodies
    console.log(results)
})