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:
Client โ Handler โ Usecase โ Domain โ InfrastructureArtinya:
๐ 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:
saldo = saldo - 1000๐ Bahaya! Bisa error kalau banyak transaksi bersamaan
โ Cara benar:
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:
balance = balance - amountโ Benar:
- Simpan ke ledger dulu
- Hitung saldo dari ledger
๐ Rule 2 โ Pakai Lock Database
Contoh:
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:
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
| Proses | Cara |
|---|---|
| Transfer uang | Sync (langsung) |
| Notifikasi | Async (belakangan) |
| Log / audit | Async |
๐ 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:
lock wallet kecil โ wallet besarContoh:
- 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)
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
type Wallet struct {
ID string
UserID string
Balance int64
}๐ Ledger (INI PALING PENTING)
type Ledger struct {
WalletID string
Amount int64
Type string // DEBIT / CREDIT
}๐ Transaction
type Transaction struct {
FromID string
ToID string
Amount int64
}๐ 6. RabbitMQ (Event System)
Dipakai untuk:
- Kirim notifikasi
- Logging
- Event transaksi
Contoh event:
transaction.createdtransaction.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.
- 1Go Financial Core System - System Design29 Mar 20264 min readCurrent article
- 2Go Financial Core System - Setup Database29 Mar 20263 min read
- 3Go Financial Core System - Handling Race Condition30 Mar 202616 min read