Skip to content

系統架構與資料流

本頁說明

講什麼:系統邊界與技術棧、32 個微服務的分層關係、資料庫架構與同步管線、服務間通訊協議與延遲分析、一筆入金/出金從發起到完成經過哪些服務和資料表、銀行流水採集頻率、請求鏈路追蹤示例、監控與告警體系,以及常見延遲瓶頸與排查思路 適合誰:需要理解系統技術全貌的產品經理和運營人員 前置閱讀新人導讀預計閱讀:12 分鐘 負責人:出入金產品團隊

核心要點:系統由 32 個微服務組成,按 PHP 業務邏輯層、Go/Python 銀行對接層、Python SBA 編排層三級分工——理解分層關係是定位問題和評估變更影響的關鍵。


技術棧概覽

層級技術組件PM 關注點
業務邏輯PHP/Lumen 5.5入金(deposit/)、出金(withdraw/)、銀行卡(bankcard_service/)、現金(cash/)核心業務 API,延遲敏感——直接影響 App 響應速度
銀行接入Go + Python 混合Go:中銀流水、廣發FPS、渣打、黑白名單、天星網關;Python:SBA編排、匯豐、工銀、招行、民生銀行通道多語言異構——排查時需找對語言棧的日誌
通訊協議Protobuf RPC + HTTP RESTSRPC(內部同步)、HTTP(CRM/外部)、SM2 Socket(招行/民生)SRPC 超時 → 單筆入金/出金卡住;HTTP 超時 → CRM 操作失敗
銀行協議B2E XML / MT910 / SFTP+GPG / SM2 加密 / REST API每家銀行一種協議不同協議決定了流水獲取速度和自動化程度
儲存MySQL(分表)+ Elasticsearch(Canal 同步)+ Redis主庫分 100 表、ES 全文搜尋、Redis 快取+鎖CRM 搜尋走 ES(秒級延遲),不直接查資料庫
訊息Redis 事件佇列 + RabbitMQ內部非同步事件 + 跨服務解耦佇列積壓 → 批量入金/出金延遲

32 個微服務分類

完整服務清單

核心業務(4 個)

服務語言端口職責對外介面
deposit/PHP20001入金申請、銀行流水、匹配、審批、在途資金、對帳SRPC + HTTP REST
withdraw/PHP20002出金申請、三步審批(Audit→Confirm→Remittance)、銀行通道SRPC + HTTP REST
cash/PHP20003現金服務 API 和批處理HTTP REST
bankcard_service/PHP20005銀行卡全生命週期管理(綁定/驗證/解綁)HTTP REST

銀行接入層(13 個)

服務語言銀行職責通訊方式呼叫方向
bochk_flow_go/Go中銀B2E 協議解析、流水轉換B2E XMLmoomoo → 銀行(主動拉取)
bochk_deposit_mgr/Python中銀入金編排管理SRPC內部呼叫
bochk_fts_mgr/Python中銀FTS(匯款)管理SRPC內部呼叫
bochk_relay/Python中銀請求轉發代理HTTP內部轉發
hsbc_bank_flow_service/Python匯豐MT910 流水解析、SFTP 拉取、GPG 加密SFTP+GPG銀行 → moomoo(推送+拉取)
hsbc_edda_report/Python匯豐eDDA 報表下載SFTPmoomoo → 銀行(定時拉取)
sba_hsbc_eddi/Python匯豐eDDA/eDDI 入金代扣整合REST APImoomoo → 銀行(發起+輪詢)
sba_hase_eddi/Python恒生eDDA/eDDI 入金代扣整合REST APImoomoo → 銀行(發起+輪詢)
scb_service/Go渣打FPS RPC 介面SRPCmoomoo → 銀行
cgb_fps_service/Go廣發FPS 即時轉帳SM2 加密moomoo → 銀行
icbc_be_relay/Python工銀銀企互聯中繼RSA 驗簽moomoo → 銀行
cmb_stock_trans/Python招行銀證轉賬(Socket 二進位雙向鏈路)SM2 Socket雙向即時
ms_stock_bank_transaction/Python民生銀證轉賬SM2 Socket雙向即時

SBA 編排層(3 個)

