場景:需從數萬份 PDF(每份約 200 頁)提取特定資料,單檔處理邏輯已跑通,現面臨批量化、高效率、穩定性三大挑戰。
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 任務生產者 │────▶│ 訊息佇列 │◀───▶│ Worker 集群 │
│ (掃描文件 │ │ (Kafka/ │ │ (多台機器, │
│ 產生任務) │ │ RabbitMQ, │ │ 每台多線程)│
└─────────────┘ │ Redis) │ └─────────────┘
└─────────────┘ │
│ ▼
┌─────────────┐ ┌─────────────┐
│ 結果存儲 │◀────│ 監控/重試 │
│ (DB/ES) │ │ (死信佇列) │
└─────────────┘ └─────────────┘
| 層級 | 推薦技術 | 理由 |
|---|---|---|
| 訊息佇列 | Kafka / RabbitMQ / Redis Stream | 持久化、ACK 機制、支援優先級、水平擴展 |
| Worker 框架 | Spring Batch / Quartz / 自定義線程池 | 分塊處理、重試、跳過策略、監控指標 |
| PDF 解析 | PDFBox (Apache) / Apache Tika | 成熟穩定、支援流式讀取降低記憶體 |
| 部署 | Docker + K8s / 多台 VM | 資源隔離、自動擴縮容、滾動更新 |
PDFTextStripper.setSortByPosition(true) + 分頁處理,避免全文載入new ThreadPoolExecutor(cores, cores, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100)) 防止任務堆積 OOMfile_id, status, page_progress,支援中斷恢復核心觀點:**「多線程」是戰術手段,「分散式任務佇列」才是戰略架構**。對於「數萬份 200 頁 PDF」這級別,請直接上分散式,避免在單機調優上耗盡工程預算。