跳轉到

擴展至 100K 使用者

每個擴展層級只需修改 terraform.tfvars。自動擴展完成其餘工作。

平台的設計使得沒有任何元件需要替換即可達到 100K 使用者。執行個體類型變大、複本數量增加、並行限制提升——但架構、程式碼和部署流水線保持不變。本頁記錄了每個數量級變化時的確切調整。

擴展觸發一覽

使用者數 關鍵變更
1K Multi-AZ RDS 實現資料庫高可用;Lambda 並行數提升至 100;速率限制中介軟體
5K 擴展至 r7g.2xlarge Worker(每執行個體約 120 個);讀取複本;基線執行個體的預留執行個體
10K 擴展至 r7g.4xlarge(每執行個體約 250 個);Valkey 提升至 100K ECPU;Redis Sorted Set 實現 O(log N) Worker 追蹤;所有背景任務使用 SQS
50K Graviton(ARM64)執行個體節省 20%;佈建式 Valkey 叢集(3-6 分片);Shield Advanced;跨區域災難恢復
100K 70 台 r7g.8xlarge 機隊;3 年期預留執行個體 + Savings Plans;完整跨區域備份

擴展計算

尖峰同時在線 Worker 的經驗模型:

Peak Workers = Total Users x 0.50 (DAU rate) x 0.70 (peak concurrency) = 0.35 x N
變數 依據
日活躍使用者率 (DAU Rate) 50% 任一交易日有一半的註冊使用者活躍
尖峰並行率 70% 日活躍使用者中,70% 在交易時段同時在線(09:00-10:30 尖峰)
尖峰 Worker 數 0.35 x N 每位同時在線使用者需要一個專屬 Worker

每個執行個體的 Worker 數

執行個體類型 vCPU RAM $/hr(新加坡) Worker 數 @ 384 MB 軟性 Worker 數 @ 64 CPU 保守值 $/worker/hr
r7g.xlarge 4 32 GB $0.258 85 64 60 $0.00431
r7g.2xlarge 8 64 GB $0.517 170 128 120 $0.00431
r7g.4xlarge 16 128 GB $1.034 340 256 250 $0.00413
r7g.8xlarge 32 256 GB $2.067 680 512 500 $0.00413

保守目標

「保守值」欄位考慮了作業系統開銷(約 512 MB)、ECS 代理記憶體,以及券商 API 呼叫期間記憶體尖峰的餘裕。生產目標設定在理論最大值的 25-30% 以下。

所有規格的每 Worker 成本相同

r7g 系列定價完全線性——執行個體規格加倍,價格也恰好加倍。使用更大執行個體的優勢在於營運面:更少的執行個體需要管理、更少的 ECS 代理開銷、更少的維護 Lambda 掃描迭代,以及更充裕的記憶體尖峰餘裕。策略是隨著使用者增長而提升執行個體規格,將叢集維持在 15-40 個執行個體,無論處於哪個層級。


層級表

層級 尖峰 Worker Worker EC2 Worker 類型 API EC2 API 類型 Lambda 並行數 ElastiCache RDS
100 35 1 r7g.xlarge 2 m7g.large 50 Valkey Serverless 1 GB db.t3.large
500 175 3 r7g.xlarge 3 m7g.large 50 Valkey Serverless 1 GB db.t3.large
1K 350 6 r7g.xlarge 6 m7g.large 100 Valkey 5 GB / 10K ECPU db.r6g.large Multi-AZ
5K 1,750 15 r7g.2xlarge 10 m7g.xlarge 200 Valkey 5 GB / 50K ECPU db.r6g.large + 讀取複本
10K 3,500 14 r7g.4xlarge 20 m7g.xlarge 500 Valkey 10 GB / 100K ECPU db.r6g.xlarge + 讀取複本
50K 17,500 35 r7g.8xlarge 30 m7g.2xlarge 500 Valkey 叢集 3 分片 db.r6g.2xlarge + 2 複本
100K 35,000 70 r7g.8xlarge 40 m7g.2xlarge 500 Valkey 叢集 6 分片 db.r6g.4xlarge + 2 複本
如何解讀此表

