hrms-api-backend/BMA.EHR.CheckInConsumer/CHANGELOG-checkin-speedup.md
Suphonchai Phoonsawat 5f678b2898
Some checks failed
Build & Deploy Checkin Service / build (push) Failing after 40s
แก้ปัญหา RabbitMQ ประมวลผลในคิวช้า และรอคิวนาน
2026-06-23 11:25:50 +07:00

5.6 KiB
Raw Blame History

สรุปการปรับปรุงระบบลงเวลา (CheckInConsumer)

วันที่แก้ไข: 23 มิถุนายน 2026


ปัญหาเดิม

ตอนที่พนักงานลงเวลาพร้อมกันจำนวนมาก (ประมาณ 2,000 รายการ) ระบบประมวลผลทีละรายการ ทำให้ต้องรอคิวนานถึง 22 นาที กว่าจะประมวลผลเสร็จทั้งหมด

เปรียบเทียบเหมือน โต๊ะบัญชี 1 คน รับคิวทีละคน ทั้งที่มีคนรอ 2,000 คน → คิวยาวมาก


วิธีที่แก้ (เข้าใจง่าย ๆ)

1. เพิ่มคนช่วยประมวลผลพร้อมกัน (Concurrency)

  • ก่อน: ประมวลผลทีละรายการ (เหมือนมีโต๊ะบัญชี 1 โต๊ะ)
  • หลัง: ประมวลผลพร้อมกันได้สูงสุด 5 รายการ (เหมือนเปิดโต๊ะบัญชี 5 โต๊ะ)

ผลที่ได้: เวลารอคิวลดลงจาก 22 นาที → ประมาณ 45 นาที

2. จัดคิวล่วงหน้าให้ RabbitMQ (Prefetch)

  • ก่อน: ระบบดึงข้อมูลมาทีละชิ้น ทำให้เสียเวลารอส่งต่อ
  • หลัง: ระบบดึงข้อมูลมาเป็นชุด ๆ ละ 20 ชิ้นไว้เตรียมพร้อม → ลดเวลารอระหว่างรายการ

3. ลดเวลารอเมื่อ API มีปัญหา (Timeout)

  • ก่อน: ถ้า API ค้าง ระบบจะรอนานถึง 5 นาที ต่อรายการ
  • หลัง: ลดเหลือ 1 นาที → รายการที่มีปัญหาจะถูกปฏิเสธเร็วขึ้น ไม่ทำให้คิวค้าง

4. ปรับปรุงการเชื่อมต่อ HTTP

  • เปลี่ยนระบบเชื่อมต่อให้รองรับการส่งคำขอหลายรายการพร้อมกันโดยไม่สะดุด

ตัวเลขเปรียบเทียบ

รายการ ก่อนแก้ หลังแก้
จำนวนรายการที่ประมวลผลพร้อมกัน 1 5
เวลารอคิวสูงสุด (2,000 รายการ) ~22 นาที ~45 นาที
เวลารอเมื่อ API มีปัญหา 5 นาที 1 นาที

ไฟล์ที่แก้ไข

  1. Program.cs — โค้ดหลักของตัวประมวลผลคิว
  2. appsettings.json — ไฟล์ตั้งค่าระบบ

วิธีปรับความเร็วเพิ่มเติม (ไม่ต้องเขียนโค้ดใหม่)

ถ้าหลังทดสอบแล้วเห็นว่าระบบรับได้ และอยากให้เร็วขึ้นอีก ให้แก้ไขไฟล์ appsettings.json แล้ว restart โปรแกรมได้เลย:

{
  "MaxConcurrency": 10,        เพิ่มจาก 5 เป็น 10 (ประมวลผลพร้อมกัน 10 รายการ)
  "PrefetchCount": 50,         ควรตั้งเป็น ประมาณ MaxConcurrency × 2 ขึ้นไป
  "HttpTimeoutSeconds": 60     เวลารอ API วินาที
}

ค่าที่ใช้และผลที่คาดการณ์:

  • MaxConcurrency = 5 → ใช้เวลา ~45 นาที (ค่าเริ่มต้นปลอดภัย)
  • MaxConcurrency = 10 → ใช้เวลา ~23 นาที
  • MaxConcurrency = 20 → ใช้เวลา ~12 นาที (ต้องตรวจสอบว่าระบบหลังบ้านรับไหวก่อน)

ข้อควรระวัง / คำแนะนำ

  1. ควรทดสอบในระบบทดสอบก่อน โดยดูว่า

    • ไม่มี error ในระบบหลัก (API)
    • ฐานข้อมูลไม่ช้าผิดปกติ
    • ไม่พบปัญหาลงเวลาซ้ำซ้อน
  2. ถ้าพบปัญหา เช่น

    • มี error ใน API → ลด MaxConcurrency เหลือ 2 หรือ 3
    • ลงเวลาซ้ำ → แจ้งทีมเทคนิคเพื่อแก้ฝั่ง API เพิ่มเติม
  3. ค่า MaxConcurrency = 5 เป็นค่าปลอดภัย เพราะระบบ API ด้านหลังยังมีข้อจำกัดอยู่บางส่วน หากต้องการเพิ่มให้สูงกว่านี้ (เช่น 2050) ควรปรึกษาทีมเทคนิคเพื่อปรับปรุงฝั่ง API ก่อน