ในยุคปัจจุบันที่ไม่ว่าใครก็ต่างพัฒนาแอปพลิเคชันบนคลาวด์กัน โดยการทำแบบนี้เนี่ยเราจะต้องมีการออกแบบวางโครงสร้าง สถาปัตยกรรม เลือกใช้เทคโนโลยีต่าง ๆ ให้เหมาะสม เพราะหากเราออกแบบดี ๆ แล้วละก็ มันจะทำให้ระบบเรามีประสิทธิภาพ และที่สำคัญคือมันจะช่วยให้คุณลดต้นทุนไปได้ ซึ่งมันจะดียังไง ลดต้นทุนยังไง เดี๋ยววันนี้ผมจะพาไปรู้จักกับสองแนวทางสุดฮิตอย่าง Container และ Serverless กันว่าแต่ละตัวคืออะไร ทำงานยังไง ความแตกต่างที่เห็นได้ชัดคืออะไรบ้าง รวมถึงจะเลือกใช้ยังไงให้เหมาะกับงานคุณ เรามาดูไปพร้อม ๆ กันเลยครับ
Container กับ Serverless คืออะไร?
ก่อนอื่นต้องขอเล่าไปถึงการทำแอปในยุคก่อนแรกเริ่มเลย คือเมื่อก่อนทุกอย่างในการทำแอปเราจะติดตั้งและทำงานบนเครื่องเซิร์ฟเวอร์จริง ๆ ที่เราเรียกว่า Physical Server แล้วเจ้าแอปทุกตัวที่เราทำที่เราเขียนเนี่ยมันก็รันบนเซิร์ฟเวอร์ตัวเดียวกัน แบบนี้มันจะมีข้อดีคือเราคุม resource ได้เต็มที่ แต่ข้อจำกัดของแบบนี้มีอยู่เยอะมากเช่น หากเรามีแอปแค่ตัวเดียว มันก็จะเปลือง resource เพราะที่เหลือก็จะถูกปล่อยทิ้งไว้แบบเปล่าประโยชน์ แต่ถ้ามีหลายแอปบางครั้ง แต่ละแอปก็ไม่สามารถรันด้วยกันได้ เพราะบางแพ็คเกจอาจจะต้องการสภาพแวดล้อมไม่เหมือนกัน จะซื้อฮาร์ดแวร์รันแต่ละแอปแยกก็จะทำให้ทั้งต้นทุนสูง และเสียเวลาในการจัดการเพิ่มขึ้นอีกด้วย
เพื่อแก้ปัญหานี้จึงเกิดมีการทำ Virtualization หรือ การจำลองเครื่องเสมือนขึ้นมาช่วยให้เราสามารถแยกทรัพยากรของเซิร์ฟเวอร์ออกเป็นหลายส่วน โดยรันหลายระบบปฏิบัติการบนเครื่องเซิร์ฟเวอร์เดียว ผ่าน เครื่องเสมือน (Virtual Machines – VMs) โดยเจ้าสิ่งนี้ช่วยให้การใช้ทรัพยากรเป็นไปอย่างมีประสิทธิภาพมากขึ้นและรองรับแอปพลิเคชันหลายตัวในเวลาเดียวกัน แต่การใช้ VM ก็มีข้อจำกัดส่วนที่เป็นการกินทรัพยากรสูงเพราะแต่ละ VM มีระบบปฏิบัติการของตัวเอง ทำให้ต้องใช้หน่วยความจำและพลังงานประมวลผลเพิ่มขึ้น แถมการตั้งค่าและการจัดการ VM ต้องการมีทีม IT ที่มีความเชี่ยวชาญในการดูแลรักษาอีกด้วย ดังนั้นเพื่อให้การพัฒนาแอปง่ายขึ้นลดปัญหาที่กล่าวมาจึงมีการพัฒนา คอนเทนเนอร์ (Containers) ขึ้นมา
คอนเทนเนอร์ช่วยให้การรันแอปพลิเคชันทำได้คล่องตัวและเบากว่า VM มากขึ้น โดยแต่ละคอนเทนเนอร์จะรันแอปในสภาพแวดล้อมที่แยกออกจากกัน แต่ใช้ทรัพยากรร่วมกับ OS หลัก ทำให้คอนเทนเนอร์มีขนาดเล็กกว่า VM มากและลดการใช้ทรัพยากรลงไปได้อย่างมาก ดังนั้นเราจะเห็นได้ว่าการใช้คอนเทนเนอร์นั้นมีข้อดีดังนี้
ข้อดีของคอนเทนเนอร์
- การใช้ทรัพยากรอย่างมีประสิทธิภาพ: แต่ละคอนเทนเนอร์มีการใช้ทรัพยากรร่วมกัน ทำให้ไม่ต้องใช้ลง OS ที่ซ้ำซ้อนเหมือนกับ VM
- เมื่อเราแพ็คแอปไว้ในคอนเทนเนอร์เรียบร้อยแล้ว เราก็สามารถย้ายแอปไปรันในเครื่องต่าง ๆ ได้ทำให้การสเกลทำได้ง่ายมากยิ่งขึ้น
- แต่การใช้คอนเทนเนอร์ก็ยังคงต้องมีการจัดการเซิร์ฟเวอร์อยู่ดี เช่น ตอนที่เราจะสเกลระบบเราก็ต้องสเกลเอง การตรวจสอบระบบ และการบำรุงรักษา ซึ่งทั้งหมดนี้ต้องใช้ทั้งคนและเวลาในการทำ เพื่อแก้ปัญหานี้จึงเกิดแนวคิดที่ชื่อว่า Serverless ขึ้นมา
Serverless คืออะไร?
Serverless เป็นแนวคิดที่ล้ำไปอีกขั้น โดยการประมวลผลแอปพลิเคชันจะถูกรันบน Infrastructure ที่ผู้ให้บริการคลาวด์จัดการให้ทั้งหมด โดยที่เราไม่ต้องคอยกังวลเกี่ยวกับเซิร์ฟเวอร์การดูแลเซิร์ฟเวอร์เอง เพราะผู้ให้บริการคลาวด์จะดูแลการสเกลให้อัตโนมัติ โดย
การใช้ Serverless จะมีข้อดีหลัก ๆ ดังนี้
- ไม่ต้องดูแลเซิร์ฟเวอร์เองทำให้เราประหยัดทั้งเวลาและแรงงานที่ต้องมาดูแล
- ระบบจะสเกลตามปริมาณ request ให้โดยอัตโนมัติ หากมี request มากก็สเกลออกมารองรับโหลดที่เพิ่มขึ้นได้อย่างทันท่วงที รองรับธุรกิจที่อยากจะเติบโตแบบสุด ๆ
- นอกจากประหยัดเวลาแล้ว ยังประหยัดค่าใช้จ่ายอีกด้วย เนื่องจากจะคิดเงินตามปริมาณการประมวลผลจริงเท่านั้น มีคนใช้เยอะก็จ่ายเยอะ มีคนใช้น้อยก็จ่ายน้อย ไม่ต้องจ่ายเผื่อ จ่ายล่วงหน้าไว้เลย
แม้ว่า Serverless จะมีความน่าสนใจในด้านของความสะดวก ความประหยัด แต่ก็มีข้อจำกัดอยู่เหมือนกัน เช่น การที่เราไม่สามารถควบคุมได้แบบเต็มที่ เพราะเราไม่ได้ดูแลและสร้างเซิร์ฟเวอร์เอง ทำให้บางส่วนอาจจะมีข้อจำกัด
หากสรุปให้เห็นภาพง่าย ๆ เราจะได้ตารางเปรียบเทียบข้อดีและข้อเสียระหว่าง Container และ Serverless ดังนี้
ลักษณะ | Container 📦 | Serverless ⚡ |
แนวคิด | การรันแอปพลิเคชันใน คอนเทนเนอร์ที่แยกจากกัน แต่ ใช้ทรัพยากรร่วมกับ OS หลัก | ไม่มีการจัดการเซิร์ฟเวอร์ ผู้ให้ บริการคลาวด์จัดการทุกอย่างให้ |
การสเกล | ต้องสเกลเองโดยผู้ดูแลระบบ | สเกลอัตโนมัติตามจํานวน request ที่เข้ามา |
การใช้ทรัพยากร | ใช้ทรัพยากรอย่างมี ประสิทธิภาพ ลดการใช้งาน OS ที่ซ้ำซ้อน | ประหยัดทรัพยากร จ่ายตามการใช้ งานจริง |
ค่าใช้จ่าย | ค่าบำรุงรักษาและดูแลระบบจะ เพิ่มขึ้นตามการขยายระบบ | คิดค่าใช้จ่ายตามปริมาณการ ประมวลผลจริง ลดต้นทุนในช่วง โหลดต่า |
ความยืดหยุ่น | สามารถย้ายคอนเทนเนอร์ไปยัง แพลตฟอร์มอื่นได้ง่ายดาย | ควบคุมการทำงานของระบบได้ น้อยกว่า เนื่องจากขึ้นอยู่กับผู้ให้ บริการคลาวด์ |
หากจะให้เห็นภาพการใช้งานจริง ๆ เดี๋ยวเรามาดู use case ระหว่างสองโปรเจกต์ที่ใช้แนวคิดคนละแบบกันดีกว่าว่าแอปที่มีการทำงานแบบไหน ควรเลือกใช้แบบไหนด้วยสาเหตุอะไร
มาที่ตัวอย่างแรก การพัฒนาเว็บแอป E-commerce (ใช้ Container)
สมมติว่าเรากำลังสร้างแอปพลิเคชันอีคอมเมิร์ซสำหรับบริษัทใหญ่ แอปนี้ต้องรองรับหลายฟีเจอร์ เช่น ระบบจัดการสินค้า ระบบสั่งซื้อ และการประมวลผลคำสั่ง ซึ่งทุกฟีเจอร์จำเป็นต้องทำงานร่วมกันอย่างมีประสิทธิภาพ สำหรับแอปแบบนี้ การเลือกใช้ Container จะเหมาะมาก เพราะ เราสามารถคุมสภาพแวดล้อมได้เนื่องจากแต่ละฟีเจอร์ เช่น ระบบสั่งซื้อ และระบบจัดการสินค้าคงคลัง หากเราทำแต่ละ service แยกกัน แต่ละตัวก็จะต้องมีสภาพแวดล้อมของตัวเอง บางตัวอาจต้องการสภาพแวดล้อมต่างกัน แต่ด้วย Container เราสามารถแยกแต่ละฟีเจอร์ไว้ในคอนเทนเนอร์ของตัวเอง เพื่อให้แต่ละ service ทำงานได้แบบไม่มีสะดุด
แถมเพิ่มความยืดหยุ่นอีก เช่นหากมีโปรโมชั่นในช่วงเทศกาล ระบบจัดการสินค้าคงคลังอาจต้องการสเกลเพิ่มเพื่อรองรับการสั่งซื้อที่มากขึ้น เราก็สามารถเพิ่มจำนวนคอนเทนเนอร์ได้ทันที และหากธุรกิจต้องการการรองรับการขยายตัว เมื่อบริษัทเติบโตและต้องการขยายไปยังตลาดต่างประเทศ เราสามารถย้ายคอนเทนเนอร์ไปยังเซิร์ฟเวอร์ในภูมิภาคอื่น ๆ ได้ง่ายๆ ช่วยให้แอปพร้อมใช้งานอย่างมีประสิทธิภาพ ดังนั้นถ้าเราต้องการสร้างระบบที่ซับซ้อนและต้องการควบคุมทุกอย่างเอง การใช้ Container จะช่วยให้ทำงานได้ลื่นไหลและมีความยืดหยุ่นสูง
ตัวอย่างที่ 2 มาที่ฝั่งของการใช้ Serverless กันบ้างตัวอย่างนี้จะเป็นแอปที่ประมวลผลข้อมูล IoT แบบเรียลไทม์
ซึ่งเป็นอีกตัวอย่างหนึ่งที่ฮิตมาก ๆ สำหรับการสร้างแอปพลิเคชัน IoT สำหรับสตาร์ทอัพที่กำลังมาแรง แอปนี้จะรับข้อมูลจากเซ็นเซอร์ที่ติดตั้งในโรงงานเพื่อตรวจสอบสภาพเครื่องจักร และจะส่งการแจ้งเตือนเมื่อพบว่ามีปัญหา แอปนี้ไม่ต้องทำงานตลอดเวลา แค่ทำงานเมื่อมีข้อมูลเข้ามาจากเซ็นเซอร์เท่านั้น โดยการใช้ Serverless จะเหมาะกับแอปนี้เพราะ
แอปนี้จะประมวลผลเฉพาะเมื่อมีข้อมูลเข้ามา ดังนั้นการใช้ Serverless ที่ทำงานแบบ event-driven (ทำงานเมื่อมีเหตุการณ์เกิดขึ้น) จะช่วยลดการใช้ทรัพยากร เพราะเราจ่ายแค่ตอนที่มีการประมวลผลจริง ๆ ในบางช่วงเวลาที่มีเซ็นเซอร์ส่งข้อมูลเข้ามาพร้อมกันมาก ๆ ระบบ Serverless จะสามารถสเกลเพื่อรองรับปริมาณข้อมูลเหล่านั้นได้อัตโนมัติโดยที่เราไม่ต้องมาทำเอง สำหรับสตาร์ทอัพที่ต้องการประหยัดเงิน การจ่ายเงินตามปริมาณการใช้งานจริงเป็นข้อดีใหญ่ เพราะช่วงที่ไม่มีข้อมูลเข้ามา เราก็ไม่ต้องเสียเงิน ดังนั้น Serverless จึงเหมาะกับแอปพลิเคชันที่ทำงานต้องการทำงานที่คิดค่าบริการเป็น request ไปตามฟังก์ชันที่ถูกเรียกใช้งาน ใช้เยอะจ่ายเยอะ ใช้น้อยจ่ายน้อย แถมยืดหยุ่นรองรับการสเกลอีกด้วย
สรุป
การเลือกใช้ Containers หรือ Serverless นั้นขึ้นอยู่กับลักษณะงานและความต้องการของโปรเจกต์ที่แตกต่างกัน หากคุณต้องการควบคุมการทำงานทุกอย่าง ควบคุมจัดการสภาพแวดล้อมต่าง ๆ เอง มีการใช้งานแอปพลิเคชันอย่างต่อเนื่อง ต้องการการประมวลผลที่แน่นอน Containers อาจเป็นตัวเลือกที่ดีกว่า แต่ถ้าโปรเจกต์ของเน้นความสะดวกสบายในการพัฒนาและต้องการลดภาระในการจัดการเซิร์ฟเวอร์โดยจะไปโฟกัสที่การเขียนโค้ด ทำส่วนของ Business Logic เป็นหลัก การประมวลผลต้องการคิดเงินตามปริมาณการใช้งานจริงตามรายฟังก์ชัน Serverless ก็จะเป็นตัวเลือกที่ทำให้ประหยัดทั้งเวลาและค่าใช้จ่ายได้มากขึ้น
แต่ไม่ว่าจะเป็นโปรเจกต์ขนาดเล็กหรือใหญ่ ถ้าคุณสนใจที่จะสร้างแอปพลิเคชันด้วยโซลูชันที่เหมาะสม ทีมงานผู้เชี่ยวชาญที่ Cloud HM ของเรายินดีช่วยให้คำปรึกษาและออกแบบโครงสร้างระบบให้เหมาะกับความต้องการของคุณ พร้อมช่วยให้คุณลดต้นทุนและพัฒนาได้อย่างมีประสิทธิภาพมากที่สุด สนใจติดต่อเราได้ที่ https://www.cloudhm.co.th/contact
Reference: https://reviewnprep.com/blog/how-to-choose-between-containers-vs-serverless/