ข้ามไปยังเนื้อหา
โปรเจกต์ทั้งหมด

เผยแพร่แล้วแนะนำ

ระบบประมูลยานพาหนะแบบปิดราคา

แพลตฟอร์มขายรถยึดและรถคืนสัญญาให้ดีลเลอร์ด้วยการประมูลแบบปิดราคา รอบเปิดและปิดตามเวลาที่ตั้งไว้ ไม่มีใครเห็นราคาของคนอื่น และระบบตัดสินผู้ชนะเอง รวมถึงเปิดรอบตัดสินใหม่เมื่อมีคนเสนอราคาเท่ากัน

  • Go
  • Gin
  • PostgreSQL
  • RabbitMQ
  • Redis
  • Next.js
  • React
  • TypeScript
  • Centrifugo
  • MinIO
  • Keycloak
  • Docker

ภาพรวม

บริษัทสินเชื่อย่อมมีรถที่ไม่ได้ตั้งใจจะถือไว้ ทั้งรถยึด รถคืนสัญญา และรถที่เคลมประกัน การขายทีละคันนั้นช้า ส่วนการประมูลแบบเปิดก็เปิดช่องให้ฮั้วกันได้ ระบบนี้จึงขายแบบ ปิดราคา ดีลเลอร์เห็นตัวรถแต่ไม่เห็นราคาของกันและกัน รอบปิดตามเวลาที่กำหนด และระบบสรุปผู้ชนะทันทีที่รอบจบ

ฝ่ายหลังบ้านนำเข้ารายการรถจากไฟล์สเปรดชีต ระบบแบ่งเป็นรอบและเลนตลอดวันประมูล ดีลเลอร์เลือกดู เก็บรายการที่สนใจ แล้วเสนอราคา ผู้ชนะได้กำหนดเวลาชำระเงิน ส่วนรถที่ไม่มีคนเสนอจะถูกยกไปรอบถัดไปโดยอัตโนมัติ

ส่วนที่ท้าทายในการสร้าง

การปิดรอบไม่ได้ใช้การนับถอยหลัง ตัวจับเวลาที่อยู่ในหน่วยความจำจะตายไปพร้อมโปรเซส และคลาดเคลื่อนเมื่อมีหลายเครื่อง ระบบนี้จึงบันทึกเป็นงานในตารางพร้อมเวลาที่ต้องทำ ตัว worker คอยดึงงานด้วย SELECT … FOR UPDATE SKIP LOCKED จึงรันหลายตัวพร้อมกันได้โดยไม่มีทางหยิบงานเดียวกันซ้ำ ก่อนทำงานจริงจะอ่านรอบนั้นใหม่แล้วเทียบว่าเวลาปิดยังตรงกับตอนที่ตั้งงานไว้หรือไม่ การเทียบครั้งเดียวนี้เองที่ทำให้ขยายเวลารอบได้อย่างปลอดภัย เพราะงานเก่าจะตื่นมาเห็นว่าเวลาเปลี่ยนแล้วและจบตัวเองไป

การจัดอันดับ การเสมอ และร่องรอยที่ตรวจสอบได้ ระบบไม่เคยแก้ราคาเดิมทับ การเสนอราคาใหม่จะยกเลิกรายการเดิมแบบมีเหตุผลกำกับแล้วบันทึกแถวใหม่ ประวัติจึงเป็นแบบเพิ่มอย่างเดียวและย้อนดูได้เมื่อมีข้อโต้แย้ง ลำดับก็ไม่ได้ตัดสินตอนบันทึก แต่ตัดสินตอนปิดรอบโดยเรียงตามราคาแล้วตามเวลาที่เข้ามา ถ้ามีผู้เสนอสูงสุดคนเดียวก็ชนะไป แต่ถ้าเท่ากันตั้งแต่สองคนขึ้นไป ระบบจะไม่สุ่ม แต่เปิด รอบย่อย ที่ตั้งราคาเริ่มต้นเท่ากับราคาที่เสมอกัน และให้สิทธิ์เฉพาะคนที่เสมอเท่านั้น

เรียลไทม์ที่ใช้ให้ถูกที่ มีเซิร์ฟเวอร์ push อยู่หน้าเบราว์เซอร์ แต่ไม่ได้อยู่ในเส้นทางการเสนอราคา การบิดยังเป็น request ธรรมดาที่ผ่านการตรวจและบันทึกลงฐานข้อมูล ส่วนช่อง push ใช้ส่งการแจ้งเตือนรายบุคคล และฝั่งเบราว์เซอร์ตอบสนองด้วยการล้างแคชแล้วดึงข้อมูลใหม่ ราคาไม่เคยถูกส่งมาเป็นเนื้อหาของข้อความ การที่การเชื่อมต่อหลุดจึงไม่มีทางทำให้ดีลเลอร์คนหนึ่งเห็นตัวเลขเก่าขณะที่อีกคนเห็นของจริง

โครงสร้างระบบ

สามสิบสอง deployable แบ่งเป็นสี่ชั้น ได้แก่ gateway แยกตามกลุ่มผู้ใช้ ชั้นประสานงาน ชั้น business และชั้นข้อมูลที่แต่ละตัวเป็นเจ้าของตารางตัวเอง งานที่ผูกกับเวลาเดินผ่าน message queue ส่วนที่เหลือคุยกันด้วย REST ระหว่างชั้น การอัปโหลดรูปใช้สองขั้น คือเก็บไว้ที่คีย์ชั่วคราวก่อนแล้วค่อยย้ายเมื่อบันทึกจริง ฟอร์มที่ถูกทิ้งกลางคันจึงไม่ทิ้งไฟล์ค้างไว้

ขนาด

  • 32 service · 114 ตารางฐานข้อมูล · ราว 2,000 route
  • 102 หน้าจอ รวมฝั่งพนักงานและฝั่งดีลเลอร์
  • รองรับสองภาษา เฉพาะโดเมนประมูลมี 17 ตารางและ 37 migration
สถานะ
เผยแพร่แล้ว
เผยแพร่เมื่อ
12 ก.ย. 2026
เทคโนโลยี
Go · Gin · PostgreSQL · RabbitMQ · Redis · Next.js · React · TypeScript · Centrifugo · MinIO · Keycloak · Docker

ดูต่อ

โปรเจกต์อื่น ๆ

โปรเจกต์ทั้งหมด