5.6 KiB
5.6 KiB
สรุปการปรับปรุงระบบลงเวลา (CheckInConsumer)
วันที่แก้ไข: 23 มิถุนายน 2026
ปัญหาเดิม
ตอนที่พนักงานลงเวลาพร้อมกันจำนวนมาก (ประมาณ 2,000 รายการ) ระบบประมวลผลทีละรายการ ทำให้ต้องรอคิวนานถึง 22 นาที กว่าจะประมวลผลเสร็จทั้งหมด
เปรียบเทียบเหมือน โต๊ะบัญชี 1 คน รับคิวทีละคน ทั้งที่มีคนรอ 2,000 คน → คิวยาวมาก
วิธีที่แก้ (เข้าใจง่าย ๆ)
1. เพิ่มคนช่วยประมวลผลพร้อมกัน (Concurrency)
- ก่อน: ประมวลผลทีละรายการ (เหมือนมีโต๊ะบัญชี 1 โต๊ะ)
- หลัง: ประมวลผลพร้อมกันได้สูงสุด 5 รายการ (เหมือนเปิดโต๊ะบัญชี 5 โต๊ะ)
ผลที่ได้: เวลารอคิวลดลงจาก 22 นาที → ประมาณ 4–5 นาที
2. จัดคิวล่วงหน้าให้ RabbitMQ (Prefetch)
- ก่อน: ระบบดึงข้อมูลมาทีละชิ้น ทำให้เสียเวลารอส่งต่อ
- หลัง: ระบบดึงข้อมูลมาเป็นชุด ๆ ละ 20 ชิ้นไว้เตรียมพร้อม → ลดเวลารอระหว่างรายการ
3. ลดเวลารอเมื่อ API มีปัญหา (Timeout)
- ก่อน: ถ้า API ค้าง ระบบจะรอนานถึง 5 นาที ต่อรายการ
- หลัง: ลดเหลือ 1 นาที → รายการที่มีปัญหาจะถูกปฏิเสธเร็วขึ้น ไม่ทำให้คิวค้าง
4. ปรับปรุงการเชื่อมต่อ HTTP
- เปลี่ยนระบบเชื่อมต่อให้รองรับการส่งคำขอหลายรายการพร้อมกันโดยไม่สะดุด
ตัวเลขเปรียบเทียบ
| รายการ | ก่อนแก้ | หลังแก้ |
|---|---|---|
| จำนวนรายการที่ประมวลผลพร้อมกัน | 1 | 5 |
| เวลารอคิวสูงสุด (2,000 รายการ) | ~22 นาที | ~4–5 นาที |
| เวลารอเมื่อ API มีปัญหา | 5 นาที | 1 นาที |
ไฟล์ที่แก้ไข
Program.cs— โค้ดหลักของตัวประมวลผลคิวappsettings.json— ไฟล์ตั้งค่าระบบ
วิธีปรับความเร็วเพิ่มเติม (ไม่ต้องเขียนโค้ดใหม่)
ถ้าหลังทดสอบแล้วเห็นว่าระบบรับได้ และอยากให้เร็วขึ้นอีก ให้แก้ไขไฟล์ appsettings.json แล้ว restart โปรแกรมได้เลย:
{
"MaxConcurrency": 10, ← เพิ่มจาก 5 เป็น 10 (ประมวลผลพร้อมกัน 10 รายการ)
"PrefetchCount": 50, ← ควรตั้งเป็น ประมาณ MaxConcurrency × 2 ขึ้นไป
"HttpTimeoutSeconds": 60 ← เวลารอ API วินาที
}
ค่าที่ใช้และผลที่คาดการณ์:
MaxConcurrency = 5→ ใช้เวลา ~4–5 นาที (ค่าเริ่มต้นปลอดภัย)MaxConcurrency = 10→ ใช้เวลา ~2–3 นาทีMaxConcurrency = 20→ ใช้เวลา ~1–2 นาที (ต้องตรวจสอบว่าระบบหลังบ้านรับไหวก่อน)
ข้อควรระวัง / คำแนะนำ
-
ควรทดสอบในระบบทดสอบก่อน โดยดูว่า
- ไม่มี error ในระบบหลัก (API)
- ฐานข้อมูลไม่ช้าผิดปกติ
- ไม่พบปัญหาลงเวลาซ้ำซ้อน
-
ถ้าพบปัญหา เช่น
- มี error ใน API → ลด
MaxConcurrencyเหลือ 2 หรือ 3 - ลงเวลาซ้ำ → แจ้งทีมเทคนิคเพื่อแก้ฝั่ง API เพิ่มเติม
- มี error ใน API → ลด
-
ค่า
MaxConcurrency = 5เป็นค่าปลอดภัย เพราะระบบ API ด้านหลังยังมีข้อจำกัดอยู่บางส่วน หากต้องการเพิ่มให้สูงกว่านี้ (เช่น 20–50) ควรปรึกษาทีมเทคนิคเพื่อปรับปรุงฝั่ง API ก่อน