database
BullMQ는 Redis를 기반으로 한 강력한 Node.js 작업 큐 라이브러리로, 이메일 전송, 이미지 처리, 데이터 분석과 같은 시간이 오래 걸리는 작업을 비동기적으로 처리하는 데 유용합니다. 이를 통해 서버 부하를 줄이고, 서비스의 응답 속도를 크게 향상시킬 수 있습니다.
BullMQ는 기존 Bull 라이브러리를 개선한 버전으로, TypeScript 지원이 강화되었으며, 성능과 안정성이 더욱 향상되었습니다. 대규모 분산 작업을 효율적으로 처리할 수 있도록 설계되어 있으며, 다양한 기능을 사용할 수 있습니다.
BullMQ는 Redis를 저장소로 사용하기 때문에 Redis가 먼저 설치되어 있어야 합니다. BullMQ는 npm이나 pnpm을 통해 설치가 가능합니다.
pnpm add bullmq ioredis
BullMQ를 이해하려면 다음 세 가지 개념을 알아두어야 합니다.
이제 간단한 예시를 통해 BullMQ를 실제로 어떻게 사용하는지 살펴보겠습니다.
import { Queue } from 'bullmq'
import IORedis from 'ioredis'
const connection = new IORedis()
const emailQueue = new Queue('emailQueue', { connection })
async function addEmailJob() {
await emailQueue.add('sendEmail', { email: 'user@example.com' })
console.log('이메일 작업을 성공적으로 등록했습니다.')
}
addEmailJob()
큐에 등록된 작업은, 이후에 Worker를 통해 실행됩니다.
import { Worker } from 'bullmq'
import IORedis from 'ioredis'
const connection = new IORedis()
const emailWorker = new Worker(
'emailQueue',
async (job) => {
console.log(`작업 처리 중: 작업 ID ${job.id}, 작업 유형 ${job.name}`)
// 이메일 전송 로직을 여기에 구현합니다.
},
{ connection },
)
emailWorker.on('completed', (job) => {
console.log(`${job.id} 작업이 성공적으로 완료되었습니다.`)
})
emailWorker.on('failed', (job, err) => {
console.error(`${job.id} 작업 처리에 실패했습니다. 오류: ${err.message}`)
})
Worker는 Queue에 등록된 작업을 자동으로 가져와 실행하므로, 별도의 작업 실행 요청 없이도 백그라운드에서 지속적으로 실행됩니다.
BullMQ는 작업의 현재 상태를 쉽게 모니터링할 수 있습니다. 작업은 waiting(대기 중), active(실행 중), completed(완료됨), failed(실패함), delayed(지연됨) 등의 상태를 가질 수 있습니다. 각 상태에 따라 적절한 처리를 수행하여 안정적인 작업 관리를 할 수 있습니다.
async function checkJobStatus(jobId) {
const job = await emailQueue.getJob(jobId)
if (job) {
console.log(`작업 ID ${jobId}의 상태: ${await job.getState()}`)
} else {
console.log(`작업 ID ${jobId}를 찾을 수 없습니다.`)
}
}
async function checkJobCounts() {
const counts = await emailQueue.getJobCounts()
console.log('현재 작업 상태:', counts)
}
checkJobCounts()
BullMQ를 활용하면 Node.js 기반 애플리케이션의 성능을 효과적으로 높이고 시스템의 안정성을 향상할 수 있습니다. 비동기 작업을 효율적으로 관리하고, 서버 리소스를 최적화하여 더 나은 서비스를 제공할 수 있습니다.