B12 · 背景任務與 Queue 詳細 ROADMAP
計畫文件,不會被 Quartz 渲染。
回主 roadmap → backend/ROADMAP.md
章節目標
Queue 是後端從同步走向非同步的轉折。本章涵蓋:Queue 基礎概念、Worker Pool、Job Queue(Celery / BullMQ / Sidekiq)、Scheduled Jobs、Message Broker(Kafka / RabbitMQ / NATS / Redis Streams)、重試 / 死信 / Idempotency。Proto 用 RabbitMQ + EventBus 抽象,素材豐富。
🌱 基本介紹
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 01 | Queue 是什麼 | 01-what-is-queue | 🌱 | 解耦 producer / consumer、削峰填谷、容錯 |
❓ 為什麼需要
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 02 | 為什麼不直接 async / background thread | 02-why-not-just-async | 🌱 | 跨 process / 跨機器、持久化(thread 斷掉工作沒了)、重試、觀察性 |
| 03 | 為什麼 Queue cold start 是陷阱 | ⛔️ micro-service/27-queue-redis-coldstart | 🌿 | 跨系列 |
🕰️ 演進
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 04 | Message Queue 演進 | 04-mq-evolution | 🌱 | ActiveMQ / JMS → RabbitMQ(2007)→ Kafka(2011)→ Redis Streams(2017)→ NATS JetStream |
| 05 | Job Queue 演進 | 05-job-queue-evolution | 🌱 | Resque(Ruby)→ Sidekiq / Celery / BullMQ / Asynq / Inngest / Temporal(workflow 化) |
🧠 知識型
F12-A Queue 基礎
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 06 | Queue 核心概念 | 06-queue-core-concepts | 🌱 | Producer / Consumer / Broker / Topic / Queue / Partition / Consumer Group |
| 07 | Worker Pool 實作 | 07-worker-pool-impl | 🌱 | 從零實作 worker pool(多語言)、back-pressure |
| 08 | Push vs Pull Model | 08-push-vs-pull | 🌱 | RabbitMQ push / Kafka pull;consumer lag 可觀察性 |
F12-B Message Broker
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 09 | RabbitMQ 深入 | 09-rabbitmq-deep | 🌱 | Exchange(direct / topic / fanout / headers)/ Queue / Binding / routing key;proto 實際使用 |
| 10 | Kafka 深入 | 10-kafka-deep | 🌱 | Topic / Partition / Offset / Consumer Group;log-based 心智模型 |
| 11 | NATS / JetStream | 11-nats-jetstream | 🌱 | 輕量 pub/sub、JetStream 加持久化 |
| 12 | Redis Streams | 12-redis-streams | 🌱 | Consumer group、XADD / XREAD / XACK;適合中小規模 |
| 13 | RabbitMQ vs Kafka vs NATS 選型 | 13-broker-selection | 🌱 | 各自強項、migration 難度、運維成本 |
| 14 | Event-driven 基礎 / 陷阱 | ⛔️ micro-service/35-event-driven-basics / 36-event-driven-pitfalls | 🌿 | 跨系列 |
| 15 | Event-driven Queue 實戰 | ⛔️ infra/22-event-driven-queue | 🌿 | 跨系列 |
F12-C Job Queue(應用層)
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 16 | Celery 深入(Python) | 16-celery-deep | 🌱 | Worker / Beat / Flower、broker 選擇(Redis / RabbitMQ)、chain / group / chord |
| 17 | BullMQ 深入(Node.js) | 17-bullmq-deep | 🌱 | Job / Queue / Worker / Scheduler、Redis-based、priority |
| 18 | Sidekiq(Ruby)/ Asynq(Go) | 18-sidekiq-asynq | 🌱 | 各語言生態代表、設計相似度 |
| 19 | Temporal / Inngest(Workflow 化) | 19-workflow-platforms | 🌱 | 狀態機 + queue 合體、multi-step flow、跟傳統 job queue trade-off |
F12-D 可靠性模式
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 20 | 重試策略 | 20-retry-strategy | 🌱 | Exponential backoff、jitter、max retries;什麼時候該放棄 |
| 21 | Dead Letter Queue | 21-dlq | 🌱 | 失敗 N 次後轉 DLQ、人工介入、alert |
| 22 | Idempotency | 22-idempotency-queue | 🌱 | Consumer 重複收到訊息的保護、idempotency key 儲存 |
| 23 | Outbox Pattern | 23-outbox-pattern | 🌱 | DB 交易 + MQ 的一致性;跟 B08 #19 重疊 |
| 24 | At-most-once / At-least-once / Exactly-once | 24-delivery-semantics | 🌱 | 實際意義、Kafka 的 “exactly-once” 是什麼 |
F12-E Scheduled / Cron
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 25 | Scheduled Jobs 設計 | 25-scheduled-jobs | 🌱 | Cron vs Interval、distributed lock 避免重複執行、K8s CronJob |
| 26 | 分散式排程 | 26-distributed-scheduling | 🌱 | Leader election、Temporal / dkron / Airflow |
| 26-2 | Batch Job 極限處理(巨量資料) | 26-2-batch-job-limits | 🌱 | 一天跑 1 億筆結算 / 月報 / 對帳;應用層 batch vs Spark / Flink 邊界;memory / timeout / partial failure recovery;分片 + checkpoint 策略;跟 B14 08-2 / B03 33-2 連動 |
🔧 小實作注意事項
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 27 | 從零實作 Job Queue(Redis-based) | 27-diy-job-queue | 🌱 | 用 Redis 做簡易 job queue、理解 Sidekiq / BullMQ 做什麼 |
| 28 | 設計一個 Event Bus(proto 對照) | 28-design-event-bus | 🌱 | 抽象層讓底層可換;proto messaging/bus.py 案例 |
| 29 | Outbox pattern 實戰 | 29-outbox-impl | 🌱 | DB 交易 + 背景 worker 消費 outbox 送 MQ |
💣 Anti-pattern
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 30 | Queue Anti-patterns | 30-queue-antipatterns | 🌱 | Consumer 沒做 idempotent、DLQ 沒監控(訊息默默堆積)、retry 沒 backoff(雷擊風暴)、把 MQ 當 DB 用(不持久化 + 長 retention)、用 fire-and-forget 但沒監控 lag |
🧰 對應檢查工具
| # | 主題 | Slug | Stage | 大綱 |
|---|
| 31 | Queue 相關工具 | 31-queue-tooling | 🌱 | RabbitMQ Management UI、Kafka UI(AKHQ / Kafdrop)、Flower(Celery)、Bull Board(BullMQ)、queue lag dashboard |
📎 補充
| # | 主題 | Slug | Stage | 大綱 |
|---|
| S01 | Event Sourcing 初探 | s01-event-sourcing | 🌱 | 事件當真相來源、重放建 state;Kafka 天生合適 |
| S02 | CDC(Change Data Capture) | s02-cdc | 🌱 | Debezium、從 DB 抓變更送 Kafka;跟 Outbox 比較 |
| S03 | Email Infra(SendGrid / SES / Resend / Postmark) | s03-email-infra | 🌱 | 選型 / deliverability / bounce 處理 / template 管理;透過 Queue 發送避免阻塞 |
| S04 | Push Notification Infra | s04-push-notification | 🌱 | APNs(iOS)/ FCM(Android)/ Web Push;device token 管理;跟 Queue 整合(批次推送) |
| S05 | Notification Service 設計 | s05-notification-service | 🌱 | 統一 email / SMS / push / in-app 的通知服務;template engine、channel routing、user preference |
| S06 | i18n 後端處理 | s06-backend-i18n | 🌱 | 文字 / 日期 / 貨幣 / 時區;多語 content 儲存(DB column vs 分表);locale 來源(header / user pref / URL) |
章節進度統計
- 知識主題:31 + 2 補充 = 33 項
- 🌿 growing:3(跨系列)
- 🌱 seed:30
跨系列連結
- →
micro-service/27、35–36(cold start、event-driven)
- →
infra/22-event-driven-queue
- →
backend/conventions/ B07 #13–16 messaging
- →
backend/architecture/ B08 #13 #19(Event-driven / Outbox)
- →
backend/observability/ B17(Queue metrics)