服務語言職責狀態數
sba_deposit_system/Python入金編排:建立→審核→風控變更→入帳,支援 6 種入金模式6
sba_cash_withdraw_system/Python出金編排:凍結→扣款→轉帳→釋放,支援 4 階段 17 種狀態17
sba_fund_withdraw/Python基金出金:貨幣基金贖回→出金一鍵編排

風控(3 個)

服務語言職責運營關聯
hk-deposit-blacklist-go/Go入金黑名單(批量增刪查)命中時入金被攔截,Procedure → manual_confirm
hk-deposit-whitelist-go/Go入金白名單白名單內使用者走快速通道,跳過人工審核
hk-withdraw-blacklist-go/Go出金黑名單命中時出金進入人工審核佇列

其他(9 個)

服務語言職責狀態
bank-card/PHP銀行卡基礎 API遺留服務,逐步遷移到 bankcard_service
cash_service/PHP現金服務擴展活躍
refund/PHP退款處理活躍
airstar_service/Go天星銀行支付網關(Mandate 授權/入金/出金)活躍——天星 BST 的核心
sync_bst_data_helper/Python招行異常流水恢復補償服務——招行 Socket 斷連時使用
tools-pic-upload/Go憑證圖片上傳活躍
bank_conn_doc/-銀行對接規範文件(匯豐/中銀/恒生/工銀/EWB/浦發)文件倉庫
procedure_system/Python流程編排系統(SBA 核心框架)活躍——SBA 的底層引擎

資料庫架構

三個核心資料庫

資料庫歸屬服務核心表分表策略預計資料量
主庫(cash_deposit / cash_withdraw)deposit/、withdraw/、cash/、refund/applys、flows、matches、tasks、queueapplys 按 uid 取模分 100 表;flows 按銀行類型+月份分表百萬級/月
web_accountbankcard_service/bank_card、bank_info、bank_card_certificate、bank_card_asb_bst、bank_card_edda不分表十萬級
SBA Procedure 庫procedure_system/、sba_*_system/proc_info、proc_cash_deposit、proc_cash_withdraw、flow不分表百萬級/月

三個庫物理隔離,服務之間透過 RPC 呼叫而非直接跨庫查詢。

分表對運營的影響

入金申請表 applys 按使用者 ID 分了 100 張表(applys_00applys_99)。CRM 搜尋不受影響(走 ES),但如果需要直接查庫排查,需要先算出使用者 ID 對應的表後綴:uid % 100

銀行流水表 flows 按銀行+月份分表(如 flows_bochk_202604),跨月查詢需要指定正確的月份。

出金任務表 tasks 不分表,但資料量大時按 created_at + status 建索引查詢。

SBA Procedure 表 proc_info 不分表,透過 idnn_uid + biz_type 查詢。

資料同步管線(Canal CDC → Elasticsearch)

CRM 運營後台支援按卡號、使用者名稱、銀行流水號等做模糊搜尋——這不是直接查資料庫,而是查 Elasticsearch。資料透過 Canal(阿里開源的 MySQL Binlog 訂閱工具)即時同步:

PM 視角:CRM 搜尋結果幾乎即時(秒級延遲)。如果搜尋結果「找不到」,不一定是資料不存在——可能是 Canal 同步延遲,等幾秒再搜通常就有了。

Canal 同步的實體
實體源表ES 索引用途支援的搜尋欄位CRM 搜尋入口
ApplySync入金申請 applysCRM 入金列表搜尋uid, 銀行卡號, 金額, 狀態, 建立時間入金管理 → 搜尋框
FlowSync銀行流水 flowsCRM 流水搜尋、匹配排查流水號, 金額, 銀行, 幣種, 入帳時間流水管理 → 搜尋框
TaskSync出金任務 tasksCRM 出金列表搜尋uid, 目標卡號, 金額, 狀態, 建立時間出金管理 → 搜尋框
FileSync憑證檔案CRM 憑證搜尋檔名, 上傳時間, 關聯 uid憑證管理
DepositSbaListSync入金 SBA 關聯入金-Procedure 關聯查詢apply_id, procedure_id入金詳情 → SBA 關聯
ApplyAdditionSync入金附加資訊補充搜尋欄位備註, 附加標記入金詳情 → 附加資訊

