先讓錢算得準
我把所有金額從浮點數改成 BigDecimal 與 DECIMAL(19,4)。銀行可以慢一點,但不能把 0.1 + 0.2 算錯。
12 個金額欄位完成精度遷移IAN'S BANKING LAB台北 · 持續建造中
我只是想知道——一筆錢在網路上移動時,究竟需要多少層信任。
於是我從登入、餘額與轉帳開始,一路蓋到資料一致性、訊息事件、日終清算、監控與 VPS。IanBank 是我的數位銀行,也是我理解金融科技的方法。
BUILD LOG
每一層架構都不是為了讓圖變複雜,而是因為我真的碰到一個不能忽略的問題。點子變成程式,程式再逼我學會代價。
我把所有金額從浮點數改成 BigDecimal 與 DECIMAL(19,4)。銀行可以慢一點,但不能把 0.1 + 0.2 算錯。
12 個金額欄位完成精度遷移手機網路會重送、使用者會連點。我加入冪等鍵,讓同一個意圖無論送來幾次,都只扣一次錢。
Idempotency-Key · 24 小時結果快取同一個帳戶可能同時收到多筆請求。我用 Redis 分散式鎖、資料庫樂觀鎖與重試機制,把競爭變成可控制的順序。
分散式鎖 + @Version 最後防線服務上線不代表故事結束。我加入 Prometheus、Grafana、Loki,讓錯誤率、延遲和日誌能被一起看見。
Metrics · Dashboard · Logs我繼續往日終批次、清算檔案、稽核紀錄與帳戶凍結走。因為真正的銀行不只服務客戶,也必須能對帳與追責。
EOD · Settlement · AuditTHE LIFE OF A TRANSFER
轉帳按鈕只需要一秒,背後卻是一條不能斷的信任鏈。這是我用 IanBank 親手拆解後,留下的六個控制點。
CONTROL POINT 01Kong
先限制異常流量,讓核心服務不必直接面對所有請求。
MY TRADE-OFFS
這裡不假裝每個選擇都是最佳實務。它們是在「一個人維護、真的上線、想摸懂全棧」的條件下,我做出的判斷。
把銀行業務留在一個 Spring Boot 核心。
我接受我放棄了看起來更時髦的微服務;換來一個人真的維護得動的系統。
資料庫、快取、訊息、Gateway 與監控都自己養。
我接受它不是最省事的上線方式,卻是最能摸到每一層的學習方式。
金額一律 BigDecimal 與 DECIMAL(19,4)。
我接受程式碼更囉嗦,但金融系統不能接受『差不多正確』。
WHY I KEEP BUILDING
「銀行真正的產品有兩個:
一個是給客戶用的 App,
另一個是我自己學會怎麼經營一家科技銀行。」
IanBank 不處理真錢,也不假裝取代真實銀行。它存在,是為了把每一個看不見的金融系統問題,變成我能親手驗證的東西。