披薩工廠模擬器
IE & PC Planning 應用於七站式披薩產線:交期估算、批次處理與配方調整,並即時監控 KPI
用真實的 Kafka + RabbitMQ 訊息流驅動一條可觀察的七站式披薩產線:RabbitMQ 負責派工指令,Kafka 記錄每一站發生的事件。排程器依派工規則決定下一張工單,KPI 服務即時計算 throughput、WIP、cycle time,並呈現在 3D 儀表板上。
- 角色
- 個人專案(需求分析、系統設計、開發、測試)
- 使用技術
- PythonKafkaRabbitMQFastAPI + SSEThree.jsDockerIEPC Planning
專案緣起
這是一個個人學習專案,靈感來自一首童謠〈Pizza Party〉及我過去的工作經驗。
融合 IE 的產線指標、PC 的排程派工、Kafka 事件流、RabbitMQ 指令佇列等主題,打造一個能實際跑起來、看得到過程的披薩工廠。
主要功能
所有操作都在同一個儀表板上完成,調整後可以馬上看到產線與 KPI 的變化。
- 下單
- 在儀表板手動下單並設定優先度,也可以讓產生器依到達率自動下單
- 調整機台 Recipe
- 調整各站對不同品項的 recipe,觀察瓶頸與 KPI 隨之改變
- 即時計算 ETA
- 依瓶頸產能與排隊中的 WIP 估算每張訂單的完成時間與交期
- KPI 趨勢圖
- throughput、WIP、cycle time 隨時間變化,方便比較調整前後的差異
- Lot Handling
- 追蹤每個 lot 所在的站點與狀態,處理機台故障造成的重工
- 機台 Performance
- 各站使用率與處理狀況一目了然,並標示目前的瓶頸站
訊息分工:指令 vs 事實
整個系統只有一條規則:RabbitMQ 傳指令,Kafka 傳事實。指令有明確的接收者,做完要回報;事實只描述已發生的事,誰都可以讀,也可以重播。
RabbitMQ
指令(請你去做)
- >工單進入 workorders.intake,排程器再派工到各站的 station.<id>.jobs
- >每站 prefetch 1,一次只處理一張,處理完才 ack
- >失敗進入 TTL 5 秒的 retry queue,超過次數或格式錯誤則進 DLQ
Kafka
事實(已經發生)
- >站點寫入 op_started / op_completed 到 station.events,以站名分區
- >訂單生命週期寫入 order.lifecycle,KPI 快照寫入 compact topic
- >排程器、KPI、儀表板各自用獨立的 consumer group 讀同一份事件
一張訂單的流程
- 01
下單
產生器依到達率自動下單,或在儀表板手動下單,工單送進 RabbitMQ。
- 02
投料
排程器記錄 created 事件,估算 ETA 與交期後,依派工規則決定投料順序。
- 03
派工
排程器把工作派到下一站的 jobs queue,七站依序是擀麵團、上醬、起司、配料、烘烤、切片、裝盒。
- 04
加工
站點寫入 op_started,依品項的 cycle time 實際等待,完成後寫入 op_completed 再 ack。
- 05
交接
站與站之間不直接溝通,由排程器讀到 Kafka 的完成事件後,再派下一站。
- 06
監控
KPI 服務從事件折疊出即時指標,經 SSE 推到 3D 儀表板。
可靠性設計
站點和排程器都可能在任何時候被中斷,設計目標是工作不遺失,也不會重複計算。
- 先 Kafka 後 ack
- 完成事件 flush 到 Kafka 後才 ack;中途 crash 會重送,再以 event_id 去重,同一件工作只記一次
- Retry 與 DLQ
- 暫時性失敗走 TTL retry queue 重派,無效訊息直接進 DLQ,不會無限重試
- 機台故障與重工
- 可模擬站點隨機停機與修復;失敗的 lot 進入冷卻佇列再回到排程,不會卡住站點
- 重啟還原
- 排程器重啟時從 Kafka 重播事件,重建在製品與冷卻中 lot 的狀態
- Chaos 測試
- 以腳本在運行中隨機砍掉容器,驗證產線能自行恢復
排程與 KPI
三種披薩品項在各站的加工時間不同,讓派工規則之間有實際差異可以比較;烘烤站每片 12 到 14 秒,其他站 3 到 6 秒,是刻意設計的瓶頸。
- 派工規則
- FIFO、EDD、SPT 可即時切換,同一組訂單能比較不同規則的 KPI
- 優先度與交期
- 工單有 1 到 99 的優先度;投料時依瓶頸與排隊 WIP 估算 ETA,並推算交期
- 即時 KPI
- throughput、WIP、cycle time(平均、p50、p95)與各站使用率
- 瓶頸判定
- 以使用率搭配遲滯(hysteresis)判定瓶頸站,避免在兩站之間來回跳動
- 理論值對照
- 排除暖機期後,以 Little's Law(L = λW)與瓶頸產能檢查量測值
成果
- >超載測試中,實測 throughput 為理論瓶頸產能的 91%,落在預設的 75% 到 115% 範圍內。
- >約 1,200 個 Python 測試與 250 個前端測試,整合測試直接連真實的 Kafka 與 RabbitMQ。
- >Docker 一鍵啟動 broker、七個站點與所有服務,同一個 seed 可重現相同的訂單。