搜尋不到記錄時的排查順序

  1. 等 5-10 秒重新搜尋(Canal 同步延遲)
  2. 換搜尋條件試(如用 uid 代替卡號)
  3. 檢查 Canal Consumer 日誌是否有報錯
  4. 直接查資料庫確認資料是否存在

服務間通訊方式

協議使用場景典型呼叫特點PM 意義
SRPC(Protobuf RPC)核心服務 ↔ SBA / 風控deposit/ 呼叫 CashDepositCreate同步、強型別、毫秒級超時直接影響使用者等待時間
HTTP REST銀行卡服務 / 天星網關 / CRMCRM 呼叫 /bank_card/get_list標準 Web API易於監控和除錯
SM2 Socket招行/民生銀證二進位雙向鏈路長連線、即時推送銀行側結果秒級到達
REST API(輪詢)天星銀證 / 匯豐恒生 eDDAAsbBstCreateResultJob 輪詢需主動查詢使用者等待時間更長
RabbitMQ交易通知→風控;跨服務非同步RmqReportMsg 觸發風控更新非同步解耦佇列積壓影響批量處理

通訊方式對延遲的影響

場景通訊鏈路典型延遲延遲原因影響範圍
BST 入金(招行/民生)SM2 Socket 即時推送秒級銀行主動推送結果單筆
BST 入金(天星)REST API + 輪詢秒~分鐘級需輪詢最多 60 次單筆
BST 出金(天星)REST API + 輪詢秒~分鐘級需輪詢最多 10 次單筆
eDDA 代扣入金REST API + 輪詢T+0~T+1銀行非同步處理單筆
普通入金匹配定時任務3 分鐘一輪匹配引擎定時掃描批量
網銀出金人工操作小時~天級依賴運營在銀行網銀轉帳單筆
CRM 搜尋Canal CDC → ES秒級Binlog 同步延遲CRM

PM 視角:如果一筆入金延遲異常,瓶頸可能在 SRPC 同步呼叫(如 SBA 建立 Procedure 超時)或 Canal 非同步佇列積壓。SRPC 問題影響單筆,佇列積壓影響批量。


入金資料流:一筆錢如何到帳

普通入金(使用者視角)

步驟使用者操作使用者感知預計耗時
1在 App 選擇銀行卡,獲取入金帳戶資訊看到 moomoo 收款帳號即時
2在銀行 App/網銀轉帳到 moomoo 帳戶銀行顯示轉帳成功1-5 分鐘
3等待系統匹配入帳App 顯示「入金處理中」3 分鐘~數小時
4入金完成App 餘額增加,收到通知

系統視角

入金資料經過的核心表

階段表名分表規則說明運營查看位置
1. 使用者申請applys_{00-99}uid % 100一條 = 一筆入金申請CRM → 入金管理
2. 銀行流水flows_{bankType}_{YYYYMM}銀行類型 + 月份一條 = 一筆銀行流水CRM → 流水管理
3. 匹配matches_{shard}Flow 與 Apply 的關聯記錄CRM → 匹配記錄
4. 入金任務deposits_{shard}已匹配的入金任務CRM → 入金列表
5. 異常abnormal_deposits不分表異常流水單獨追蹤CRM → 異常入金
6. SBAproc_info + proc_cash_deposit不分表Procedure 追蹤記錄CRM → SBA 管理

入金 Procedure 的完整狀態機和欄位說明 → SBA 資金編排 § 入金 Procedure 狀態機


出金資料流:一筆錢如何匯出

出金(使用者視角)

步驟使用者操作使用者感知預計耗時
1在 App 選擇出金銀行卡和金額即時
2確認出金可用餘額減少(凍結)即時
3等待系統處理App 顯示「出金處理中」BST 秒級 / 網銀 小時級
4出金完成收到出金成功通知
5銀行到帳銀行卡收到資金1-3 個工作日

系統視角

出金資料經過的核心表

階段表名說明運營查看位置
1. 建立任務tasks出金任務核心記錄CRM → 出金管理
2. 操作流水flows每步審批的操作日誌(staff_id, action, step)CRM → 操作記錄
3. 事件佇列queue非同步事件(銀證同步、高風險檢查等)系統內部
4. SBA 追蹤sba_list出金 Task ↔ SBA Procedure 關聯CRM → SBA 狀態
5. 銀證設定auto_settings按銀行×幣種的自動審批餘額/上限配置CRM → 銀證設定
6. 銀行流水cmb_list / ms_list招行/民生銀行側發起的出金記錄CRM → 銀證出金

