# 🏗️ Case study: chọn công cụ và thiết kế kiến trúc hàng đợi hoàn chỉnh

> This lesson is part of the paid section. Sign in and purchase the course to view the full content.

## Mục tiêu bài học

- Áp dụng được một khung ra quyết định để chọn BullMQ hay Kafka cho từng workload cụ thể.
- Chọn đúng mô hình: queue cho job nền, topic/partition cho luồng sự kiện.
- Thiết kế được chính sách retry, backoff và dead letter queue (DLQ) có owner và alert.
- Viết được một bản thiết kế hàng đợi hoàn chỉnh và bảo vệ được quyết định trước người review.

## Ôn nhanh

Bài trước kết luận: Kafka đổi lấy khả năng mở rộng và replay bằng chi phí disk, network và tối thiểu 3 broker; BullMQ nhẹ và rẻ ở quy mô nhỏ nhưng chi phí biên xấu dần vì mọi job phải nằm trong Redis. Bài này không lặp lại phần đó, mà dùng chính hai kết luận ấy làm đầu vào cho một quyết định thật.

## Lý thuyết: khung ra quyết định trong 5 câu hỏi

Trước khi mở docs, hãy trả lời 5 câu hỏi sau cho **từng loại workload**, không phải cho cả hệ thống:

1. **Sự kiện này có cần replay không?** (audit, rebuild, consumer mới tham gia sau)
2. **Có bao nhiêu consumer độc lập cùng đọc một luồng?** Một là BullMQ đủ, từ hai trở lên nghiêng về Kafka.
3. **Thứ tự có quan trọng không, và theo key nào?** Thứ tự theo từng thực thể (order, SKU) chứ hiếm khi cần thứ tự toàn cục.
4. **Job có phải việc nền ngắn, cần kết quả trả về hoặc lên lịch (cron, delay) không?** Đây là đất của BullMQ.
5. **Đội có người trực và biết vận hành Kafka không?** Nếu không, đó không phải lựa chọn, đó là quả bom hẹn giờ.

| Dấu hiệu | Chọn BullMQ | Chọn Kafka |
| --- | --- | --- |
| Replay sự kiện cũ | Không | Có |
| Số consumer độc lập | 1 | Nhiều consumer group |
| Lưu trữ | Trong lúc chờ xử lý | Nhiều ngày, phục vụ analytics |
| Độ phức tạp job | Retry, delay, cron, priority | Append-only, đơn giản |
| Vận hành | Redis | 3 broker trở lên, disk, rebalance |

Nguyên tắc thực dụng: **mặc định là BullMQ, chỉ nâng lên Kafka khi có nhu cầu replay hoặc multi-consumer được nêu tên cụ thể.** Nếu bạn không gọi tên được consumer thứ hai, đừng chọn Kafka.
