ตัวอย่างผลลัพธ์ที่เกิดจากการ Auto Scale out ด้วย Azure App Service Plan
ทางทีมพึ่งมีการทำ Load Test บน Azure App Service Plan ที่มีการติดตั้ง Auto Scale Out ไว้ ผมเลยอยากนำผลลัพธ์ของการทำงานตรงนี้มาแบ่งปันกัน เผื่อท่านใดที่กำลังตัดสินใจใช้ Azure App Service ในการ Hosting App ของเราน่ะครับ
Azure App Service Plan คืออะไร
เป็น Cloud Service Model ของ Azure แบบ PaaS ที่ให้เราเลือก Web Server เพื่อนำมาประมวลผล Website ของเรา โดยที่ไม่ต้องกังวลในเรื่องของ Infrastructure เลย และยังมาพร้อมกับคุณสมบัติในเรื่องของ High Availability, Scale Up, Auto Scale Out ที่เราจะพูดถึงกันในบทนี้ด้วย
เราเพียงแค่เลือกว่าจะต้องการทำงานบนระบบปฎิบัติการไหน (Windows, Linux) เพราะจะมีผลกับทั้งราคาและบริการเสริมที่แตกต่างกัน
เรายังสามารถเลือกขนาดของ Web Server เพื่อให้ตอบโจทย์ต่อการทำงานเช่น Development/Test เราอาจจะเลือก Plan ที่มีไม่แรงมาก ซึ่งก็จะมีค่าใช้จ่ายที่ถูกกว่าหรือเลือกขนาดที่ใหญ่ขึ้นเพื่อใช้เป็น Production ต่อไป
Azure App Service คืออะไร
เป็น Cloud Service Model ของ Azure แบบ PaaS ที่ช่วยให้เราสามารถนำ Code หรือ Container ของเราไปรันเป็น Web App, RESTful API, Background Jobs ของเราได้โดยที่ไม่ต้องกังวลในเรื่องของ Infrastructure เลย การทำ CI/CD ก็ทำได้สะดวกมากเพราะมีวิธีที่รองรับหลากหลายรูปแบบ
รวมไปถึงยังมี Runtime ที่เตรียมมาให้พร้อมใช้งานในหลายภาษา เช่น Python, Node.js, PHP, ASP.Net/ASP.Net Core, Java เราแค่นำ Code หรือ Container ในภาษาเหล่านี้มาติดตั้งที่ App Service ก็พร้อมทำงานเลยครับ
บริการบน Azure App Service Plan / App Service
บริการหลักๆบน Azure App Service Plan จะมีให้เลือกระบบปฎิบัติการ 2 ระบบน่ะครับ ซึ่งการเลือกระบบปฎิบัติการนี้จะมีผลถึงบริการที่เราจะใช้งานได้ใน Azure App Service ต่อไป
ประเภทของ Azure App Service Plan
- Windows
- Linux
ประเภทของ Azure App Service
- Code เป็นการติดตั้ง Code ของเราเพื่อทำงานอยู่ภายใต้ Runtime ที่กำหนดครับ โดย Runtime ที่มีให้บริการจะขึ้นอยู่กับ App Service Plan ที่เลือก เช่นถ้าเราเลือก Plan Windows เราจะสามารถทำงาน ASP.Net ที่ต้องการ Windows Server ได้ หรือถ้าเราเลือก Plan Linux เราจะได้ Runtime Python, Ruby ซึ่งไม่มีใน Plan Windows นะครับ
- Container โดยเป็นการนำ Docker Image มาทำงานอยู่บน App Service ครับ ถ้าเราเลือก App Service Plan Windows จะเป็นการทำงานบน Windows Container น่ะครับ ส่วนถ้าเลือกเป็น App Service Plan Linux จะเป็นการทำงานบน Linux Container
ในบทความนี้จะผลลัพธ์จาก Azure App Service — Windows, Code นะครับ
ท่านใดสนใจในบริการต่างๆบน Azure App Service Plan/ App Service ผมได้ทำสรุปเป็นภาพข้างล่างมาให้น่ะครับ ^^
Scale Up and Scale Out
- Scale Up จะเป็นการจัดการกับทรัพยากรบน คอมพิวเตอร์เพียง 1 เครื่อง เพื่อทำให้มีประสิทธิภาพในการประมวลผลที่มากขึ้น ใช้สำหรับการรองรับการทำงานที่มีผู้ใช้มากขึ้นนะครับ เช่น การเพิ่มขนาดของ CPU, RAM
- Scale Out จะเป็นการนำคอมพิวเตอร์หลายๆเครื่องที่มี Runtime เหมือนกันมาช่วยกันประมวลให้รองรับการทำงานที่มากกว่าแบบ Scale Up ที่จะติดข้อจำกัดของเพิ่มทรัพยากรในคอมพิวเตอร์แค่ 1 เครื่องครับ
ข้อพึงระวังคือ Scale Out เหมาะสำหรับ Web Application แบบ Stateless ที่ไม่มี State ผูกอยู่กับเครื่องใดเครื่องนึงเท่านั้นนะครับ เพื่อให้ระบบทำงานได้อย่างถูกต้องเมื่อมีหลายๆ Instances จริงๆมีทางแก้คือใช้ Sticky Session แต่ก็จะทำให้มีปัญหาอื่นๆตามมาอีกครับ แนะนำให้ทำ Web เป็น Stateless เลยจะดีที่สุดครับผม
Azure App Service Plan — Scale Up
เป็นการเพิ่มการประมวลผลแบบ Scale Up บน Azure App Service ครับ โดยเราสามารถเลือก Packages ที่ Azure ซึ่งขั้นตอนการเปลี่ยนแปลงทำได้อย่างสะดวกรวดเร็วมากครับ
Azure App Service Plan — Scale Out
เป็นการเพิ่มการประมวลผลแบบ Scale Out บน Azure App Service ครับ ซึ่งจะแบ่งออกเป็น 2 ประเภท
- Manual Scale เป็นการแก้ไขแบบ Manual ครับตรงตามชื่อเลย
- Custom Autoscale ความเจ๋งคือตัวนี้ครับ เราสามารถเขียนเงื่อนไขเพื่อให้ระบบ Scale Out (เพิ่ม Instance) หรือ Scale In(ลด Instance) ได้อัตโนมัติเลยครับ
Azure App Service Plan — Auto Scaleout
ผมทำการสร้างเงื่อนไขไว้แบบนี้น่ะครับ
- เพิ่ม Instance (Scale Out) เมื่อค่าเฉลี่ยการทำงานของ CPU มีค่ามากกว่า 80% เป็นระยะเวลา 10 นาที
- ลด Instance (Scale In) เมื่อค่าเฉลี่ยการทำงานของ CPU มีค่าน้อยกว่า 50% เป็นระยะเวลา 10 นาที
อีกอย่างที่ต้องระบุลงไปคือจำนวน Instances ที่เราจะเพิ่มเพื่อให้อยู่ในค่าใช้จ่ายที่เราจ่ายไหว สมมติ 1 Plan มีค่าใช้จ่าย 80 USD ถ้าเพิ่มกลายเป็น 2 Instances ค่าใช้จ่ายก็จะคูณ 2 กลายเป็น 160 USD ไปเลยครับ
- Minimum จำนวนขั้นต่ำของ Instances ผมให้เป็น 1 ไว้ก่อนจะได้ประหยัดค่าใช้จ่ายครับ
- Maximum จำนวน Instances ที่มีได้มากที่สุดครับ ผมให้เป็น 4 เพื่อที่จะควบคุมรายจ่ายไม่ให้เกิน 4 เท่าของ App Service Plan ที่เลือก
- Default จำนวน Instance ที่ระบบจะปรับกลับมาถ้าเกิดความผิดพลาดในการตรวจสอบการทำ Autoscaleout ครับ
ผลลัพธ์
เมื่อวิเคราะห์จากภาพข้างบนเราจะพบว่า
- ระบบมีการ Scale Out สองครั้ง โดยเพิ่ม Instance จาก 1 เป็น 2 เป็น 3 เพราะ CPU มีการใช้งานเกิน 80% ตามที่เราระบุไว้ในเงื่อนไข
- หลังจากนั้นระบบก็ทำการ Scale In อีก 2 ครั้ง โดยลด Instance จาก 3 เป็น 2 เป็น 1 เพราะ CPU มีการใช้งานที่น้อยลงกว่า 50%
- ข้อดีของ Azure คือเรา Set Notification ได้ด้วยว่าเมื่อไหร่ก็ตามที่มีการทำงาน Auto Scaleout ให้ระบบส่ง Email หา Admin เพื่อมาตรวจสอบในภายหลังครับ
- เราสามารถตรวจสอบผลของการ Scale Out และการใช้งาน CPU ได้ผ่าน Dashboard บน Azure เลยครับ สะดวกมากมาย อิอิ
จบแล้วครับผม
ขอบคุณผู้อ่านทุกท่านมากๆนะครับ