出金 Procedure 的完整狀態機(17 個狀態)和凍結-轉帳-釋放模式 → SBA 資金編排 § 出金 Procedure 狀態機


銀行流水採集頻率

不同銀行的流水資料獲取方式和頻率差異很大——這直接影響入金到帳速度:

銀行採集方式頻率說明入金到帳預期自動化程度
中銀 BOCHKB2E 主動拉取每日 3 次(06:00/07:00/08:00)+ 2 小時轉換TodayActivity→AcctStatement→AcctActivityT+0(當日)半自動
匯豐 HSBCMT910 即時推送 + SFTP 拉取即時 + 批量兜底Transaction Reference Number 去重分鐘級全自動
工銀 ICBC銀企互聯主動拉取每日即時拉取按日期區間查詢,RSA 驗簽T+0半自動
招行 CMB雙���鏈路被動接收事件驅動(即時)銀行發起時即時接收秒級全自動
民生 MS雙向鏈路被動接收事件驅動(即時)銀行發起時即時接收秒級全自動
天星 ASBREST API 輪詢輪詢(最多 60 次)入金建立後輪詢結果秒~分鐘級全自動
恒生 HASEeDDA 代扣 + REST API代扣發起後輪詢透過 sba_hase_eddi 處理T+0~T+1全自動
EWBCSV + BAI2 檔案按需上傳CSV 去重 + BAI2 補充名稱人工處理手動
其他銀行入金匹配任務掃描每 3 分鐘CCB Asia、DBS、眾安等3 分鐘~小時級半自動

流水獲取延遲 ≠ 到帳延遲

流水獲取只是入金流程的第一步。之後還需要匹配引擎比對(每 3 分鐘一輪)、SBA 建立 Procedure、風控變更等步驟。BST 銀證通道跳過了匹配步驟(直接建立 Procedure),所以到帳最快。

各環節延遲疊加估算

入金通道流水獲取匹配SBA + 風控總計
BST(招行/民生)秒級跳過毫秒級秒級
BST(天星)秒~3 分鐘跳過毫秒級秒~3 分鐘
eDDA(恒生/匯豐)T+0~T+1跳過毫秒級T+0~T+1
普通入金(匯豐)分鐘級3 分鐘毫秒級3~10 分鐘
普通入金(中銀)當日 3 次3 分鐘毫秒級小時級
普通入金(其他)3 分鐘3 分鐘毫秒級6~30 分鐘

請求鏈路追蹤

入金鏈路示例:一筆招行 BST 入金

使用者在招行App發起銀證入金 10,000 HKD

① cmb_stock_trans 收到 SM2 Socket 推送(< 1秒)
    → 解密報文,提取:卡號、金額、幣種、市場

② deposit/ 收到入金通知(SRPC,< 100ms)
    → 建立 Apply 記錄(applys_xx 表)
    → 黑名單/白名單檢查(並行 RPC)

③ sba_deposit_system/ 建立 Procedure(SRPC,< 100ms)
    → proc_info + proc_cash_deposit 寫入
    → 自動審核(deposit_type = TRANS_AUTO)

④ 風控系統 資產變更(SRPC,< 200ms)
    → 餘額增加 10,000 HKD

⑤ Procedure → end_ok(deposit_ok)(< 50ms)
    → 回寫 Apply 狀態 → DONE
    → Canal 同步到 ES(< 3秒)

⑥ 使用者在 App 看到餘額增加
    總耗時:約 1-3 秒

出金鏈路示例:一筆網銀出金

使用者在 moomoo App 發起出金 50,000 HKD 到恒生銀行

① withdraw/ 建立 Task(< 100ms)
    → 黑名單檢查
    → 銀行卡驗證(bankcard_service/ HTTP)
    → Step 1 Audit: 自動通過(普通範本)
    → Step 2 Confirm: 參數確認
    → Step 3 Remittance: 建立 SBA Procedure

② sba_cash_withdraw_system/ 凍結資金(< 200ms)
    → 風控系統凍結 50,000 HKD
    → Procedure: new(freeze) → new(waiting) → new(blank)

③ 扣款(< 200ms)
    → 風控系統正式扣減 50,000 HKD
    → Procedure: pending(deduct_done)

④ 進入人工轉帳(恒生走企業網銀)
    → Procedure: pending(transfer_manual)
    → **等待運營在恒生企業網銀完成轉帳**

⑤ 運營在銀行網銀轉帳完成後(小時~天級)
    → CRM 點擊「確認轉帳完成」
    → SetManualTransferDone
    → Procedure: end_ok(transfer_done)

⑥ 使用者 1-3 個工作日後收到資金
    總耗時:數小時~1 個工作日(取決於運營處理速度)

監控與告警體系

核心監控指標

指標監控方式告警閾值影響
入金到帳時間SBA Procedure 建立到 end_ok 的時間差BST > 5 分鐘 / 普通 > 1 小時使用者體驗
出金處理時間Task 建立到 end_ok 的時間差BST > 10 分鐘 / 網銀 > 24 小時使用者體驗
匹配引擎執行定時任務執行日誌超過 6 分鐘未執行批量入金延遲
Canal 同步延遲ES 最新記錄時間 vs MySQL 最新記錄時間延遲 > 30 秒CRM 搜尋不到最新資料
SM2 Socket 連線心跳檢測(招行/民生)心跳超時 > 60 秒銀證通道不可用
輪詢任務超時Job retry_count入金 > 60 / 出金 > 10天星 BST 交易卡住
凍結未釋放Procedure 在 pending(unfreeze) 停留時間> 5 分鐘使用者資金卡住
補回失敗Procedure 在 pending(return) 停留時間> 5 分鐘使用者資金「消失」

告警通知方式

級別告警方式回應時效典型場景
P0 嚴重飛書群 + 電話15 分鐘內凍結未釋放、補回失敗、SM2 Socket 斷連
P1 重要飛書群30 分鐘內輪詢超時、匹配引擎停止、Canal 同步長時間延遲
P2 一般飛書群2 小時內單筆入金/出金延遲超預期

詳細告警規則配置、定時任務清單和 Dashboard 地址 → 定時任務與監控


常見延遲瓶頸與排查

當入金或出金出現延遲時,問題通常出在以下環節:

#瓶頸環節表現排查方式影響範圍嚴重程度
1銀行流水未到Apply 已建立但無匹配流水檢查對應銀行接入服務日誌;確認銀行側是否已完成轉帳單筆P2
2匹配引擎延遲流水已入庫但未匹配到 Apply檢查匹配定時任務是否正常運行(每 3 分鐘)批量P1
3SBA Procedure 建立超時匹配成功但 Procedure 未建立檢查 SBA 服務是否正常、SRPC 是否超時單筆P1
4風控變更失敗Procedure 建立成功但狀態為 end_reject查看 Procedure 的 reason 欄位單筆P2
5Canal 同步延遲CRM 搜尋不到已存在的記錄等幾秒重新搜尋;檢查 Canal Consumer 是否正常CRMP2
6銀證輪詢超時天星 BST 入金/出金長時間處理中檢查輪詢任務重試次數(入金 60 / 出金 10)單筆P1
7定時腳本未運行出金 Procedure 卡在 new(waiting)檢查出金定時腳本是否正常執行批量P0
8人工轉帳未確認出金 Procedure 卡在 pending(transfer_manual)提醒運營在銀行網銀完成轉帳後確認單筆P2
9SM2 Socket 斷連招行/民生銀證通道完全不可用檢查 cmb_stock_trans / ms_stock_bank_transaction 服務狀態通道級P0
10RabbitMQ 積壓多筆入金/出金批量延遲檢查佇列深度和消費者狀態批量P1

快速排查決策樹


系統間呼叫關係

讀完之後

我想...去看
了解系統管什麼不管什麼新人導讀 § 30 秒全景
深入了解 SBA 編排SBA 資金編排
深入了解銀行卡體系銀行卡與授權
看各銀行接入方式銀行能力矩陣
看告警和定時任務定時任務與監控
這個頁面有幫助嗎?

内部业务文档 · 仅限 moomoo 团队使用