微服務視角下的包網平台 02:多租戶架構

微服務視角下的包網平台 02:多租戶架構

2025-08-17

作為一個白產 PM,我嘗試用「學習者」的角度去理解 iGaming 包網平台的系統架構。 這篇筆記從四大核心模組(PAM、Wallet、Game、Risk)開始,進一步拆解多租戶架構,並引入 Connection Pool 的概念,來確保每個租戶資料的安全與效能。 這是我第一次完整把「多租戶 × 包網」畫成圖,記錄下我的學習體悟。

這篇筆記是我,作為一個白產 PM,嘗試跨入 iGaming 包網平台 的學習紀錄

撇開價值觀和產業爭議不談,我想用「學習者」的角度,去理解這個產業背後的

商業邏輯 × 技術架構, 因為對 PM 來說,能把業務需求翻譯成架構圖,才是專業價值

回顧四大模組的業務流程

在最基礎的情境下,玩家的請求會經過 API Gateway,再分流到四個核心服務:

  • PAM(帳號服務):玩家註冊、登入、KYC
  • Wallet(金流服務):充值、提款、下注、派彩
  • Game Engine(遊戲引擎):整合遊戲供應商 API
  • Risk Engine(風控服務):AML、流水檢查、多帳號偵測
flowchart TB
    Player[玩家] --> Gateway[API Gateway]
    Gateway --> PAM[PAM<br/>玩家帳號服務]
    Gateway --> WALLET[Wallet<br/>錢包/金流服務]
    Gateway --> GAME[Game Engine<br/>遊戲引擎/聚合器]
    WALLET --> RISK[Risk Service<br/>風險控制引擎]

多租戶架構&連線池

上面的架構如果是自己的平台用用可能還行,但包網包網,肯定就是會有很多人來租用你的系統,要同時服務很多 租戶(Operator),那現在問題來了我的架構要怎麼近行變動?

在技術上的方案有很多,但其中一個最保守的方式就是每個租戶都有自己的 DB,在之前的架構圖中,每個微服務其實都有一個獨立的 DB;那在多租戶的架構中,就會是每個租戶在每個服務中都會有自己的 DB

但這時候就會暴露一個問題是,如果每一筆資料進來,服務要查資料庫 → 建立連線 → 執行查詢 → 關閉連線,這樣太耗資源,所以就會需要引入連線池這個概念,在一段時間內只要這個租戶持續有流量進來,我們就會快取他的 DB 連線

以 Wallet 金流服務的概念為例子,架構圖如下

flowchart TB
    WALLET[Wallet Service]
    WALLET --> poolMgr[Connection Pool Manager]
    poolMgr --> tenantA[(wallet_db_A)]
    poolMgr --> tenantB[(wallet_db_B)]
    poolMgr --> tenantC[(wallet_db_C)]

整體架構圖

如果我們把所有架構拼湊起來就會變成這樣

flowchart TB
    %% --- 上層 業務流程 ---
    Player[玩家] --> Gateway[API Gateway]
    Gateway --> PAM[PAM<br/>玩家帳號服務]
    Gateway --> WALLET[Wallet<br/>錢包/金流服務]
    Gateway --> GAME[Game Engine<br/>遊戲引擎/聚合器]
    WALLET --> RISK[Risk Service<br/>風險控制引擎]

    %% --- 下層 多租戶連線池 ---
    subgraph PAM_DB["PAM Service"]
        pamCM["Connection Pool Manager"]
        pamCM --> pamTenantA[(pam_tenantA_db)]
        pamCM --> pamTenantB[(pam_tenantB_db)]
    end

    subgraph Wallet_DB["Wallet Service"]
        walletCM["Connection Pool Manager"]
        walletCM --> walletTenantA[(wallet_tenantA_db)]
        walletCM --> walletTenantB[(wallet_tenantB_db)]
    end

    subgraph Game_DB["Game Service"]
        gameCM["Connection Pool Manager"]
        gameCM --> gameTenantA[(game_tenantA_db)]
        gameCM --> gameTenantB[(game_tenantB_db)]
    end

    subgraph Risk_DB["Risk Service"]
        riskCM["Connection Pool Manager"]
        riskCM --> riskTenantA[(risk_tenantA_db)]
        riskCM --> riskTenantB[(risk_tenantB_db)]
    end

    %% --- 業務服務 與 各自 DB pool 的連結 ---
    PAM --> pamCM
    WALLET --> walletCM
    GAME --> gameCM
    RISK --> riskCM

這裡的關鍵在於:

  1. Gateway 共用:所有玩家流量都進同一個入口
  2. Service 共用:程式邏輯是一份,不需要為每個租戶重新寫
  3. DB 隔離:每個租戶有獨立 DB,資料安全、合規
  4. Connection Pool Manager:是「租戶請求 → 對應 DB」的橋樑

結語

這篇筆記,算是我第一次完整理解「多租戶 × 包網」的樣子

未來還有更多細節可以學:像是 Platform Admin Console(平台方怎麼建立租戶)跨租戶報表動態擴展架構 但至少現在,我能很清楚地說出:

  • PAM:身份
  • Wallet:錢流
  • Game Engine:遊戲
  • Risk Engine:風控
  • Connection Pool:多租戶的橋樑

希望這篇筆記,不只是我的學習記錄,也能成為我未來切入 iGaming 架構思維的一張入場券