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