Simple Bank — ระบบจัดการธุรกรรมและการโอนเงินจำลอง

โปรเจกต์ Backend จำลองระบบธุรกรรมธนาคาร พัฒนาด้วย Go (Golang) และ PostgreSQL เพื่อฝึกฝนทักษะ Backend เชิงลึก: การจัดการ Database Transaction แบบ ACID, การแก้ปัญหา Deadlock เมื่อมีคำสั่งโอนเงินพร้อมกัน (Concurrency), ระบบบัญชีคู่ (Double-entry Ledger) และความปลอดภัยด้วย PASETO Token

Simple Bank — ระบบจัดการธุรกรรมและการโอนเงินจำลอง
คลิกเพื่อขยาย

เทคโนโลยีที่ใช้

GoPostgreSQLDockerGinPASETORESTful APIACID TransactionsConcurrency

เกี่ยวกับผลงานนี้

Simple Bank เป็นโปรเจกต์ Backend Engineering ที่สร้างขึ้นด้วยภาษา Go (Golang) และ PostgreSQL โดยมีเป้าหมายหลักคือการฝึกฝนและทำความเข้าใจแก่นของการพัฒนาระบบ Backend ระดับ Production โดยเฉพาะระบบการเงินที่มีความอ่อนไหวสูงเรื่องความถูกต้องของข้อมูล (Data Consistency) และการรองรับคำสั่งพร้อมกันจำนวนมาก (High Concurrency)

🎯 เป้าหมายในการฝึกฝนและสิ่งที่ได้ลงมือทำจริง

  1. การจัดการ ACID Transactions และแก้ปัญหา Deadlock:

    • ออกแบบระบบโอนเงินผ่าน Database Transaction เพื่อให้แน่ใจว่าเงินถูกตัดและเพิ่มพร้อมกันอย่างถูกต้อง (Atomicity)
    • แก้ปัญหา Cycle Deadlock จากการโอนเงินสวนทางกันพร้อมกัน (เช่น บัญชี 1 โอนให้ 2 ในขณะที่บัญชี 2 โอนให้ 1 พร้อมกัน) ด้วยเทคนิค Strict Consistent Lock Ordering โดยจัดลำดับให้ Transaction เข้าไปล็อก Row ของ Account ID ที่น้อยกว่าก่อนเสมอ ไม่ว่าจะโอนไปทิศทางไหน
  2. ระบบบัญชีคู่ (Double-Entry Bookkeeping Ledger):

    • บันทึกการเคลื่อนไหวของเงินลงในตาราง transfers และ entries ตามหลักการทางบัญชี ทุกยอดเงินเข้า-ออกมีประวัติที่ตรวจสอบย้อนหลังได้ (Audit Trail) โดยไม่มีการแก้ไขหรือลบยอดเงินเดิมโดยตรง
  3. ความปลอดภัยและการยืนยันตัวตนด้วย PASETO:

    • เลือกใช้ PASETO (Platform-Agnostic Security Tokens) ที่ใช้ Symmetric Encryption (v2.local) ซึ่งมีความปลอดภัยสูงและลดช่องโหว่เมื่อเทียบกับ JWT ทั่วไป
    • เข้ารหัสรหัสผ่านด้วย bcrypt และสร้าง Custom Auth Middleware ตรวจสอบสิทธิ์เจ้าของบัญชีอย่างรัดกุม
  4. สถาปัตยกรรมโค้ดและการตรวจสอบข้อมูล (Clean Architecture & Validation):

    • จัดโครงสร้างโค้ดแบบแยกเลเยอร์ชัดเจน: API Router/Handler, DB Store/Transaction, Token Maker และ Util
    • สร้าง Custom Validator สำหรับตรวจสอบความถูกต้องของรหัสสกุลเงิน (Currency Validation เช่น USD, EUR, CAD) ในระดับ Request Payload
  5. การทดสอบความถูกต้องและ Concurrency Test:

    • เขียน Unit Test และ Concurrency Test ด้วย Go testing + testify โดยยิงคำสั่งโอนเงินคู่ขนานผ่าน Goroutines หลายรายการพร้อมกัน เพื่อพิสูจน์ว่ายอดเงินคงเหลือถูกต้อง 100% และไม่มี Race Condition
  6. DevOps & Database Migrations:

    • รัน PostgreSQL ใน Container ด้วย Docker Compose
    • จัดการ Version ของ Database Schema ด้วย golang-migrate และรวมคำสั่งอำนวยความสะดวกไว้ใน Makefile

รูปเพิ่มเติม

4