Cloud Native 101
สวัสดีครับทุกท่าน วันนี้ผมมีบทความมาแชร์เรื่อง Cloud Native
หลาย ๆ คนน่าจะเคยเห็น เคยได้ยินคำ ๆ นี้แล้วอาจจะสงสัย บทความนี้มีคำตอบครับ
ก่อนจะไปเรื่อง Cloud , Cloud Native ผมอยากจะขอเกริ่นคร่าว ๆ เกี่ยวกับ Software Development ก่อนนะครับ
Server and Resources
โดยปกติแล้ว ถ้าเราจะทำเว็ปไซต์นึงมาให้คนใช้งาน เราก็จะเขียน code สร้างเว็ปขึ้นมา แล้วเอาไปรันบนเครื่อง server ซึ่ง resource หลัก ๆ ที่ใช้ก็คือ cpu กับ ram นั่นเองครับ
ช่วงแรก ๆ คนใช้งานยังไม่เยอะก็อาจจะยังไม่เกิดปัญหาอะไร แต่พอวันนึงเว็ปเราเป็นที่รู้จัก คนเข้ามาใช้งานมากขึ้น อาจจะทำให้เว็ปเราช้าหรืออาจจะล่มได้ เราสามารถแก้ได้ง่าย ๆ โดยการเพิ่ม cpu เพิ่ม ram เข้าไปครับ
ปัญหามีอยู่ว่า บางวันคนเข้ามาน้อย ทำให้ resource (cpu, ram) ที่เราซื้อมาเพิ่มแล้วอาจจะใช้ไม่คุ้ม บางวันคนเข้ามาเยอะ ทำให้เราไม่สามารถเพิ่ม resource ได้ทัน
อีกทั้งเวลาที่เราจะเพิ่ม-ลด resource เนี่ย ก็ต้องใช้คนมา manual เปลี่ยนหน้างานก็จะมีค่า operation ต่าง ๆ เพิ่มขึ้นมา ปัญหานี้สามารถถูกแก้ไขได้ด้วย Cloud ครับ
Cloud
Cloud หรือเรียกเต็ม ๆ ว่า Cloud Computing ซึ่งก็คือ resource (เช่น cpu, ram) รวมถึง Software ต่าง ๆ ที่พร้อมให้เราใช้งานตามที่เราต้องการผ่าน internet นั่นเอง
เราสามารถใช้งาน Cloud เบื้องต้นได้โดยการเลือกใช้บริการจาก Cloud Provider เช่น Google Cloud Platform, AWS , Azure เป็นต้น หลังจากนั้นก็เลือก resource ของเครื่อง server ที่เราต้องการ ไม่ว่าจะเป็น cpu, gpu, ram, storage ได้เลยครับ Cloud Provider ก็จะคำนวณราคามาให้เราทันที
การใช้ Cloud มีข้อดีหลายอย่างครับ เช่น
- Flexible — ทำให้เราสามารถปรับเพิ่ม-ลด Resouce ได้ตามต้องการ อีกทั้งให้เราเข้าถึงเครื่อง Server ได้ตลอดเวลาผ่าน Internet อีกด้วย
- Secure — Cloud มีกลไกการรักษาความปลอดภัยสูง ซึ่งดูแลโดย top experts ที่มีความเชี่ยวชาญโดยเฉพาะ
- Cost-effective — ไม่ว่าเราจะใช้บริการไหนบน Cloud เราจะจ่ายเงินตาม Resource ที่เราได้ใช้ไปเท่านั้น หรือที่เรียกกันว่า Pay as you go นั่นเอง
ข้อดีของการใช้ Cloud ไม่ได้มีเพียงเท่านี้ สามารถดูเพิ่มเติมได้ที่นี่
Cloud Native
กลับมาที่หัวข้อหลักของเรากันครับ Cloud Native คืออะไร ? จริง ๆ แล้ว Cloud Native ไม่ใช่ Cloud และก็ไม่ใช่ Cloud Provider ครับ
Cloud Native เป็นแนวทางนึงในการสร้าง Application ขึ้นมา ที่เน้นใช้ความสามารถต่าง ๆ ของ cloud ( เช่นเรื่อง scalable, cost-effective เป็นต้น ) ซึ่ง application ที่สร้างขึ้นมาตามแนวทางนี้เราจะเรียกกันว่า Cloud Native Application เรายังมี Cloud Native Computing Foundation (CNCF) ช่วยนิยามสิ่งนี้เอาไว้ให้อีกด้วย
Cloud native technologies empower organizations to build and run scalable applications in modern, dynamic environments…
These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil.
— Cloud Native Computing Foundation, CNCF Cloud Native Definition v1.0
จากคำนิยามจาก CNCF เรากล่าวได้ว่า เทคโนโลยีเกี่ยวกับ Cloud Native จะช่วยให้องค์กรต่าง ๆ สามารถสร้าง Cloud Native Application ขึ้นมา และยิ่งเมื่อรวมเข้ากับ Automation system ต่าง ๆ แล้ว จะทำให้เราสามารถสร้าง high impact changes บน application ของเราได้บ่อยขึ้นและสามารถคาดการณ์ผลลัพธ์ได้โดยที่เราไม่ต้องลงแรงอะไรมากมายเลยทีเดียว
เราจะพบว่า จริง ๆ แล้ว Cloud Native Application ไม่ใช่แค่อะไรที่เอาไปรันให้ทำงานอยู่บน cloud เฉย ๆ แต่ต้องเป็น application ที่ใช้ความสามารถของ cloud ได้อย่างเต็มที่ รวมถึงมีความสามารถในการ scalable, loosely coupled, resilient, manageable และ observable อีกด้วย แต่ละตัวมีความหมายเฉพาะเจาะจง เราจะไปดูกันครับว่าแต่ละตัวคืออะไร
Scalability
ในมุมของ cloud native แล้ว scalability หมายถึงการที่ระบบของเรายังคงสามารถทำงานต่อไปได้อย่างปกติไม่ว่าจะมีผู้ใช้งานเข้ามามากหรือน้อย โดยที่เราไม่จำเป็นต้องเข้าไปแก้ไข code หรือทำอะไรเพิ่มเติมเลย การ scale มีอยู่ด้วยกัน 2 ชนิด
- Vertical scaling (scaled up) หลักการง่าย ๆ เลยก็คือ ถ้า resource ไหนไม่พอ เราก็จะเพิ่มเข้าไป
- Horizontal scaling (scaled out) ก็คือการเพิ่ม/ลด จำนวน instance ที่ใช้ในการรัน application ซึ่งมักจะมี load balancer มาคอยช่วยกระจาย traffic ไปยัง instance ต่าง ๆ อีกทีนึง
โดยทั่วไปแล้ว Vertical scaling มักจะมีข้อจำกัดทางด้าน resource เราไม่สามารถเพิ่ม ram, cpu ไปได้เรื่อย ๆ บน server หนึ่งเครื่องเพื่อรองรับผู้ใช้งานหลักล้านคน ดังนั้น Horizontal scaling มักจะเป็นทางเลือกที่ดีกว่าเมื่อต้องการ scale ระดับพันเท่าเท่า หมื่นเท่า..
Loose Coupling
Loose coupling เป็นแนวทางนึงในการออกแบบระบบเพื่อให้ service ต่าง ๆ ที่อยู่ใน application มีความอิสระต่อกันมากที่สุด นั่นหมายความว่าแต่ละ service สามารถที่จะถูกสร้างขึ้นมาใหม่ เปิดให้คนใช้งาน และ scale ได้โดยมีผลกระทบต่อ service อื่น ๆ น้อยที่สุด
Resilience
Resilience ในที่นี้ จะหมายถึงการที่ระบบยังคงสามารถทำงานได้ต่อไป ไม่ว่าจะเจอ error หรือมีอะไรสักอย่างล่มในระบบ ในการออกแบบระบบใหญ่ ๆ เรามักจะมีการติดต่อสื่อสารกันระหว่างหลาย ๆ service ถ้าเกิดว่ามี service นึงล่มขึ้นมา ระบบทั้งหมดของเราไม่ควรล่มตามนั่งเอง
ระบบที่มีความ resilience จะช่วยลดผลกระทบต่อภาพรวมได้มากกว่า อีกทั้งยังให้ประสบการณ์ที่ดีกว่าแก่ผู้ใช้งานอีกด้วย
มีหลายเทคนิคในการทำระบบให้ resilience เช่น การตั้ง Timeout , การทำ Circuit breakers , การ Monitoring health checks เป็นต้น หากเราต้องการระบบที่มี availability ที่สูงมาก ๆ เราอาจจะต้องนึกถึงเรื่องการทำ Failover storage, Hot standby service เพื่อหากว่าเกิดเหตุการระบบหลักล่ม เราก็ยังคงมี storage และ standby service ที่พร้อมให้บริการได้แบบทันที
Cloud provider หลายเจ้ายังช่วยให้คำแนะนำและแนวทางสำหรับ application ที่ต้องการ availability สูงอีกด้วย เช่น Designing resilient systems จากฝั่ง GCP และ Availability sets จากฝั่ง Microsoft เป็นต้น
Manageability
Manageability ในที่นี้ คือการที่ระบบเราสามารถเปลี่ยนแปลงพฤติกรรมบางอย่างที่เราต้องการในระบบได้ง่ายโดยที่เราไม่ต้องแก้ไข code อะไรเลย ตัวอย่างที่เห็นภาพได้ชัดที่สุดคือ ถ้าเรา hardcode ค่าของ database url เอาไว้ใน code ของเรา เวลาเราต้องการเปลี่ยนไปใช้ database server อื่น ๆ เราก็ต้องมานั่งแก้ code เพื่อ update ตัว database url ทางที่ถูกเราควรแยก database url ออกมาเป็น environment variable เพื่อที่เราจะสามารถ config ค่าได้โดยไม่จำเป็นต้องแก้ไข code นั่นเอง
ในระบบที่มีความซับซ้อนสูง อาจจะมีการสร้างอีกระบบนึงขึ้นมาเพื่อใช้ในการ config ระบบหลักได้อีกด้วย เช่น เราอาจจะสร้าง Admin page ขึ้นมาเอาไว้ config หน้า website ของเราเพื่อทำ A/B testing ในหน้า Admin page อาจจะสามารถกำหนดได้ว่าต้องการให้ 20% ของผู้ใช้งานเห็น design ของ website แบบ A และ 80% ผู้ใช้งานจะเห็น design เป็นแบบ B เป็นต้น ซึ่ง admin สามารถ manage ตัวเลขเหล่านี้ได้โดยที่ไม่จำเป็นต้องแก้ไข code นั่นเอง
Observability
Observability คือการที่เราสามารถเห็น insights ของระบบเราได้ เช่น รู้เส้นทางการรับส่งข้อมูล ว่าเรียกจากไหน ส่งไปไหนบ้าง, รู้ว่าตรงไหนของระบบทำงานได้ดี/แย่ , รู้ว่าระบบของเรามีคอขวดอยู่ที่ตรงไหน สิ่งเหล่านี้จะช่วยให้เราสามารถวิเคราะห์เพื่อกำหนด structure ของระบบเรา รวมถึงสามารถหาต้นตอของปัญญหาที่เกิดขึ้นได้อย่างรวดเร็วอีกด้วย
หากเราทำเรื่อง monitoring & alerting ที่ดี ระบบสามารถแจ้งเตือนเราก่อนล่วงหน้าถึงปัญหาที่กำลังจะเกิดขึ้นได้อีกด้วย (เช่น ram ใกล้หมด cpu ใกล้ไม่พอหรือมี error ต่าง ๆ ในระบบเกิดขึ้นรัว ๆ เป็นต้น)
การทำเรื่อง Observability ให้ระบบมีด้วยกันหลัก ๆ 3 อย่างคือ metrics, logging และ tracing
- Metric เป็นการวัดเชิงปริมาณที่ให้ข้อมูลเกี่ยวกับ performance ของระบบ เช่น response time, error rate, ram & cpu usage, QPS (queries per second), latency, cache ratio เป็นต้น
- Logging ก็คือการบันทึก event ต่าง ๆ ที่เกิดขึ้นในระบบ เช่น log ค่าของ request และ response ของผู้ใช้งาน , log ค่าของ error status & error message เมื่อมี error เกิดขึ้น เป็นต้น
- Tracing คือการบันทึกเส้นทางการไหลของ request ว่าไปเรียกใช้งานที่ส่วนไหนของระบบบ้าง และแต่ละส่วนใช้เวลาไปเท่าไหร่ จะช่วยให้เราสามารถมองเห็นภาพรวมของระบบได้ง่ายขึ้น
Why ?
หลักจากที่เราพอจะรู้จัก Cloud Native กันคร่าว ๆ แล้ว อาจจะมีคำถามว่า แล้วทำไม cloud native ถึงสำคัญล่ะ ? ปัญหาหลักเลยคือการ scale application นั่นเอง
ในปี ค.ศ. 1997 มี internet users ทั่วโลกเพียงแค่ 2% เท่านั้น แต่ในปัจจุบัน (ค.ศ. 2024) มี internet users เกินครึ่งโลกไปแล้ว และยังคงเพิ่มขึ้นเรื่อย ๆ cloud native จึงมักเป็นแนวทางแรก ๆ ที่ควรมองหาในยุคนี้หากเราต้องการระบบที่ scale ได้
จบไปแล้วครับผมสำหรับบทความนี้ ขอบคุณสำหรับอ่านจนจบครับ หากมีเนื้อหาผิดพลาดตรงไหนสามารถแจ้งเพื่อปรับปรุงแก้ไขได้เลยครับผม แล้วพบกันบทความหน้า สวัสดีครับ
Special thanks these cool guys for reviewing this article
ref: