| 維度 | 舊指標 | 新指標 | 時間窗口 |
|---|---|---|---|
| 峰值 TPS | 3,000 | 15,000 | 5 天 |
| P99 延遲 | 450 ms | ≤ 120 ms | 5 天 |
| 可用性 | 99.9 % | 99.99 % | 5 天 |
挑戰:
| 瓶頸點 | 表現 | 根因 |
|---|---|---|
| CPU 滿載 | 8 核瞬間 100 % | Netty I/O + 業務線程混用 |
| JDBC 連接池耗盡 | 大量 Cannot get connection |
同步阻塞等待 |
| GC 抖動 | Full GC 每 90 s 一次 | 大對象直接進入老年代 |
| 下游超時放大 | 一次 2 s 超時放大到 8 s | 無熔斷、無背壓 |
數據來源:2025-08-19 內部壓測報告《PayFi-Gateway-LoadTest-v3.1》。
| 候選框架 | 編程模型 | 社區活躍度 | 學習成本 | 最終評分 |
|---|---|---|---|---|
| Vert.x | Reactive | ★★★★★ | 中等 | 90/100 |
| Spring WebFlux | Reactive | ★★★★☆ | 低 | 80/100 |
| Akka HTTP | Actor | ★★★☆☆ | 高 | 70/100 |
核心原因:

| 模塊 | 舊實現 | 新實現 | 收益 |
|---|---|---|---|
| I/O 線程 | 8 | 16 | CPU 利用率提升 40 % |
| 路由表 | 內存 Map | Redis + Vert.x EventBus | 熱更新 0 延遲 |
關鍵代碼片段(Kotlin):
val router = Router.router(vertx)
router.route("/pay/:channel").handler(BodyHandler.create())
router.route("/pay/:channel").handler { ctx ->
eventBus.request<JsonObject>("channel.${ctx.pathParam("channel")}", ctx.bodyAsJson)
.onSuccess { ctx.end(it.body().encode()) }
.onFailure { ctx.fail(502, it) }
}
maxSize = 50 idleTimeout = 30 s RowStream 流式讀取,內存占用從 300 MB 降至 40 MB。| 策略 | 閾值 | 恢復時間 |
|---|---|---|
| 熔斷比例 | 50 % | 10 s |
| 重試次數 | 3 | 指數退避 50 ms |
| 艙壁隔離 | 信號量 200 | — |
代碼片段:
val cb = CircuitBreaker.of("channelX", CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofSeconds(10))
.build())
| 階段 | 流量比例 | 監控指標 | 決策 |
|---|---|---|---|
| Canary-1 | 5 % | P99 延遲 110 ms | 繼續 |
| Canary-2 | 20 % | 錯誤率 0.02 % | 繼續 |
| Final | 100 % | 延遲 95 ms | 成功 |
灰度工具:
| 指標 | 改造前 | 改造后 | 提升 |
|---|---|---|---|
| 峰值 TPS | 3,100 | 16,200 | ↑ 423 % |
| P99 延遲 | 450 ms | 96 ms | ↓ 79 % |
| CPU 峰值 | 100 % | 68 % | ↓ 32 % |
| Full GC 次數/小時 | 40 | 2 | ↓ 95 % |
| 連接池利用率 | 99 % | 35 % | 資源釋放 |
數據來源:2025-08-24 生產壓測報告《PayFi-Prod-LoadTest-v4.0》。
| 時間 | 事故 | 根因 | 解決 |
|---|---|---|---|
| Day3 14:00 | 渠道 A 大量 502 | 熔斷閾值過嚴 | 閾值 50 % ? 70 % |
| Day4 09:30 | Redis Stream 堆積 | 消費速率 < 生產速率 | 擴容 Consumer Group |
| Day5 11:00 | Vert.x Context 丟失 | Kotlin 協程調度錯誤 | 使用 awaitResult 替換 awaitBlocking |
通過 5 天極限改造,我們把 PayFi 聚合網關的并發能力提升了 5 倍,延遲下降近 80%,并保持零事故回滾。這次實戰證明: