Back to Blog

Go Financial Core System - System Design

29 Maret 20264 min read
Go Financial Core System - System Design

Kita mau bikin sistem seperti e-wallet (contoh: Dana, OVO), tapi:

  • Aman (tidak bisa saldo dobel / hilang)
  • Tidak error saat banyak orang transaksi bersamaan
  • Mudah dikembangkan

๐Ÿง  1. Gambaran Besar Sistem

Bayangkan sistem seperti restoran ๐Ÿ”

  • Client = pelanggan
  • Handler = kasir (terima pesanan)
  • Usecase = dapur (proses logika)
  • Domain = resep asli (aturan bisnis)
  • Infrastructure = alat masak (DB, RabbitMQ)

Strukturnya:

plaintext
Client โ†’ Handler โ†’ Usecase โ†’ Domain โ†’ Infrastructure

Artinya:

๐Ÿ‘‰ User request โ†’ diproses โ†’ aturan dijalankan โ†’ disimpan ke database

๐Ÿงฑ 2. Modul Utama (Fitur Awal)

Kita mulai dari fitur penting dulu:

  • ๐Ÿ‘ค User โ†’ data pengguna
  • ๐Ÿ’ฐ Wallet โ†’ dompet (saldo)
  • ๐Ÿ”„ Transaction โ†’ transaksi antar wallet
  • ๐Ÿ“’ Ledger โ†’ catatan semua uang masuk/keluar (INI PALING PENTING)
  • ๐Ÿ’ธ Transfer โ†’ kirim uang

๐Ÿ”‘ Kenapa Ledger Penting?

โŒ Cara salah:

plaintext
saldo = saldo - 1000

๐Ÿ‘‰ Bahaya! Bisa error kalau banyak transaksi bersamaan

โœ… Cara benar:

plaintext
catat ke ledger(DEBIT / CREDIT)

๐Ÿ‘‰ Saldo dihitung dari riwayat (ledger)

๐Ÿง  Analogi: Ledger itu seperti buku tabungan

โš ๏ธ 3. Cara Biar Aman (Anti Error)

Ini bagian paling penting ๐Ÿ”ฅ

๐Ÿ” Rule 1 โ€” Jangan Ubah Saldo Langsung

โŒ Salah:

plaintext
balance = balance - amount

โœ… Benar:

  • Simpan ke ledger dulu
  • Hitung saldo dari ledger

๐Ÿ” Rule 2 โ€” Pakai Lock Database

Contoh:

sql
SELECT * FROM wallets WHERE id = 1 FOR UPDATE;

๐Ÿ‘‰ Artinya: "Hei database, kunci data ini dulu, jangan ada yang ganggu"

๐Ÿง  Analogi: Kayak pegang kursi โ†’ orang lain nggak boleh duduk dulu

๐Ÿ” Rule 3 โ€” Idempotency (Anti Double Transaksi)

Setiap transaksi harus punya ID unik:

plaintext
transfer_id = unik

๐Ÿ‘‰ Kalau request dikirim 2x:

  • Tidak akan diproses 2x

๐Ÿง  Analogi: Kayak tiket bioskop โ†’ 1 tiket cuma bisa dipakai sekali

๐Ÿ” Rule 4 โ€” Sync vs Async

ProsesCara
Transfer uangSync (langsung)
NotifikasiAsync (belakangan)
Log / auditAsync

๐Ÿ‘‰ Uang harus langsung (biar aman)

๐Ÿ” Rule 5 โ€” Hindari Deadlock (PENTING BANGET)

โŒ Masalah Deadlock

Bayangkan:

  • A transfer 1 โ†’ 2
  • B transfer 2 โ†’ 1

Yang terjadi:

  • A pegang wallet 1, nunggu wallet 2
  • B pegang wallet 2, nunggu wallet 1

๐Ÿ’ฅ Keduanya stuck!

โœ… Solusi: Urutan Lock Konsisten

Selalu:

plaintext
lock wallet kecil โ†’ wallet besar

Contoh:

  • Transfer 1 โ†’ 2 โ†’ lock 1 lalu 2
  • Transfer 2 โ†’ 1 โ†’ tetap lock 1 lalu 2

๐Ÿ‘‰ Jadi tidak akan tabrakan

๐Ÿง  Analogi Simpel

Bayangkan jalan sempit:

  • Kalau orang masuk dari dua arah โ†’ macet
  • Kalau semua sepakat: "nomor kecil duluan" โ†’ lancar

๐Ÿ—‚๏ธ 4. Struktur Project (Go)

plaintext
fincore/
โ”‚
โ”œโ”€โ”€ cmd/            โ†’ main app
โ”œโ”€โ”€ internal/
โ”‚   โ”œโ”€โ”€ domain/     โ†’ aturan bisnis
โ”‚   โ”œโ”€โ”€ usecase/    โ†’ logika aplikasi
โ”‚   โ”œโ”€โ”€ repository/ โ†’ akses database
โ”‚   โ”œโ”€โ”€ infrastructure/ โ†’ DB, RabbitMQ
โ”‚   โ””โ”€โ”€ delivery/   โ†’ HTTP / gRPC
โ”‚
โ”œโ”€โ”€ pkg/            โ†’ helper
โ”œโ”€โ”€ configs/        โ†’ config
โ””โ”€โ”€ .env            โ†’ environment

๐Ÿงพ 5. Model Data (Sederhana)

๐Ÿ’ฐ Wallet

go
type Wallet struct {
    ID      string
    UserID  string
    Balance int64
}

๐Ÿ“’ Ledger (INI PALING PENTING)

go
type Ledger struct {
    WalletID string
    Amount   int64
    Type     string // DEBIT / CREDIT
}

๐Ÿ”„ Transaction

go
type Transaction struct {
    FromID string
    ToID   string
    Amount int64
}

๐Ÿ‡ 6. RabbitMQ (Event System)

Dipakai untuk:

  • Kirim notifikasi
  • Logging
  • Event transaksi

Contoh event:

  • transaction.created
  • transaction.success

โ— Tapi ingat:

๐Ÿ‘‰ JANGAN pakai RabbitMQ untuk update saldo

โœ… 7. Hasil Step 1

Kalau kamu sudah sampai sini, kamu sudah punya:

โœ… Desain sistem yang rapi

โœ… Sistem aman dari race condition

โœ… Sistem aman dari deadlock

โœ… Struktur project Go yang jelas

โœ… Fondasi fintech system ๐Ÿ”ฅ

Article Series

Go Financial Core System

Lanjutkan membaca seri ini untuk melihat perjalanan lengkapnya.

  1. 1
    Go Financial Core System - System Design
    29 Mar 20264 min readCurrent article
  2. 2
  3. 3