ในยุคที่เทคโนโลยีก้าวกระโดดอย่างไม่หยุดนิ่ง การพัฒนาซอฟต์แวร์ก็เปลี่ยนแปลงไปตามโลกที่เชื่อมต่อกันอย่างไม่เคยมีมาก่อน "Serverless Computing" กลายมาเป็นเทรนด์ที่น่าสนใจในหมู่นักพัฒนา และธุรกิจต่าง ๆ ด้วยการให้บริการที่ช่วยให้เราสามารถเรียกใช้แอปพลิเคชันโดยไม่ต้องจัดการกับ เซิร์ฟเวอร์ (Server) เอง ว่าแต่ระบบนี้คืออะไรกันแน่ ? และมันมีข้อดี หรือข้อเสียอย่างไรบ้าง ? มาค้นหาคำตอบกันในบทความนี้กัน
"Serverless Computing" หรือหากแปลเป็นภาษาไทยตรง ๆ คือ "การประมวลผลแลไร้เซิร์ฟเวอร์" เป็นวิธีการที่ให้บริการแบบ Backend หรือเบื้องหลัง ที่คิดค่าบริการตามการใช้งานจริง ผู้ให้บริการ Serverless จะอนุญาตให้ผู้ใช้เขียน และนำโค้ดไปใช้งานได้ โดยไม่ต้องกังวลเกี่ยวกับโครงสร้างพื้นฐานที่อยู่เบื้องหลังเลย
ธุรกิจที่ใช้บริการ Backend จากผู้ให้บริการ Serverless จะถูกคิดค่าบริการตามการคำนวณที่ใช้จริง และไม่จำเป็นต้องจอง หรือชำระเงินล่วงหน้าสำหรับแบนด์วิดท์ หรือจำนวนเซิร์ฟเวอร์ที่ตายตัว เพราะระบบนี้สามารถปรับขยายได้อัตโนมัติ แม้จะเรียกว่า "Serverless (ไม่มีเซิร์ฟเวอร์)" แต่ในความเป็นจริงแล้วก็ยังคงมีการใช้เซิร์ฟเวอร์จริงอยู่ เพียงแต่ผู้พัฒนา หรือผู้ที่ใช้งานไม่จำเป็นต้องรู้ หรือจัดการกับเซิร์ฟเวอร์เหล่านั้น
ภาพจาก : https://hackernoon.com/what-is-Serverless-architecture-what-are-its-pros-and-cons-cc4b804022e9
ในช่วงแรกของการพัฒนาเว็บไซต์ ใครก็ตามที่ต้องการสร้างแอปพลิเคชันบนเว็บต้องมีฮาร์ดแวร์เซิร์ฟเวอร์ของตนเอง ซึ่งเป็นกระบวนการที่ยุ่งยาก และมีค่าใช้จ่ายสูง ต่อมามีการเกิดขึ้นของ การประมวลผลแบบคลาวด์ (Cloud Computing) ซึ่งช่วยให้สามารถเช่าพื้นที่เซิร์ฟเวอร์ หรือจำนวนเซิร์ฟเวอร์จากระยะไกลได้ ผู้พัฒนา และบริษัทที่เช่าพื้นที่เซิร์ฟเวอร์แบบนี้มักจะจองพื้นที่ที่มากเกินไปเพื่อป้องกันปัญหาที่อาจเกิดขึ้นจากการที่มีผู้ใช้งานเยอะเช่น การที่ผู้ใช้งานเข้าเว็บเพิ่มขึ้นอย่างกะทันหัน หากไม่จองพื้นที่เผื่อไว้ อาจทำให้แอปพลิเคชันหยุดทำงาน
การจองพื้นที่เซิร์ฟเวอร์เกินความจำเป็นนี้ทำให้เกิดการสูญเสียพื้นที่เซิร์ฟเวอร์ที่ชำระเงินไปแล้ว แต่ไม่ได้ใช้งานจริง ผู้ให้บริการคลาวด์จึงได้เสนอโมเดลการปรับขยายอัตโนมัติเพื่อแก้ไขปัญหานี้ แต่ถึงแม้ว่าจะมีการปรับขยายอัตโนมัติ แต่การเพิ่มขึ้นของกิจกรรมที่ไม่พึงประสงค์ เช่น การโจมตีแบบ DDoS ก็อาจส่งผลให้ค่าใช้จ่ายเพิ่มสูงขึ้นอยู่ดี
ภาพจาก : https://www.radware.com/cyberpedia/ddospedia/ddos-meaning-what-is-ddos-attack/
แต่กลับกันได้เกิด Serverless Computing ขึ้น ช่วยให้ผู้พัฒนาซื้อบริการ Backend ได้แบบยืดหยุ่น จ่ายเฉพาะส่วนที่ใช้งานจริงเท่านั้น เปรียบเทียบได้กับการเปลี่ยนจากแพ็กเกจอินเทอร์เน็ต ที่มีการจำกัดข้อมูลต่อเดือน มาเป็นแพ็กเกจที่คิดค่าบริการตามปริมาณข้อมูลที่ใช้จริง
คำว่า "Serverless" อาจทำให้เข้าใจผิดเล็กน้อย เพราะยังมีเซิร์ฟเวอร์ให้บริการ Backend อยู่ แต่ทุกเรื่องเกี่ยวกับพื้นที่เซิร์ฟเวอร์ และโครงสร้างพื้นฐานนั้นผู้ให้บริการจะเป็นคนดูแลทั้งหมด ส่วนผู้พัฒนาสามารถโฟกัสกับงานของตนได้โดยไม่ต้องกังวลเกี่ยวกับเซิร์ฟเวอร์เลยนั่นเอง
Serverless Computing ทำงานโดยให้ผู้ใช้พัฒนา และรันแอปพลิเคชัน โดยไม่ต้องจัดการกับเซิร์ฟเวอร์หรือโครงสร้างพื้นฐาน ซึ่งผู้ให้บริการคลาวด์จะจัดการทรัพยากรทั้งหมดแทน ระบบจะทำงานตามแนวคิด Event-Driven ซึ่งฟังก์ชัน หรือโค้ดจะถูกรันเมื่อมีเหตุการณ์เกิดขึ้น เช่น การส่งคำขอ HTTP หรือการอัปโหลดไฟล์ไปยังคลาวด์ ผู้ให้บริการจะปรับขนาดการประมวลผลโดยอัตโนมัติตามความต้องการใช้งาน และหยุดการทำงานเมื่อไม่มีการใช้งาน เพื่อช่วยลดต้นทุนให้ผู้ใช้ที่จ่ายค่าบริการตามการใช้งานจริงเท่านั้น (Pay-as-you-go)
ภาพจาก : https://www.researchgate.net/figure/Serverless-platform-architecture_fig1_317557782
ฟังก์ชันในระบบ Serverless มักเป็นแบบ Stateless ซึ่งแต่ละคำขอทำงานอย่างอิสระ และไม่เก็บสถานะต่อเนื่อง ฟังก์ชันจะถูกรัน และตอบสนองตามข้อมูลที่ได้รับ แต่หากต้องการจัดเก็บข้อมูลเพิ่มเติมจะใช้บริการเก็บข้อมูลอื่น ๆ เช่น ฐานข้อมูลคลาวด์ การทำงานทั้งหมดนี้ช่วยให้นักพัฒนาสามารถมุ่งเน้นไปที่การเขียนโค้ด และพัฒนาแอปพลิเคชันได้ โดยไม่ต้องจัดการทรัพยากรเซิร์ฟเวอร์เองเลย
จากที่เราได้ลงรายละเอียดของความหมายของ Serverless Computing ไปแล้วซึ่งชูประเด็นหลักคือการให้บริการ Backend แต่แล้วมันคืออะไร ? เรามาหาคำตอบกันต่อเลย ในการพัฒนาแอปพลิเคชันเรามักจะแบ่งการทำงานออกเป็น 2 ส่วนหลัก ๆ คือ Frontend และ Backend
ภาพจาก : https://www.cloudflare.com/en-gb/learning/Serverless/what-is-Serverless/
ให้ทุกคนลองจินตนาการถึงเว็บไซต์ที่ขายบัตรคอนเสิร์ต เมื่อผู้ใช้พิมพ์ที่อยู่เว็บไซต์ลงในเบราว์เซอร์ เบราว์เซอร์จะส่งคำขอไปยังเซิร์ฟเวอร์ที่ทำหน้าที่เป็น Backend ซึ่งจะตอบกลับด้วยข้อมูลของเว็บไซต์ จากนั้นผู้ใช้จะเห็นหน้าเว็บหรือ Frontend ซึ่งอาจประกอบด้วยข้อความ, รูปภาพ และช่องให้กรอกข้อมูลเพื่อค้นหาศิลปินโปรด
เมื่อผู้ใช้กรอกข้อมูล และกดปุ่ม "ค้นหา" คำขอจะถูกส่งไปยัง Backend อีกครั้ง เพื่อค้นหาข้อมูลจากฐานข้อมูลว่าศิลปินที่ค้นหานั้นมีการแสดงเมื่อไร และมีบัตรเหลืออยู่เท่าไร จากนั้น Backend จะส่งข้อมูลกลับมายัง Frontend เพื่อแสดงผลให้ผู้ใช้เห็นในรูปแบบที่เข้าใจง่าย นอกจากนี้ เมื่อผู้ใช้สร้างบัญชี และกรอกข้อมูลการชำระเงินเพื่อซื้อตั๋ว ระบบก็จะมีการสื่อสารระหว่าง Frontend และ Backend หลายครั้งเช่นกัน
Serverless ช่วยประหยัดค่าใช้จ่ายได้มากขึ้น เพราะเนื่องจากผู้ให้บริการคลาวด์แบบดั้งเดิม มักจะทำให้ผู้ใช้ต้องจ่ายเงินสำหรับพื้นที่ หรือ CPU ที่ไม่ได้ใช้งาน แต่ในระบบ Serverless ผู้ใช้จะจ่ายเฉพาะตามปริมาณการใช้งานจริงเท่านั้น
ภาพจาก : https://www.cloudflare.com/en-gb/learning/Serverless/what-is-Serverless/
ในระบบ Serverless นักพัฒนาไม่ต้องกังวลกับการตั้งนโยบายในการปรับขนาดของโค้ด ผู้ให้บริการคลาวด์จะจัดการการปรับขนาดตามความต้องการโดยอัตโนมัติ ทำให้ระบบสามารถรองรับการใช้งานที่เพิ่มขึ้นหรือลดลงได้โดยไม่ยุ่งยาก
ด้วยการใช้ Function as a Service (FaaS) นักพัฒนาสามารถสร้างฟังก์ชันที่เรียบง่ายเพื่อทำงานแต่ละอย่างได้แบบอิสระ เช่น การเรียก Application Programming Interface (API) ทำให้การพัฒนา และจัดการโค้ดง่ายขึ้นมาก
ภาพจาก : https://docs.openfaas.com/architecture/faas-provider/
สถาปัตยกรรมแบบ Serverless ช่วยลดระยะเวลาในการออกสู่ตลาด นักพัฒนาไม่จำเป็นต้องใช้กระบวนการ Deploy ที่ซับซ้อนในการแก้ไขข้อบกพร่อง หรือเพิ่มฟีเจอร์ใหม่ ๆ แต่สามารถเพิ่ม และแก้ไขโค้ดได้ทีละส่วนอย่างง่ายดาย
โค้ดที่ไม่ถูกเรียกใช้งานบ่อยในระบบ Serverless อาจมีปัญหาเรื่องเวลาในการตอบสนองที่ช้ากว่าโค้ดที่ทำงานต่อเนื่องบนเซิร์ฟเวอร์เฉพาะหรือเครื่องเสมือน เนื่องจากโค้ดในระบบ Serverless จะถูกหยุดทำงานเมื่อไม่ถูกใช้งาน ซึ่งเมื่อมีการเรียกใช้งานใหม่ จะมีการใช้เวลาสำหรับการเริ่มต้นระบบเพิ่มขึ้น เรียกว่าปัญหา "Cold Start" ซึ่งอาจสร้างความล่าช้าให้กับการประมวลผล
Serverless ไม่เหมาะสมกับงานที่ต้องการประสิทธิภาพสูง เช่น การประมวลผลข้อมูลหนัก ๆ เนื่องจากมีข้อจำกัดด้านทรัพยากรที่ผู้ให้บริการคลาวด์กำหนดไว้ อีกทั้งยังอาจคุ้มค่ากว่าหากตั้งค่าเซิร์ฟเวอร์ในปริมาณที่เหมาะสมกับความต้องการ การนำแอปพลิเคชันที่ซับซ้อนเข้าสู่ระบบ Serverless ก็เป็นเรื่องท้าทายเช่นกัน
Serverless ไม่ได้มีความปลอดภัยมากกว่าโครงสร้างแบบดั้งเดิมเสมอไป แม้ว่าผู้ให้บริการคลาวด์จะดูแลเรื่องช่องโหว่ของระบบปฏิบัติการ แต่การที่มีองค์ประกอบหลายอย่างในแอปพลิเคชันทำให้มีจุดเข้าถึงที่หลากหลายมากขึ้น ยิ่งไปกว่านั้น โซลูชันด้านความปลอดภัยที่เคยใช้งานในระบบคลาวด์แบบดั้งเดิมอาจใช้ไม่ได้กับ Serverless เพราะผู้ใช้ไม่สามารถควบคุม และติดตั้งอะไรได้ในระดับเครือข่าย เช่น ระบบป้องกันการโจมตี (IDS/IPS) นอกจากนี้ยังมีความเสี่ยงจากการใช้ทรัพยากรร่วมกับผู้อื่น ทำให้ต้องปรับเปลี่ยนวิธีป้องกัน และคิดเรื่องความปลอดภัยในมุมมองใหม่
เนื่องจาก Serverless ส่วนใหญ่ใช้งานบนคลาวด์สาธารณะ จึงมีประเด็นด้านความเป็นส่วนตัวเกี่ยวกับการใช้ทรัพยากรร่วมกัน และการเข้าถึงจากบุคคลภายนอก อย่างไรก็ตาม Serverless ก็สามารถใช้งานบนคลาวด์ส่วนตัว หรือภายในองค์กร ซึ่งจะให้บริษัทควบคุมระบบความเป็นส่วนตัวได้เช่นเดียวกับการตั้งเซิร์ฟเวอร์แบบดั้งเดิม
การใช้ Serverless นั้นมักจะผูกขาดกับผู้ให้บริการคลาวด์รายใดรายหนึ่ง ซึ่งทำให้การย้ายการทำงานหรือแอปพลิเคชันไปยังผู้ให้บริการรายอื่นเป็นไปได้ยากขึ้น โดยเฉพาะในกรณีที่ต้องใช้งานหลายระบบในเวลาเดียวกัน เช่น การทำงานร่วมกันระหว่าง Backend-as-a-Service (BaaS) กับ Function-as-a-Service (FaaS) จากผู้ให้บริการรายเดียว
Serverless Computing มักถูกเข้าใจผิดว่าเป็นบริการรูปแบบเดียวกับ Backend-as-a-Service (BaaS) และ Platform-as-a-Service (PaaS) ทั้งที่มีความแตกต่างกันอย่างชัดเจน แม้จะมีคุณสมบัติบางอย่างคล้ายกัน เราลองมาดูฟีเจอร์ของบริการชนิดที่กล่าวมากันที่ละตัวเลย
คือโมเดลที่ผู้ให้บริการคลาวด์ให้บริการ Backend เช่นการจัดเก็บข้อมูล ให้กับนักพัฒนา เพื่อให้นักพัฒนามุ่งเน้นไปที่การเขียนโค้ดฝั่ง Front-end แต่ BaaS ไม่จำเป็นต้องทำงานแบบ Event-driven หรือรันบน การประมวลผลแบบเอดจ์ (Edge computing) เหมือนกับแอปพลิเคชัน Serverless ซึ่งเน้นการตอบสนองต่อเหตุการณ์ที่เกิดขึ้นทันที
เป็นโมเดลที่นักพัฒนาสามารถเช่าเครื่องมือที่จำเป็นทั้งหมดจากผู้ให้บริการคลาวด์ เพื่อใช้ในการพัฒนา และ Deploy แอปพลิเคชัน เช่น ระบบปฏิบัติการ (Operation System) และ Middleware อย่างไรก็ตาม แอปพลิเคชันบน PaaS ไม่สามารถปรับขนาดได้ง่าย และรวดเร็วเท่ากับ Serverless และมักมีความล่าช้าในการเริ่มต้นระบบ (Startup delay) ซึ่งไม่พบใน Serverless
เป็นคำที่ครอบคลุมถึงการที่ผู้ให้บริการคลาวด์จัดหาโครงสร้างพื้นฐานเพื่อให้บริการลูกค้า ซึ่งบางครั้งผู้ให้บริการ IaaS อาจมีฟังก์ชัน Serverless แต่คำสองคำนี้ไม่ใช่คำเดียวกัน เนื่องจาก laaS มุ่งเน้นที่การจัดหาเซิร์ฟเวอร์ และโครงสร้างพื้นฐาน ในขณะที่ Serverless เน้นการประมวลผลแบบไม่ต้องจัดการเซิร์ฟเวอร์เอง
ดังนั้น Serverless Computing แตกต่างจากโมเดลอื่น ๆ โดยมุ่งเน้นไปที่การประมวลผลตามเหตุการณ์ การปรับขนาดอัตโนมัติ และการทำงานบนขอบ (Edge) โดยไม่ต้องมีการจัดการเซิร์ฟเวอร์ หรือโครงสร้างพื้นฐานจากนักพัฒนานั่นเอง
Serverless Computing ยังคงพัฒนาอย่างต่อเนื่อง โดยผู้ให้บริการได้คิดค้นวิธีแก้ปัญหาสำคัญบางประการ หนึ่งในปัญหาที่พบได้บ่อยคือ Cold Start ซึ่งเกิดขึ้นเมื่อฟังก์ชัน Serverless ไม่ได้ถูกเรียกใช้งานเป็นเวลานาน ผู้ให้บริการจะปิดการทำงานของฟังก์ชันนั้นเพื่อประหยัดพลังงาน และหลีกเลี่ยงการจัดสรรทรัพยากรเกินความจำเป็น เมื่อมีการเรียกใช้งานฟังก์ชันครั้งถัดไป ผู้ให้บริการจะต้องเริ่มต้นฟังก์ชันใหม่ตั้งแต่ต้น ซึ่งกระบวนการนี้เพิ่มเวลา หน่วง (Latency)
แม้ว่าหลังจากที่ฟังก์ชันเริ่มทำงานแล้ว การตอบสนองในการเรียกใช้งานครั้งถัดไปจะรวดเร็วมากขึ้น (เรียกว่า Warm Start) แต่หากไม่มีการเรียกใช้งานฟังก์ชันอีก ฟังก์ชันจะหยุดทำงานอีกครั้ง ซึ่งหมายความว่าผู้ใช้ที่เรียกใช้งานครั้งถัดไปจะพบกับปัญหา Cold Start ซ้ำ ๆ ปัญหานี้เคยถูกมองว่าเป็นสิ่งที่เลี่ยงไม่ได้ในการใช้ Serverless functions
ภาพจาก : https://azure.microsoft.com/en-us/blog/understanding-Serverless-cold-start/
ล่าสุดทาง Cloudflare เองได้แก้ปัญหานี้ด้วยการ Spin up ฟังก์ชัน Serverless ล่วงหน้าในระหว่างกระบวนการ TLS handshake ฟังก์ชันจะถูกเตรียมพร้อมอย่างรวดเร็วทันที ทำให้สามารถเริ่มต้นได้เร็วกว่าเวลาที่ใช้ในกระบวนการจับมือ (Handshake) ทำให้เกิดสภาพแวดล้อมการทำงานที่ไม่มี Cold Start เลย ซึ่งเป็นความก้าวหน้าอย่างมากในแพลตฟอร์ม FaaS
ในอนาคต เราจะเห็นการแก้ไขข้อจำกัดอื่น ๆ ของ Serverless อย่างต่อเนื่อง และด้วยการเติบโตของ Edge Computing ก็สามารถคาดเดาได้ว่าโครงสร้างสถาปัตยกรรมแบบ Serverless จะได้รับความนิยมแพร่หลายมากขึ้นในอนาคตอย่างแน่นอน
|