Xử lý Tác vụ nền bằng Queue (Hàng đợi)
Trong một hệ thống Backend chuyên nghiệp, có những tác vụ tốn rất nhiều thời gian để xử lý (ví dụ: gửi email xác thực, nén hình ảnh, sinh tệp PDF báo cáo, đồng bộ dữ liệu bên thứ ba). Nếu bạn xử lý các tác vụ này trực tiếp trong luồng nhận HTTP Request, Client sẽ phải đợi phản hồi rất lâu (thậm chí gây treo hệ thống). Queue (Hàng đợi công việc) giúp giải quyết vấn đề này bằng cách đưa các tác vụ nặng vào hàng đợi để xử lý bất đồng bộ (asynchronous) dưới nền, giải phóng luồng chính để phản hồi lập tức cho người dùng. Tài liệu này hướng dẫn cách sử dụng hàng đợi trong NestJS thông qua thư viện Bull (chạy trên nền Redis) và cách ra lệnh cho Claude Code.1. Cơ chế hoạt động của Hàng đợi (Queue)
Hàng đợi hoạt động theo nguyên tắc FIFO (First In - First Out / Vào trước - Ra trước) và chia làm hai vai trò chính:- Producer (Nhà sản xuất): Nơi nhận yêu cầu từ client, đóng gói dữ liệu công việc (Job) và đẩy vào hàng đợi (Queue) rồi trả kết quả “Đã nhận xử lý” ngay cho client.
- Consumer / Processor (Nhà xử lý): Chạy ngầm dưới nền, liên tục lấy các công việc trong hàng đợi ra để xử lý lần lượt.
2. Thiết lập Queue trong NestJS với Bull & Redis
Yêu cầu bắt buộc: Máy tính của bạn phải đang chạy phần mềm Redis làm kho chứa hàng đợi tạm thời.Cài đặt thư viện:
Đăng ký cấu hình kết nối Redis trong app.module.ts:
src/app.module.ts
3. Quy trình Xây dựng Hệ thống Queue gửi Email
Bước A: Đăng ký Queue trong Module tính năng
src/emails/emails.module.ts
Bước B: Đẩy Job vào hàng đợi (Producer)
TrongEmailsService, ta inject hàng đợi đã đăng ký và đẩy công việc mới vào hàng đợi bằng hàm add():
src/emails/emails.service.ts
Bước C: Xử lý công việc ngầm (Consumer / Processor)
Tạo tệpemail.consumer.ts được trang trí bằng @Processor để xử lý các công việc trong hàng đợi email-sending:
src/emails/email.consumer.ts