Cloud
น้องๆ เคยสงสัยมั้ยว่า ทำไมบาง application มันถึง scale ง่าย จ่ายตังค์น้อย แต่บางอัน scale ยาก แถมกินตังค์เป็นว่าเล่น? สมัยผมทำร้านเน็ต SiamCafe สมัยก่อนเนี่ย โอ้โห… deploy application แต่ละทีนี่ปวดหัว ต้องมานั่ง configure server เองทุกอย่าง ถ้า server เจ๊งก็จบเห่เลย
Cloud Native 12 Factor App เนี่ย มันคือแนวทางการพัฒนา application ที่ออกแบบมาให้รันบน Cloud ได้อย่างมีประสิทธิภาพสูงสุด พูดง่ายๆ คือมันเป็นเหมือนสูตรลับที่ช่วยให้ application ของเรา scale ง่าย deploy เร็ว และ maintain ง่ายนั่นเอง ที่สำคัญคือมันทำให้เราใช้ทรัพยากรของ Cloud ได้อย่างคุ้มค่า ไม่ต้องจ่ายเงินเกินความจำเป็น
ทำไมมันถึงสำคัญ? ลองคิดดูสิครับ ถ้า application ของเรา scale ไม่ได้ เราก็ต้องซื้อ server เพิ่มเรื่อยๆ ซึ่งมันเปลืองเงินมาก หรือถ้า deploy ช้า คู่แข่งก็อาจจะแซงหน้าเราไปแล้ว ดังนั้นการทำความเข้าใจและนำ 12 Factor App มาใช้ จะช่วยให้เราสร้าง application ที่แข็งแกร่งและแข่งขันได้ในโลก Cloud ได้อย่างแน่นอน
Cloud Computing เนี่ย เปรียบเหมือนการที่เราเช่าคอมพิวเตอร์และ software จากผู้ให้บริการ (เช่น AWS, Azure, Google Cloud) แทนที่จะต้องซื้อและดูแลเองทั้งหมด สมัยก่อนผมต้องซื้อ server มาตั้งเองที่ร้านเน็ต พอเครื่องเสียก็ต้องวิ่งไปซ่อมเอง แต่ Cloud Computing ช่วยให้เราไม่ต้องปวดหัวกับเรื่องพวกนั้นอีกต่อไป
ข้อดีของ Cloud Computing คือมันยืดหยุ่นมาก เราสามารถปรับขนาดทรัพยากรได้ตามต้องการ จ่ายเฉพาะส่วนที่เราใช้ และเข้าถึงได้จากทุกที่ที่มีอินเทอร์เน็ต
Microservices คือการแบ่ง application ใหญ่ๆ ออกเป็น application เล็กๆ หลายๆ ตัว แต่ละตัวทำงานเฉพาะอย่าง และสื่อสารกันผ่าน API สมัยก่อนผมเขียนโปรแกรมร้านเน็ตเป็น monolithic app คือทุกอย่างอยู่ในโปรแกรมเดียว ถ้าแก้ bug นิดหน่อยต้อง deploy ใหม่หมดทั้งโปรแกรม
แต่พอเป็น Microservices เราสามารถแก้ bug หรือเพิ่ม feature ในแต่ละ service ได้โดยไม่กระทบกับ service อื่นๆ ทำให้การพัฒนาและการ deploy เร็วกว่าเดิมมาก
การเริ่มต้นใช้งาน 12 Factor App ไม่ยากอย่างที่คิดครับ สิ่งสำคัญคือเราต้องเข้าใจหลักการและนำไปปรับใช้ให้เหมาะสมกับ application ของเรา
ผมแนะนำให้เริ่มจากการศึกษา 12 factors แต่ละข้ออย่างละเอียด แล้วลองพิจารณาดูว่า application ของเราตรงกับ factor ไหนบ้าง และ factor ไหนที่เรายังต้องปรับปรุง
ง่ายๆ เลยคือ code ของเราต้องอยู่ภายใต้ version control เช่น Git ทุกๆ application ควรมี repository เป็นของตัวเอง และสามารถ deploy จาก repository นั้นได้หลายครั้ง สมัยผมทำร้านเน็ต code หายทีนี่ร้องไห้เลย เพราะไม่ได้ใช้ version control
# ตัวอย่างการสร้าง Git repository
git init
git add .
git commit -m "Initial commit"
เราต้องระบุ dependencies ทั้งหมดของ application ของเราอย่างชัดเจน และแยก dependencies ออกจากระบบปฏิบัติการ สมัยก่อนผมลง dependencies มั่วไปหมด พอจะย้ายเครื่องทีนึงก็เจอปัญหา dependencies ไม่ตรงกัน
เครื่องมืออย่าง Maven (สำหรับ Java), npm (สำหรับ JavaScript), pip (สำหรับ Python) จะช่วยจัดการ dependencies ให้เราได้ง่ายขึ้น
# ตัวอย่างการใช้ npm ในการติดตั้ง dependencies
npm install express
Configuration ของ application (เช่น database URL, API keys) ควรเก็บไว้ใน environment variables ไม่ควร hardcode ไว้ใน code เพราะมันทำให้ application ของเราไม่ยืดหยุ่น สมัยก่อนผม hardcode database password ไว้ใน code โดน hack ไปหลายรอบเลย
// ตัวอย่างการอ่าน environment variable ใน Node.js
const databaseUrl = process.env.DATABASE_URL;
ดูวิดีโอเพิ่มเติมเกี่ยวกับCloud Native 12 Factor App:
แน่นอนว่า Cloud Native 12 Factor App ไม่ใช่ทางเลือกเดียวในการพัฒนา application ยังมีทางเลือกอื่นๆ อีกมากมาย เช่น Monolithic Application หรือ Service-Oriented Architecture (SOA) แต่ละทางเลือกก็มีข้อดีข้อเสียแตกต่างกันไป
Monolithic Application เหมาะสำหรับ application ขนาดเล็กที่ไม่ซับซ้อนมาก แต่ข้อเสียคือ scale ยาก deploy ช้า และถ้าเกิดปัญหาในส่วนใดส่วนหนึ่งของ application ก็อาจจะกระทบกับทั้งระบบ
SOA เป็นแนวทางการพัฒนา application ที่เน้นการสร้าง services ที่สามารถนำกลับมาใช้ใหม่ได้ แต่ข้อเสียคือมันซับซ้อนกว่า Microservices และอาจจะไม่ได้ scale ง่ายเท่า
| Feature | Cloud Native 12 Factor App | Monolithic Application | Service-Oriented Architecture (SOA) |
|---|---|---|---|
| Scalability | สูง | ต่ำ | ปานกลาง |
| Deployment Speed | เร็ว | ช้า | ปานกลาง |
| Complexity | ปานกลาง | ต่ำ | สูง |
| Resource Utilization | ดี | ไม่ดี | ปานกลาง |
สรุปคือ Cloud Native 12 Factor App เหมาะสำหรับ application ที่ต้องการ scalability สูง deployment ที่รวดเร็ว และการใช้ทรัพยากรที่มีประสิทธิภาพ แต่ถ้า application ของเรามีขนาดเล็กและไม่ซับซ้อนมาก Monolithic Application ก็อาจจะเป็นทางเลือกที่เหมาะสมกว่า
ถ้าอยากอ่านบทความอื่นๆ เกี่ยวกับการพัฒนา application อย่าลืมแวะไปที่ SiamCafe Blog นะครับ
และถ้าใครสนใจเรื่อง Cloud Computing มากขึ้น ลองเข้าไปดูบทความอื่นๆ ที่ SiamCafe Blog ได้เลยครับ มีเรื่องราว IT สนุกๆ อีกเยอะแยะ
มาถึงส่วนที่สำคัญที่สุดแล้ว! คือประสบการณ์จริงที่ผมเจอมา สมัยทำร้านเน็ต SiamCafe นี่แหละ เอา Cloud Native 12 Factor App มาปรับใช้ได้ยังไงบ้าง? บอกเลยว่าไม่ได้ตรงเป๊ะๆ แต่หลักการมันช่วยให้เราคิดเป็นระบบมากขึ้น
สมัยก่อนเนี่ยปัญหาหลักๆ คือเครื่องลูกข่าย (Client) พัง! ลง Windows ใหม่วันละหลายรอบ เสียเวลาโคตรๆ พอมาเจอ Cloud Native Concept เรื่อง "Stateless Processes" นี่คือ Get เลย! เราต้องทำยังไงให้เครื่องลูกข่ายมันไม่ต้องเก็บอะไรเลย?
คำตอบคือทุกอย่างต้องอยู่บน Server! ไม่ว่าจะเป็นโปรแกรม, config, หรือแม้แต่ Save Game! ทำให้เครื่องลูกข่ายเป็นแค่ "จอภาพ" ที่ส่ง input ไป Server แล้ว Server ก็ประมวลผลส่งภาพกลับมา (คล้ายๆ Cloud Gaming สมัยนี้แหละ)
แทนที่จะลง Windows แบบปกติ เราใช้ Image Based OS เช่น LTSP (Linux Terminal Server Project) หรือ Windows Thin PC สร้าง Image เสร็จแล้ว Deploy ไปเครื่องลูกข่ายทั้งหมด พอเครื่องพังก็แค่ Boot ใหม่จาก Image จบ! เร็วและง่ายกว่าเยอะ
Config ทุกอย่าง ไม่ว่าจะเป็น Resolution, Keyboard Layout, หรือแม้แต่ Wallpaper ให้อยู่บน Server แล้วใช้ Script ดึงมาตอน Boot เครื่องลูกข่าย ทำให้การจัดการง่ายขึ้นเยอะ
# Example script (bash)
SERVER_IP=192.168.1.100
cp -f $SERVER_IP/config/keyboard_layout /etc/default/keyboard
xrandr --output VGA1 --mode 1024x768
เครื่องลูกข่าย Boot ผ่าน Network (PXE Boot) ไม่ต้องมี Harddisk เลยก็ได้! ยิ่งง่ายเข้าไปอีก เพราะไม่ต้องกลัว Harddisk เสีย
อันนี้อาจจะ Advance ไปหน่อย แต่ถ้าทำได้จะดีมากๆ คือเอาโปรแกรมต่างๆ มาทำเป็น Container แล้ว Run บน Server จากนั้นให้เครื่องลูกข่าย Remote เข้ามา ข้อดีคือจัดการง่าย Update ง่าย และ Resource Utilization ดีขึ้น
จริงๆ ไม่จำเป็นต้องทำตามเป๊ะๆ หรอกครับ เอาหลักการมาปรับใช้ให้เข้ากับสถานการณ์ของเราก็พอ สำคัญคือเข้าใจ Concept และนำไปประยุกต์ใช้
สำคัญมากๆ ครับ เพราะมันทำให้ระบบเรา Scalable และ Resilient ถ้า Process มันไม่ต้องเก็บ State อะไรเลย เราก็สามารถเพิ่ม Process ได้เรื่อยๆ และถ้า Process ไหนพัง ก็ไม่ต้องกลัวว่าข้อมูลจะหาย
ยอมรับว่ายากครับ ต้องมีความรู้เรื่อง Docker หรือ Container Technology อื่นๆ แต่ถ้าลองศึกษาดูจะพบว่ามันคุ้มค่ามากๆ ในระยะยาว
สำหรับ Image Based OS แนะนำ LTSP หรือ Windows Thin PC ครับ ส่วน Containerized Applications ก็ Docker เลยครับ
Cloud Native 12 Factor App ไม่ใช่แค่ Buzzword นะครับ มันเป็นแนวคิดที่ช่วยให้เราออกแบบระบบได้ดีขึ้น Scalable ขึ้น และ Resilient ขึ้น ลองเอาไปปรับใช้ดูครับ แล้วจะเห็นผลลัพธ์ที่ชัดเจน
ถึงแม้ว่ามันอาจจะไม่ได้ออกแบบมาเพื่อร้านเน็ตโดยตรง แต่หลักการของมันสามารถนำมาประยุกต์ใช้ได้หลากหลายสถานการณ์ iCafeForex ก็เป็นอีกตัวอย่างนึงที่นำแนวคิดเหล่านี้ไปปรับใช้
ลองเข้าไปอ่านบทความอื่นๆ เพิ่มเติมได้ที่ SiamCafe Blog นะครับ