ปัญหาที่เจอ
ในระบบ Web หรือ API ที่พัฒนาด้วย .Net + C# นั้น
พบว่าเมื่อเราทำการ start server ขึ้นมาแล้ว
request แรกที่เข้ามาจะช้ามาก ๆ
เมื่อเทียบกับ request ต่อ ๆ มา
จะแก้ไขอย่างไรดี ?

ตัวอย่างของปัญหา ซึ่งความเร็วต่างกันมาก ๆ

เป็น code ที่ถูกสร้างมาจาก default project
เพื่อทำการ reproduce ปัญหา ดังนี้

วิธีการแก้ไขปัญหามีอะไรบ้าง ?

ลองคิดกันดูครับ ก่อนดูในบรรทัดต่อไป …

จากที่คิดคือ ถ้าง่ายสุด ๆ ก็ทำการยิง request แรกก่อนเลย

ซึ่งเป็นการยิงจากระบบของเราเองในขั้นตอนสุดท้าย
หลังจากการ deployก่อนที่จะเปิดให้ใช้งาน
ผมคิดว่า น่าจะเป็น workaround มากกว่านะ
แต่ก็ง่ายที่สุดแล้ว !!

การทำก็ง่าย ๆ คือ สร้าง endpoint ขึ้นมา

เพื่อใช้สำหรับตรวจสอบความพร้อมของ Web หรือ API
หรือจะเรียกว่า Health Check แบบ readiness นั่นเอง
จากนั้นถ้าใช้พวก Docker หรือ Kubernetes ก็สามารถนำไปใส่ได้

แน่นอนว่า จะทำการส่ง request ไปยัง endpoint ก่อนเลย
เท่านี้ก็จบแล้ว

แต่ถ้าไม่ได้ใช้ Docker หรือ Kubernetes ละ ทำอย่างไร ?

ลองทำการ warmup หรือเรียก endpoint ที่กำหนดไว้เองเลย

โดยทำการสร้าง class ที่ implements IHostedService มา
จากนั้นทำการเรียก endpoint หลังจากที่ server ทำการ start เรียบร้อยแล้ว
ด้วยการใช้งาน HTTPClient นั่นเอง
ซึ่งวิธีการนี้ก็ง่ายดี
แต่ต้องเข้าในลำดับของการ start server นิดหน่อย

มาดู code ง่าย ๆ กัน
สร้าง Warmup service สำหรับส่ง request ไปยัง Endpoint URL ที่ต้องการ

ทำการ start service หลังจากที่ server start เสร็จแล้ว

ผลการทดสอบเป็นดังนี้

รวม ๆ แล้วคือการกระตุ้นการทำงานของ request แรกนั่นเอง

ก็น่าจะช่วยให้แก้ไขปัญหาที่พบเจอได้เช่นกัน
ตามจริงเราสามารถ initial service ต่าง ๆ
ทั้ง singleton และ non-singleton ได้อีกนะ
หรือถ้ายิง Endpoint ที่ต้องการหรือทั้งหมดก็ได้
แต่คิดว่า น่าจะซับซ้อนเกินไปหน่อย

อาจจะเขียน script สำหรับการ start service อีกก็ได้
ซึ่งทั้งหมดนี้ น่าจะเป็นเพียง workaround เท่านั้น