ปัญหาที่เจอ
ในระบบ Web หรือ API ที่พัฒนาด้วย .Net + C# นั้น
พบว่าเมื่อเราทำการ start server ขึ้นมาแล้ว
request แรกที่เข้ามาจะช้ามาก ๆ
เมื่อเทียบกับ request ต่อ ๆ มา
จะแก้ไขอย่างไรดี ?
ตัวอย่างของปัญหา ซึ่งความเร็วต่างกันมาก ๆ
เป็น code ที่ถูกสร้างมาจาก default project
เพื่อทำการ reproduce ปัญหา ดังนี้
วิธีการแก้ไขปัญหามีอะไรบ้าง ?
ลองคิดกันดูครับ ก่อนดูในบรรทัดต่อไป ...
จากที่คิดคือ ถ้าง่ายสุด ๆ ก็ทำการยิง request แรกก่อนเลย
ซึ่งเป็นการยิงจากระบบของเราเองในขั้นตอนสุดท้าย
หลังจากการ deployก่อนที่จะเปิดให้ใช้งาน
ผมคิดว่า น่าจะเป็น workaround มากกว่านะ
แต่ก็ง่ายที่สุดแล้ว !!
การทำก็ง่าย ๆ คือ สร้าง endpoint ขึ้นมา
เพื่อใช้สำหรับตรวจสอบความพร้อมของ Web หรือ API
หรือจะเรียกว่า Health Check แบบ readiness นั่นเอง
จากนั้นถ้าใช้พวก Docker หรือ Kubernetes ก็สามารถนำไปใส่ได้
- Docker ใช้ Health check
- Kubernetes ใช้งาน ReadinessProbe
แน่นอนว่า จะทำการส่ง 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 เสร็จแล้ว
[gist id="647689dbc084b1d0e328554521008a10" file="Program.cs"]ผลการทดสอบเป็นดังนี้
[gist id="647689dbc084b1d0e328554521008a10" file="2.txt"]รวม ๆ แล้วคือการกระตุ้นการทำงานของ request แรกนั่นเอง
ก็น่าจะช่วยให้แก้ไขปัญหาที่พบเจอได้เช่นกัน
ตามจริงเราสามารถ initial service ต่าง ๆ
ทั้ง singleton และ non-singleton ได้อีกนะ
หรือถ้ายิง Endpoint ที่ต้องการหรือทั้งหมดก็ได้
แต่คิดว่า น่าจะซับซ้อนเกินไปหน่อย
อาจจะเขียน script สำหรับการ start service อีกก็ได้
ซึ่งทั้งหมดนี้ น่าจะเป็นเพียง workaround เท่านั้น