5K 層級為例:5,000 使用者 × 0.35 = 1,750 個尖峰 Worker。不使用 30 個 r7g.xlarge,而是提升到 r7g.2xlarge(每個可容納 120 個 Worker)→ ceil(1750/120) = 15 個執行個體。這使叢集保持精簡且易於管理。每 Worker 成本相同($0.00431/hr)——節省來自更少的 ECS 代理和更簡化的營運。API 擴展到 10 個 m7g.xlarge。Lambda 並行數增加到 200。Valkey ECPU 提升至 50K。RDS 增加一個讀取複本。


已完成 vs 待完成

目前已部署

前 500 位使用者所需的一切已上線就緒:

元件 狀態 詳情
ECS EC2 容量提供者 ✅ 已部署 雙 ASG(API + Worker),自動擴展策略
Lambda 編排器 ✅ 已部署 5 個函式,SQS + EventBridge 觸發
SQS FIFO 佇列 ✅ 已部署 worker-control、order-tasks、pool-claim + DLQ
Pool 預熱 ✅ 已部署 Pool manager Lambda、認領流程、約 897ms 就緒
ElastiCache Valkey Serverless ✅ 已部署 自動擴展儲存空間和 ECPU
RDS Aurora + RDS Proxy ✅ 已部署 連線池,單一執行個體
ALB + WAF ✅ 已部署 TLS、速率限制、託管規則群組
Terraform IaC ✅ 已部署 約 80 個資源,可重現的環境
CI/CD 流水線 ✅ 已部署 GitHub Actions → ECR → ECS 滾動式部署
CloudWatch 監控 ✅ 已部署 Container Insights、自訂指標、警報、儀表板

未來擴展工作

變更 觸發條件 工作量 影響
Multi-AZ RDS 1K 使用者 terraform.tfvars 修改 資料庫層的高可用性
讀取複本 5K 使用者 在 Terraform 中新增複本配置 分載讀取查詢
Valkey ECPU 擴展 10K 使用者 terraform.tfvars 修改 處理心跳流量
Graviton 執行個體(r7g、m7g) 50K 使用者 AMI + 執行個體類型變更 節省 20% 成本
佈建式 Valkey 叢集 50K 使用者 從 Serverless 遷移到佈建式 大流量下的可預測定價
預留執行個體 (Reserved Instances) 5K 使用者 AWS 主控台 / Terraform 穩定運算節省 30-40%
SQS 處理所有背景任務 10K 使用者 應用程式碼 + Terraform 將背景任務從 API 熱路徑移除
Redis sorted set 追蹤 Worker 10K 使用者 應用程式碼變更 O(log N) Worker 查找取代 O(N) 鍵掃描

各層級的架構變更

變更 100 500 1K 5K 10K 50K 100K
單可用區 RDS ✅ ✅
Multi-AZ RDS ✅ ✅ ✅ ✅ ✅
RDS 讀取複本 ✅ ✅ ✅ ✅
速率限制中介層 ✅ ✅ ✅ ✅ ✅
SQS 背景任務 部分 ✅ ✅ ✅
預留執行個體 ✅ ✅ ✅ ✅
Graviton 執行個體 ✅ ✅
Shield Advanced ✅ ✅
跨區域備份 ✅ ✅
佈建式 Valkey 叢集 ✅ ✅
Redis Sorted Set 追蹤 ✅ ✅ ✅

擴展瓶頸與緩解措施

已知瓶頸

以下是隨著使用者數量增長,最先承受壓力的元件。

瓶頸 閾值 症狀 緩解措施
Redis 鍵掃描 5K Worker 維護 Lambda 逾時增加 切換到 Redis sorted set,O(log N) 查找
ECS API 速率限制 10K Task RunTask 節流(預設 10 TPS) 向 AWS 申請提高限制,批次操作
RDS 連線數 500 Task 連線池耗盡 RDS Proxy(已部署),增加 Proxy 連線池
Lambda 並行數 10K 使用者 SQS 佇列深度增加 向 AWS 申請提高並行限制
ALB 連線數 50K 同時在線 ALB 產生 5xx 錯誤 增加 ALB 執行個體(自動)、增加閒置逾時

每個瓶頸都有已知的緩解措施,無需任何架構變更——只需配置調整或 AWS 支援工單。

擴展哲學

針對當前層級最佳化,規劃下一個層級,並確保沒有任何因素阻擋再下一個層級。在只有 100 位使用者時就為 100K 過度工程化會浪費金錢並增加複雜度。工程化不足則意味著成長來臨時需要重寫。