TopDev AI Robot TopDev
#Backend & Microservices#DevOps & Cloud

Quản lý Background Job bằng BullMQ & Redis: Cách tránh cạn kiệt bộ nhớ (OOM)

Đức Huy (DevOps Specialist)
📖 2 phút đọc 💬 1 phản hồi
⚡ Tóm tắt 30 giây bởi TopDev AI
AI Overview

Bài toán xử lý tác vụ ngầm trong hệ thống Node.js Khi ứng dụng cần gửi hàng ngàn email, nén video hoặc đồng bộ hóa dữ liệu sang bên thứ ba, chúng ta không thể thực thi trực tiếp trong request HTTP vì…

☰ Mục lục bài viết (5 phần) Mở / Đóng mục lục

Bài toán xử lý tác vụ ngầm trong hệ thống Node.js#

Khi ứng dụng cần gửi hàng ngàn email, nén video hoặc đồng bộ hóa dữ liệu sang bên thứ ba, chúng ta không thể thực thi trực tiếp trong request HTTP vì sẽ làm treo server.

BullMQ (dựa trên Redis) là thư viện hàng đợi (Message Queue) được sử dụng phổ biến nhất trong hệ sinh thái Node.js/TypeScript nhờ độ tin cậy và tốc độ cao. Tuy nhiên nếu cấu hình không chuẩn, Redis của bạn sẽ nhanh chóng bị tràn RAM (Out Of Memory - OOM) sau vài ngày hoạt động.

Nguyên nhân số 1 gây tràn RAM trong BullMQ#

Mặc định, sau khi một job hoàn thành (completed) hoặc bị lỗi (failed), BullMQ sẽ lưu trữ toàn bộ dữ liệu payload và kết quả của job đó trong Redis để phục vụ việc xem lại lịch sử.

Nếu hệ thống xử lý 500.000 jobs mỗi ngày, mỗi job nặng 5KB, chỉ sau 1 tuần Redis sẽ ngốn thêm hàng chục GB bộ nhớ và sập hoàn toàn.

Cấu hình tự động dọn dẹp (Job Retention) chuẩn chỉ#

Luôn khai báo tùy chọn removeOnComplete và removeOnFail khi khởi tạo Worker hoặc thêm Job:

TYPESCRIPT
import { Queue, Worker } from 'bullmq';

const connection = { host: 'localhost', port: 6379 };

export const emailQueue = new Queue('email_notifications', {
  connection,
  defaultJobOptions: {
    attempts: 3,
    backoff: {
      type: 'exponential',
      delay: 2000, // Thử lại sau 2s, 4s, 8s nếu lỗi
    },
    // GIẢI PHÁP CHỐNG TRÀN BỘ NHỚ:
    removeOnComplete: {
      age: 3600 * 24, // Tự xóa sau 24 giờ
      count: 1000,    // Hoặc chỉ giữ tối đa 1.000 job gần nhất
    },
    removeOnFail: {
      age: 3600 * 24 * 7, // Giữ job lỗi trong 7 ngày để dev điều tra
      count: 5000,
    }
  }
});

3 nguyên tắc sống còn khi vận hành BullMQ#

  1. Không nhét File Binary hoặc Payload khổng lồ vào Job Data: Chỉ gửi ID (ví dụ: orderId: 12345), sau đó Worker sẽ tự query database hoặc đọc từ S3.
  2. Cấu hình maxmemory-policy trên Redis: Đặt thành noeviction hoặc volatile-lru để tránh trường hợp Redis tự động xóa nhầm các key quan trọng của queue khi hết RAM.
  3. Giám sát Dead Letter Queue: Thường xuyên kiểm tra danh sách các job bị fail vĩnh viễn để fix bug logic trong code của worker.

Góc thảo luận#

Team bạn đang dùng giải pháp nào cho background processing? BullMQ, RabbitMQ, Kafka hay AWS SQS?


Xem thêm nội dung liên quan:

Chia sẻ thảo luận này:

Thảo luận

1 phản hồi

Ý kiến từ cộng đồng kỹ sư TopDev
💬

Tham gia thảo luận

Cộng đồng mở · Đăng nhập 1-chạm qua Google
  1. Thu Trang (Backend Engineer)
    #1

    Thêm một lưu ý nữa là nên tách riêng instance Redis dành cho BullMQ và instance Redis dành cho Caching. Nếu dùng chung, khi queue phình to nó có thể ảnh hưởng trực tiếp đến tốc độ đọc cache của toàn bộ website.

Bài liên quan trong #Backend & Microservices

1
TopDev AI Companion
AI
✓ Đã sao chép link