一般單人遊戲:送一個請求、算一次、回一次,容量就是「每秒能處理幾次」。
Wolves Crash 是全場玩同一局 —— 同一架飛機、同一個爆點,所以吃的是完全不同的三件事:
所以判斷「撐不撐得住」要同時看四個延遲 —— 只看其中一個會得出錯誤結論。
| 同時在玩 | 下注確認 p50 / p99 | 收手成交 p50 / p99 | 畫面同步 p50 / p99 | 結算 p95 | 訊息量 | 失敗 / 斷線 |
|---|---|---|---|---|---|---|
| 500 人 | 179ms / 387ms | 3ms / 16ms | 7ms / 18ms | 31ms | 3,248 則/秒 | 0 / 0 |
| 700 人 | 246ms / 425ms | 6ms / 23ms | 10ms / 34ms | 65ms | 5,458 則/秒 | 0 / 0 |
| 1,000 人 | 431ms / 2.39s | 11ms / 679ms | 15ms / 428ms | 66ms | 11,614 則/秒 | 0 / 0 |
合格線(超過就感覺得到):下注確認 p99 ≤ 500ms、收手成交 p99 ≤ 150ms、畫面同步 p99 ≤ 300ms、 失敗率 0、無人被斷線。
到 1,000 人為止沒有任何一筆失敗、沒有人被斷線,但 1,000 人時三項延遲一起越線 (而且重跑的數字很不穩定,代表那台機器已經在邊緣)。所以認列 700 人為單房穩定容量。
每一步都是「先量出瓶頸在哪,再改」—— 前兩次憑經驗猜,兩次都猜錯。
| 做了什麼 | 結果 |
|---|---|
| 起點 | 單房 400 人(卡在收手回應) |
| 換資料庫(SQLite → MySQL) | 容量沒變、下注反而更慢 —— 猜錯,但量出來就認 |
| 收手廣播合批:原本每個人收手都對全場廣播一次(500 人 = 500 則 × 500 收件人),改成同一瞬間的收手合成一則 | 收手回應 176ms → 12ms;容量 400 → 500 人 |
| 扣款批次化:一批不管幾注,都只用三道資料庫指令完成(鎖一次、寫一次、記帳一次) | 下注確認明顯下降 |
| 批次跟人數走:批次大小 = 在場人數 ÷ 5(太小則交易次數多、太大則鎖太久,實測最佳值就在這) | 下注確認 883ms → 425ms;容量 500 → 700 人 |
🔴 玩家自己的收手回覆一直是當場立刻送的 —— 合批的只有「別人收手了」這種給全場看的通知。 收手是這款遊戲最關鍵的一秒,任何優化都不會拿它去換。
「同時在玩 700 人」跟「同一瞬間一起連進來 700 人」不是同一件事。 實測若讓幾百條連線在同一毫秒握手,作業系統的連線佇列會滿並直接拒絕 —— 那是連線洪峰的極限,不是算力的極限。