跳轉到

擴展至 100K 使用者

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

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

擴展觸發一覽

使用者數 關鍵變更
1K Multi-AZ RDS 實現資料庫高可用;Lambda 並行數提升至 100;速率限制中介軟體
5K 擴展至 r6i.2xlarge Worker(每執行個體 120 個);讀取複本;基線執行個體的預留執行個體
10K 擴展至 r6i.4xlarge(每執行個體 240 個);Valkey 提升至 100K ECPU;Redis Sorted Set 實現 O(log N) Worker 追蹤;所有背景任務使用 SQS
50K Graviton(ARM64)執行個體節省 20%;佈建式 Valkey 叢集(3-6 分片);Shield Advanced;跨區域災難恢復
100K 73 台 r6i.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
r6i.large 2 16 GB $0.152 42 32 30 $0.00507
r6i.xlarge 4 32 GB $0.304 85 64 60 $0.00507
r6i.2xlarge 8 64 GB $0.608 170 128 120 $0.00507
r6i.4xlarge 16 128 GB $1.216 340 256 240 $0.00507
r6i.8xlarge 32 256 GB $2.432 680 512 480 $0.00507

保守目標

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

所有規格的每 Worker 成本相同

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


層級表

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

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


已完成 vs 待完成

目前已部署

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

元件 狀態 詳情
ECS EC2 容量提供者 :white_check_mark: 已部署 雙 ASG(API + Worker),自動擴展策略
Lambda 編排器 :white_check_mark: 已部署 5 個函式,SQS + EventBridge 觸發
SQS FIFO 佇列 :white_check_mark: 已部署 worker-control、order-tasks、pool-claim + DLQ
Pool 預熱 :white_check_mark: 已部署 Pool manager Lambda、認領流程、約 897ms 就緒
ElastiCache Valkey Serverless :white_check_mark: 已部署 自動擴展儲存空間和 ECPU
RDS Aurora + RDS Proxy :white_check_mark: 已部署 連線池,單一執行個體
ALB + WAF :white_check_mark: 已部署 TLS、速率限制、託管規則群組
Terraform IaC :white_check_mark: 已部署 約 80 個資源,可重現的環境
CI/CD 流水線 :white_check_mark: 已部署 GitHub Actions → ECR → ECS 滾動式部署
CloudWatch 監控 :white_check_mark: 已部署 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 :white_check_mark: :white_check_mark:
Multi-AZ RDS :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:
RDS 讀取複本 :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:
速率限制中介層 :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:
SQS 背景任務 部分 :white_check_mark: :white_check_mark: :white_check_mark:
預留執行個體 :white_check_mark: :white_check_mark: :white_check_mark: :white_check_mark:
Graviton 執行個體 :white_check_mark: :white_check_mark:
Shield Advanced :white_check_mark: :white_check_mark:
跨區域備份 :white_check_mark: :white_check_mark:
佈建式 Valkey 叢集 :white_check_mark: :white_check_mark:
Redis Sorted Set 追蹤 :white_check_mark: :white_check_mark: :white_check_mark:

擴展瓶頸與緩解措施

已知瓶頸

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

瓶頸 閾值 症狀 緩解措施
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 過度工程化會浪費金錢並增加複雜度。工程化不足則意味著成長來臨時需要重寫。