Mục lục
- Mục tiêu bài học
- Năm candidate cho job queue
- Redis Streams
- Kafka
- RabbitMQ
- BullMQ
- AWS SQS
- Bảng so sánh đầy đủ
- Operational complexity ranking
- Polyglot consideration
- Cost comparison
- Decision framework theo use case
- Khi nào tránh Redis cho queue
- Khi nào Redis Streams đủ
- Migration path
- Anti-pattern
- Recommendation theo team size
- Bài tập
Mục tiêu bài học
- Nắm được đặc điểm kỹ thuật của từng candidate: Redis Streams, Kafka, RabbitMQ, BullMQ, SQS.
- Đọc được bảng so sánh throughput, latency, persistence, retention, routing, ops complexity.
- Áp dụng decision framework để chọn đúng tool theo use case.
- Biết khi nào Redis Streams là đủ và khi nào cần migrate sang tool khác.
- Hiểu pattern queue abstraction layer để swap backend ít đau hơn.
Năm candidate cho job queue
Thị trường có khá nhiều lựa chọn cho async processing và event streaming. Năm candidate được đề cập thường xuyên nhất trong production system:
- Redis Streams: in-memory log với consumer group, ACK, replay. Tích hợp sẵn trong Redis server.
- Kafka: distributed log dựa trên disk, partition, retention lâu dài. Thiết kế cho event streaming quy mô lớn.
- RabbitMQ: AMQP broker với exchange, queue, binding. Routing mạnh và protocol chuẩn.
- BullMQ: thư viện Node.js xây trên Redis. High-level job queue với retry, DLQ, delayed jobs, dashboard UI sẵn.
- AWS SQS: managed queue service. Không cần ops, scale tự động, tích hợp AWS ecosystem.
Bài 53 đã giới thiệu delivery semantics và so sánh sơ lược. Bài này đào sâu vào từng candidate với số liệu và trade-off cụ thể.
Redis Streams
Redis Streams (ra mắt Redis 5.0, 2018) là cấu trúc dữ liệu log append-only với consumer group. Module 5 đã dùng Redis Streams cho mọi ví dụ. Phần này tổng hợp lại pros/cons từ góc nhìn so sánh.
Ưu điểm
- Không thêm infra: nếu app đã dùng Redis cho cache/session/lock, Streams dùng cùng instance — không cần thêm service mới.
- Latency cực thấp: in-memory, sub-millisecond read/write trên cùng datacenter.
- Consumer group đầy đủ: XREADGROUP, XACK, PEL, XAUTOCLAIM — đủ để xây reliable queue với at-least-once delivery.
- Replay: đọc lại từ bất kỳ ID nào bằng XRANGE. Đơn giản hơn Kafka offset nhưng vẫn đủ cho nhiều use case.
- Setup đơn giản: một Redis instance là chạy được.
Nhược điểm
- Retention hạn chế bởi memory: mọi stream đều nằm trong RAM. Retention dài ngày cần MAXLEN hoặc sẽ tốn bộ nhớ đắt tiền.
- Throughput vừa: benchmark thực tế trên single node đạt ~100k–300k msg/s tùy payload size và cấu hình. Đủ cho nhiều app nhưng không đủ cho event streaming triệu msg/s.
- Không có partition tự động: một stream là một key, không tự shard. Cluster mode cần hash tag (
{stream}:0,{stream}:1) và quản lý thủ công. - Single node bottleneck: không có replica cho write trong standard config.
Use case phù hợp
App đã có Redis, cần queue đơn giản nhưng reliable: email worker, notification, image processing, order async. Throughput dưới 100k msg/s, retention vài giờ đến vài ngày.
Kafka
Apache Kafka (open source, 2011, Confluent thương mại hóa) là distributed log lưu trên disk với partition. Thiết kế cho event streaming quy mô lớn — không phải cho job queue thông thường.
Ưu điểm
- Throughput rất cao: benchmark của Confluent và LinkedIn đạt vài triệu message/s trên cluster nhiều broker. Partition tự động scale ngang.
- Retention lâu dài: disk-based log, có thể giữ event 7 ngày, 30 ngày, thậm chí vô hạn (compact topic). Phù hợp audit log và compliance.
- Replay mạnh: consumer tự quản lý offset. Rewind về bất kỳ thời điểm nào, replay toàn bộ history.
- Ordering per partition: message trong cùng partition có ordering đảm bảo.
- Ecosystem rộng: Kafka Connect (ingest từ DB, S3, Elasticsearch), Kafka Streams (stream processing), ksqlDB, Schema Registry.
Nhược điểm
- Setup phức tạp: cần ít nhất 3 broker cho production HA. Trước Kafka 3.3 cần Zookeeper riêng. Sau 3.3 dùng KRaft mode (built-in raft) nhưng vẫn cần hiểu partition leadership, ISR, replication factor.
- Heavy về ops: broker tuning (heap, page cache, segment size), partition rebalance, consumer lag monitoring, disk capacity planning.
- Latency cao hơn Redis: end-to-end latency typical là 10–50ms (flush interval, batch size, replication). Không phù hợp use case cần sub-ms.
- Không phải job queue: không có built-in retry, DLQ, delay. Phải tự xây hoặc dùng framework thêm.
Use case phù hợp
Event streaming quy mô lớn: clickstream, log aggregation, audit trail, CDC (Change Data Capture từ database), multi-consumer fan-out với consumer độc lập nhau.
RabbitMQ
RabbitMQ (Erlang, open source, 2007) là AMQP broker — model publish/subscribe với exchange, queue, binding. Routing là điểm mạnh chính.
Ưu điểm
- Routing phức tạp: bốn loại exchange —
direct(route theo exact key),topic(route theo patternorder.*.created),fanout(broadcast tất cả queue),headers(route theo header metadata). Không có candidate nào khác linh hoạt bằng ở đây. - AMQP protocol chuẩn: client tồn tại cho hầu hết ngôn ngữ — Java, Python, Go, Node.js, .NET, PHP. Polyglot team dùng được dễ.
- Quản lý queue chi tiết: TTL per message, per queue, dead letter exchange (DLX), priority queue built-in.
- Plugin ecosystem: delayed message plugin (schedule message), federation (replication across DC), shovel (move message giữa cluster).
Nhược điểm
- Throughput thấp hơn Redis và Kafka: benchmark typical 20k–50k msg/s per node. Có thể scale ngang nhưng complex hơn.
- Setup trung bình: cần cluster 3 node cho HA. Classic mirroring (deprecated) có quirk khi failover; Quorum queue (từ 3.8) ổn hơn nhưng cần hiểu.
- Message không replay được: sau khi consumer ACK, message bị xóa. Không có offset để rewind.
- Memory pressure: queue lớn chưa được consume có thể pressure memory, trigger disk paging chậm.
Use case phù hợp
Routing phức tạp: multi-tenant notification (mỗi tenant route đến queue riêng), workflow engine (các bước theo pattern), polyglot backend cần AMQP standard.
BullMQ
BullMQ (Node.js, TypeScript, v1.0 ra mắt 2021 — kế thừa Bull) là thư viện job queue xây trên Redis. Nó không thay thế Redis mà là abstraction layer cung cấp API cấp cao hơn.
Ưu điểm
- Job queue ready-to-use: retry với exponential backoff, DLQ (failed jobs), delayed jobs, repeatable jobs (cron-like), job progress tracking — tất cả đã có sẵn.
- Dashboard UI: Bull Board (hoặc Taskforce) là web UI xem queue state, failed jobs, retry thủ công — không cần tự viết.
- TypeScript native: type-safe, DX tốt trong Node.js/TypeScript project.
- Tận dụng Redis sẵn: nếu đã có Redis, BullMQ không cần thêm infra.
- Concurrency control: giới hạn số job chạy đồng thời, rate limiting per worker.
Nhược điểm
- Node.js only: BullMQ không có client chính thức cho Python, Go, Java. Worker phải là Node.js.
- Phụ thuộc hoàn toàn vào Redis: mọi giới hạn của Redis (memory, retention, throughput) đều áp dụng cho BullMQ.
- Overhead so với raw Redis Streams: BullMQ dùng nhiều key Redis cho mỗi job (job data, job state, delay sorted set, v.v.) — tốn memory hơn raw Streams nếu job volume lớn.
- Version compatibility: BullMQ yêu cầu Redis 7.x cho một số tính năng mới (BullMQ v5+). Cần kiểm tra compatibility matrix.
Use case phù hợp
Node.js app cần job queue đầy đủ tính năng mà không muốn tự build: background jobs, email sender, report generator, scheduled tasks.
AWS SQS
Amazon Simple Queue Service (managed, ra mắt 2006) là queue service fully managed. Hai loại: Standard Queue (at-least-once, best-effort ordering) và FIFO Queue (exactly-once, strict ordering, giới hạn 3k msg/s với batching).
Ưu điểm
- Zero ops: không có server nào để manage, patch, monitor disk. AWS handle scaling, HA, durability.
- Scale tự động: Standard Queue không có hard throughput limit theo documentation chính thức.
- Tích hợp AWS ecosystem: trigger Lambda function, SNS fan-out vào nhiều SQS, CloudWatch metrics, EventBridge.
- DLQ built-in: cấu hình
maxReceiveCountvà dead letter queue trong 5 phút qua console hoặc IaC. - Long polling: giảm cost bằng cách chờ đến 20s thay vì poll liên tục.
Nhược điểm
- Vendor lock-in AWS: migrate sang non-AWS sau này tốn công refactor client code.
- Cost per message: $0.40 / triệu request (Standard). Với hệ thống xử lý vài trăm triệu msg/tháng, cost nhân lên đáng kể.
- Latency cao hơn: round-trip qua HTTPS đến AWS endpoint, typical 10–100ms. Không phù hợp use case cần sub-ms.
- Retention tối đa 14 ngày: message trong SQS bị xóa sau 14 ngày dù chưa được consume.
- Không có replay: message sau khi ACK là mất. Standard Queue không đảm bảo ordering.
- Message size giới hạn: tối đa 256KB per message. Payload lớn hơn cần S3 + pointer.
Use case phù hợp
AWS-native app, team không muốn ops queue infrastructure, serverless workload với Lambda consumer, event-driven architecture trong AWS ecosystem.
Bảng so sánh đầy đủ
| Tiêu chí | Redis Streams | Kafka | RabbitMQ | BullMQ | SQS |
|---|---|---|---|---|---|
| Throughput | Cao (~100–300k/s) | Rất cao (vài triệu/s) | Trung bình (~20–50k/s) | Cao (Redis-bound) | Cao (Standard) |
| Latency | < 1ms | 10–50ms | 1–10ms | < 1ms | 10–100ms |
| Persistence | RDB / AOF | Disk log | Disk | Redis-bound | Managed (durable) |
| Retention | Memory-limited | Lâu dài (cấu hình) | Trung bình | Memory-limited | Tối đa 14 ngày |
| Replay | Có (XRANGE) | Mạnh (offset) | Không (sau ACK mất) | Có (failed jobs) | Không (sau ACK mất) |
| Consumer group | Có | Có | Có | Có | Có |
| Routing | Đơn giản (theo key) | Theo topic/partition | Phức tạp (exchange) | Đơn giản (theo queue name) | Đơn giản |
| Partition | Manual (hash tag) | Tự động | Manual | N/A | Tự động (Standard) |
| Ops complexity | Thấp | Cao | Trung bình | Thấp | None (managed) |
| Cost model | VM / server | VM / cluster | VM / server | VM (Redis-based) | Per message ($0.40/triệu) |
Operational complexity ranking
Một yếu tố thường bị underestimate là chi phí ops dài hạn, không phải chỉ lúc setup:
- SQS: 0 ops. Không cần monitor server, plan capacity, patch, handle failover. AWS SLA là 99.9%.
- Redis Streams: thấp. Nếu đã có Redis cho cache/session, không thêm gì. Monitor memory, backup RDB/AOF là đủ.
- BullMQ: thấp (Redis-based). Cộng thêm một chút overhead theo dõi failed jobs qua dashboard.
- RabbitMQ: trung bình. Cluster 3 node, Quorum queue configuration, monitor memory, erlang VM tuning.
- Kafka: cao. Broker cluster, partition leadership, ISR monitoring, consumer lag, disk capacity, KRaft hoặc Zookeeper (legacy). Cần người có kinh nghiệm Kafka để operate ổn định.
Với team nhỏ không có dedicated infrastructure engineer, Kafka self-host trong production là gánh nặng ops đáng kể.
Polyglot consideration
Nếu codebase dùng nhiều ngôn ngữ, client quality của từng candidate là yếu tố quan trọng:
| Candidate | Ngôn ngữ có client tốt | Ghi chú |
|---|---|---|
| Redis Streams | Mọi ngôn ngữ (ioredis, redis-py, go-redis, Jedis, StackExchange.Redis) | Redis client đều support Streams API |
| Kafka | Java/Scala tốt nhất; Go (confluent-kafka-go, sarama), Python (confluent-kafka-python), Node.js (kafkajs) | Non-JVM client đôi khi lag behind về feature mới |
| RabbitMQ | Mọi ngôn ngữ có AMQP client (pika Python, amqplib Node.js, amqp Go, RabbitMQ.Client .NET) | AMQP 0-9-1 là protocol chuẩn, client thành thục |
| BullMQ | Node.js / TypeScript only | Python worker không dùng được BullMQ API trực tiếp |
| SQS | AWS SDK mọi ngôn ngữ (boto3 Python, @aws-sdk/client-sqs Node.js, aws-sdk Go) | SDK official, maintained bởi AWS |
Nếu team có cả Node.js và Python worker: Redis Streams hoặc RabbitMQ là lựa chọn hợp lý hơn BullMQ.
Cost comparison
Ước tính rough cho workload 1 triệu message/ngày (~12 msg/s trung bình):
| Candidate | Cost model | Ước tính rough |
|---|---|---|
| Redis Streams | VM cost | $50–500/tháng tùy RAM và HA. Nếu đã có Redis: $0 thêm. |
| BullMQ | VM cost (dùng Redis) | Tương tự Redis. Nếu dùng chung instance: $0 thêm. |
| Kafka (self-host) | VM cluster cost | 3 broker × $100–300 = $300–900/tháng + ops time. |
| Kafka (Confluent Cloud / AWS MSK) | Managed + storage | $200–1000+/tháng tùy throughput và retention. |
| SQS Standard | Per message | 1 triệu msg/ngày × 30 ngày = 30 triệu msg/tháng × $0.40/triệu ≈ $12/tháng. Scale tuyến tính. |
| SQS FIFO | Per message | $0.50 / triệu request (~25% đắt hơn Standard). |
| RabbitMQ (self-host) | VM cost | 3 node × $50–200 = $150–600/tháng. |
SQS có cost thấp ở quy mô nhỏ nhưng scale tuyến tính theo volume. Với workload tỷ msg/tháng, self-host Redis hoặc Kafka rẻ hơn đáng kể.
Decision framework theo use case
Không có "best tool" tuyệt đối. Quyết định dựa trên constraint thực tế của team và hệ thống:
Đã dùng Redis + queue đơn giản, reliable
Dùng Redis Streams. Không cần thêm infra, latency thấp, consumer group đủ dùng, DLQ tự xây như Module 5 đã làm.
Node.js app + cần job queue ready-to-use
Dùng BullMQ. Retry, DLQ, delayed jobs, UI dashboard đều có sẵn. Không cần tự implement.
Event streaming khổng lồ (logs, audit, analytics, CDC)
Dùng Kafka. Throughput triệu msg/s, retention dài ngày, replay offset, ecosystem rộng. Nhưng cần sẵn sàng đầu tư ops hoặc dùng managed (Confluent Cloud, MSK).
Routing phức tạp (multi-tenant, multi-route, fan-out theo pattern)
Dùng RabbitMQ. Exchange types linh hoạt, AMQP standard, polyglot support.
AWS-native + không muốn ops
Dùng SQS. Zero ops, tích hợp Lambda/SNS/EventBridge, DLQ có sẵn.
Polyglot team, cần queue chuẩn nhiều ngôn ngữ, không lock-in cloud
Dùng RabbitMQ (AMQP standard) hoặc Redis Streams (client tốt mọi ngôn ngữ).
Khi nào tránh Redis cho queue
Redis Streams không phải lựa chọn đúng khi:
- Cần retention nhiều ngày / tuần / tháng: memory là tài nguyên đắt tiền. Giữ event trong Redis quá 1–2 ngày thường không hợp lý về chi phí. Kafka với disk storage phù hợp hơn nhiều.
- Event streaming triệu msg/s liên tục: Redis single-node đạt ~300k/s trong điều kiện tốt. Scale bằng cluster cần quản lý hash tag thủ công. Kafka partition model scale tốt hơn nhiều cho workload này.
- Routing phức tạp: Redis Streams không có exchange. Routing theo pattern hoặc headers cần implement thủ công. RabbitMQ giải quyết điều này out-of-the-box.
- Audit log compliance dài hạn: các hệ thống cần lưu event cho regulatory audit (tài chính, y tế) thường cần retention 1–7 năm. Redis không phải công cụ phù hợp cho yêu cầu này.
Khi nào Redis Streams đủ
Redis Streams là lựa chọn hợp lý khi thỏa mãn đủ các điều kiện sau:
- Backend đã có Redis instance (cache, session, lock).
- Use case là job queue hoặc async task processing, không phải event streaming analytics.
- Throughput dưới 100k msg/s trong điều kiện bình thường.
- Retention yêu cầu vài giờ đến vài ngày — không phải tuần hoặc tháng.
- Cần consumer group, ACK, DLQ nhưng không cần routing phức tạp.
- Team nhỏ muốn đơn giản hóa infrastructure.
Số lượng hệ thống production thỏa mãn điều kiện trên là khá lớn. Over-engineering sang Kafka khi Redis Streams đã đủ là lãng phí ops và complexity.
Migration path
Khi bắt đầu, thường không biết hệ thống sẽ scale đến đâu. Pattern khuyến nghị:
Bước 1: Start với Redis Streams
Setup đơn giản, cost thấp, đủ tính năng cho hầu hết use case ban đầu.
Bước 2: Monitor backlog và throughput
Theo dõi XLEN stream:main (backlog) và consumer lag. Nếu backlog tăng liên tục hoặc throughput tiệm cận giới hạn Redis:
# Monitor consumer lag đơn giản
redis-cli XINFO GROUPS stream:orders
# Output quan trọng:
# "pel-count" → số message đang pending trong PEL
# "lag" → (Redis 7.0+) số message chưa được giao cho consumer group nào
# Hoặc bằng Python:
groups = r.xinfo_groups("stream:orders")
for g in groups:
print(g["name"], "lag:", g.get("lag", "N/A"), "pel:", g["pel-count"])
Bước 3: Migrate khi cần
- Throughput vượt Redis hoặc cần retention dài → migrate sang Kafka.
- Chuyển sang AWS và không muốn ops → migrate sang SQS.
- Node.js team muốn high-level API → thêm BullMQ trên Redis sẵn.
Pattern: queue abstraction layer
Để migration ít đau hơn, giữ queue interface trừu tượng trong code thay vì gọi Redis client trực tiếp ở khắp nơi:
# Python — abstract queue interface
from abc import ABC, abstractmethod
from typing import Any
class QueueBackend(ABC):
@abstractmethod
def enqueue(self, queue: str, payload: dict) -> str:
"""Gửi message vào queue, trả về message ID."""
...
@abstractmethod
def consume(self, queue: str, group: str, consumer: str, count: int) -> list[tuple[str, dict]]:
"""Nhận tối đa count message. Trả về [(msg_id, fields), ...]."""
...
@abstractmethod
def ack(self, queue: str, group: str, msg_id: str) -> None:
"""Xác nhận message đã xử lý xong."""
...
class RedisStreamsBackend(QueueBackend):
def __init__(self, redis_client):
self.r = redis_client
def enqueue(self, queue: str, payload: dict) -> str:
return self.r.xadd(queue, payload)
def consume(self, queue: str, group: str, consumer: str, count: int):
entries = self.r.xreadgroup(group, consumer, {queue: ">"}, count=count, block=2000)
if not entries:
return []
return entries[0][1] # [(msg_id, fields), ...]
def ack(self, queue: str, group: str, msg_id: str) -> None:
self.r.xack(queue, group, msg_id)
# Khi cần swap sang SQS: implement SQSBackend(QueueBackend)
# Worker code dùng QueueBackend — không đổi gì ngoài backend instance.
Pattern này không loại bỏ hoàn toàn migration effort (semantic khác nhau giữa các backend), nhưng giảm số điểm cần sửa trong codebase.
Anti-pattern
Dùng Kafka cho simple job queue
Kafka không có built-in retry, delayed job, priority. Tự xây những thứ này trên Kafka tốn công đáng kể. Nếu chỉ cần "gửi email sau 5 phút", Redis Streams + BullMQ hoặc RabbitMQ delayed message plugin đơn giản hơn nhiều.
Dùng Redis Streams cho event streaming triệu msg/s
Redis single-node không thiết kế cho workload này. Dùng Kafka — đó là lý do Kafka tồn tại.
Dùng SQS khi cần latency < 10ms
HTTP round-trip đến AWS endpoint có độ trễ tối thiểu vài chục ms. Nếu job processing cần sub-10ms response time, SQS không phải lựa chọn phù hợp.
Mix nhiều broker không có lý do
Một số hệ thống dùng đồng thời Redis + Kafka + RabbitMQ mà không có ranh giới rõ ràng. Kết quả là ops nightmare: ba hệ thống cần monitor, debug, backup. Chọn ít nhất có thể, chỉ thêm khi use case thực sự yêu cầu.
Không có queue abstraction
Gọi Redis client trực tiếp ở 50 chỗ trong codebase. Khi cần migrate, phải sửa 50 chỗ, mỗi chỗ có thể có logic khác nhau. Abstraction layer giúp đổi backend ở một nơi.
Recommendation theo team size
Không có quy tắc cứng — đây là recommendation dựa trên pattern phổ biến:
Startup (< 10 kỹ sư)
Redis Streams + DB cho hầu hết async task. Nếu Node.js: BullMQ. Tránh Kafka trừ khi use case rõ ràng yêu cầu (ví dụ: product là analytics platform cần event streaming từ đầu).
Lý do: ops bandwidth hạn chế. Kafka cluster cần người maintain — không phải ưu tiên khi còn đang build product-market fit.
Mid-size (10–100 kỹ sư)
Redis Streams hoặc RabbitMQ cho job queue. Kafka cho event streaming nếu thực sự có use case (log aggregation, analytics, multi-consumer fan-out). Có thể cân nhắc managed Kafka (Confluent Cloud, MSK) để giảm ops burden.
Large (100+ kỹ sư)
Kafka cho event streaming và audit log. Redis cho cache, job queue nhỏ, real-time use case cần low latency. RabbitMQ optional cho routing phức tạp trong một số domain. Dedicated infrastructure team để maintain.
Ở quy mô này, không hiếm khi dùng cả ba — nhưng mỗi tool có role rõ ràng, không overlap.
Bài tập
- Một e-commerce platform cần: (a) gửi email xác nhận đơn hàng trong vài giây, (b) đồng bộ inventory sang warehouse system với 500k update/ngày, (c) audit log mọi payment event lưu 1 năm. Đề xuất candidate cho từng use case, giải thích lý do.
- Team đang dùng Redis Streams với throughput hiện tại 20k msg/s peak. Metrics cho thấy backlog tăng liên tục vào giờ cao điểm, consumer lag lên đến 50k message. Đề xuất các bước xử lý trước khi quyết định migrate sang Kafka.
- BullMQ và raw Redis Streams đều dùng Redis. Khi nào nên chọn BullMQ thay vì tự implement với raw Streams? Khi nào raw Streams phù hợp hơn BullMQ?
- Với workload 500 triệu message/tháng, tính cost ước tính cho SQS Standard so với tự host Redis (giả sử cần VM $150/tháng). Từ volume nào thì self-host rẻ hơn SQS?
Đáp án gợi ý
-
- (a) Email xác nhận: Redis Streams hoặc BullMQ — latency thấp, đơn giản, delay vài giây là đủ, không cần retention lâu.
- (b) Inventory sync 500k/ngày ≈ 6 msg/s: vẫn trong tầm Redis Streams. Nếu muốn đảm bảo ordering per SKU và có replay dễ, Kafka là lựa chọn tốt hơn và hợp lý khi có volume tăng trưởng.
- (c) Payment audit log 1 năm: Kafka (disk retention, replay, compliance). Redis không giữ được 1 năm event trong bộ nhớ hợp lý.
- Trước khi migrate Kafka: (1) kiểm tra số consumer — tăng horizontal workers có thể giảm lag; (2) kiểm tra processing time per message — nếu slow, vấn đề ở worker logic chứ không phải queue; (3) check Redis memory — nếu gần full, MAXLEN có thể đang drop message; (4) profile bottleneck. Migrate Kafka chỉ nên là bước sau khi các cách trên không đủ.
- Chọn BullMQ khi: team Node.js, cần dashboard UI, cần delay/repeat/priority built-in, không muốn implement và maintain retry/DLQ logic. Chọn raw Streams khi: polyglot (Python worker cần consume), cần kiểm soát tốt hơn về memory layout, đã có infrastructure team quen Redis, BullMQ overhead key Redis là vấn đề với volume lớn.
- SQS: 500 triệu msg/tháng × $0.40/triệu = $200/tháng. Self-host Redis: $150/tháng. Break-even ở khoảng 375 triệu msg/tháng ($150 / $0.40 × 1 triệu). Từ ~375 triệu msg/tháng trở lên thì self-host rẻ hơn — nhưng cần cộng thêm ops time vào phép tính thực tế.
Bài tiếp theo
Bài 64: Checklist & Anti-patterns Queue — tổng hợp các lỗi thường gặp trong Module 5, incident PEL leak thực tế, và checklist trước khi deploy queue system.
