Serverless คืออะไร? มารู้จักการพัฒนาระบบเว็บแบบใหม่ ราคาถูก แถมไม่ล่มง่าย ๆ

designil

ในช่วงไม่กี่ปีที่ผ่านมา แอดได้เห็นคนพูดถึงการพัฒนาระบบออนไลน์ด้วยระบบที่เป็น Serverless มากพอสมควรครับ แต่ไม่ได้ศึกษาจริง ๆ สักทีสักทีว่ามันคืออะไร

วันนี้มีโอกาสได้ไปฟัง Meetup ของผู้ใช้ Serverless มา ประกอบกับเพิ่งเรียนคอร์ส AWS Developer Associate Certification มาสด ๆ ร้อน ๆ แล้วรู้สึกว่า Serverless มันมีข้อดีที่น่าสนใจมาก นักพัฒนาในปัจจุบันควรรู้จัก เลยเอามาเล่าให้ฟังกันต่อครับจะได้เป็นประโยชน์กับทุกท่าน

อีกเหตุผลหนึ่งที่เอามาเล่าให้ฟัง ก็คือ แอดมินเพิ่งเริ่มงานในบริษัทที่ทำงานเกี่ยวกับ Data และปัจจุบันหลาย ๆ ที่เริ่มใช้ Cloud มากขึ้น เลยต้องศึกษา AWS Cloud และได้รู้จัก Lambda ครับ

ป.ล. เพื่อให้เข้าใจมากขึ้นเกี่ยวกับ Serverless แนะนำให้อ่านบทความเรื่อง Cloud Computing คืออะไร ที่แอดเขียนไว้เมื่อวันก่อน ครับผม

Serverless คืออะไร

serverless-computing.jpg
ปกติแล้วบริษัทใหญ่ต้องลงทุนซื้อเครื่อง Server และวางไว้ใน Data Center ซึ่งจะเป็นห้องโล่ง ๆ ระบายอากาศได้ดี แบบในรูปครับ

หากแปลตรงตัว เราจะได้ความหมายว่า Serverless จะหมายถึง “ไม่มี Server สักตัวเลย” แต่จริง ๆ ไม่ใช่แบบนั้นนะครับ

Serverless เป็นวิธีหนึ่งในการพัฒนาระบบออนไลน์โดยที่ผู้พัฒนาไม่ต้องลงทุนกับ Server เองสักตัวเลย โดยใช้ Infrastructure ของผู้ให้บริการ Cloud ต่าง ๆ เช่น Google Cloud, Amazon Web Services, หรือ Azure

โดย Serverless จะมาช่วยในด้าน Infrastructure ของระบบออนไลน์ เช่น การติดตั้งเซิร์ฟเวอร์ ส่วนในด้านภาษาโปรแกรมมิ่งเราก็สามารถใช้ภาษาเดิม โค้ดเดิมได้เลย แค่เปลี่ยนที่วางไฟล์โค้ดมาใส่ในระบบที่เป็น Serverless เท่านั้น

ในด้านของภาษาโปรแกรมมิ่งที่รองรับ ตอนนี้ AWS Lambda ซึ่งเป็นผู้ให้บริการ Cloud ที่มีผู้ใช้มากที่สุด รองรับ C# (.NET Core), Go, Java, Node.js, และ Python ครับ สำหรับใครที่ยังไม่มีความรู้ แต่อยากเริ่มเรียนสักภาษา แอดแนะนำ JavaScript (สำหรับคนอยากทำสาย Web Development) หรือ Python (สำหรับคนอยากทำสาย Data Science, IoT)

ก่อนที่จะมาเล่าว่า Serverless มันดียังไง เพื่อให้เข้าใจง่ายมากขึ้น ลองมาดูปัญหาของการพัฒนาระบบออนไลน์ในปัจจุบันกันก่อนครับ

การพัฒนาระบบออนไลน์มีค่าใช้จ่ายในการดูแลเยอะ

serverless-benefits.jpg
เวลาใช้ Serverless เราไม่ต้องคิดถึงกล่องเขียว ๆ ด้านล่างทั้งหมดเลยครับ

ในการพัฒนาระบบออนไลน์ทั่วไป ไม่ว่าจะเป็นเว็บไซต์ หรือ Backend ของ App ต่าง ๆ ปกติแล้วบริษัทก็ต้องเช่า Server หรือซื้อเครื่อง Server มาตั้งเอง และเปิดเอาไว้ตลอด 24 ชั่วโมงเพราะไม่รู้ User จะเข้าตอนไหน แถม Spec ของเซิร์ฟเวอร์ที่ใช้ก็มีจำกัด

ถ้าใช้ไปเรื่อย ๆ แล้วระบบโตขึ้น ก็ต้องมีการซื้อ Hardware ใหม่มาใส่ (เช่น อัพแรมให้สูงขึ้น) ปัญหานี้ก่อให้เกิด Cloud Server ขึ้นมา (เช่น Digital Ocean หรือ AWS EC2) ที่ให้เราสามารถย่อขยายเซิร์ฟเวอร์ได้อย่างอิสระตราบที่มีเงินจ่าย โดยแลกกับที่เว็บจะล่มไปแปปนึงเพื่ออัพเกรดหรือดาวน์เกรด

อีกปัญหาหนึ่งที่เกิดขึ้นเวลาพัฒนาระบบออนไลน์ คือ ต้องมีคนมาคอย Monitor ระบบตลอด 24 ชั่วโมง เพราะไม่รู้ระบบจะล่มตอนไหน ซึ่งก็ต้องใช้ผู้เชี่ยวชาญที่มีความรู้ เพราะเวลาทำระบบออนไลน์จะมีส่วนประกอบมากมายที่ทำงานร่วมกัน เช่น:

  • Data Center อยู่ที่ไหน และมีการกระจายข้อมูลไปเก็บไว้ใน Data Center หลาย ๆ ที่มั้ย
  • Hardware เครื่องเซิร์ฟเวอร์ (มีพื้นที่เท่าไหร่, CPU เท่าไหร่, RAM เท่าไหร่ ฯลฯ)
  • Operating System ระบบปฏิบัติการเช่น Linux (Ubuntu, RedHat, CentOS ฯลฯ) หรือ Windows Server
  • Programming Language ภาษาในการเขียนโปรแกรม (NodeJS, Java, Python ฯลฯ)

คนที่ดูแลระบบต้องมีความรู้ว่าถ้าระบบเกิดมีปัญหาขึ้นมา ปัญหาจะมาจากส่วนไหน ไล่ดู Log กันสนุกสนาน

และโดยเฉพาะอย่างยิ่ง ถ้าเป็นทีมพัฒนาเล็ก ๆ ที่ไม่มีทีม Security มาคอยซัพพอร์ท แล้วต้องคอยดูเองทั้งหมด ชีวิตก็จะยุ่งยากขึ้นอีกหลายเท่าเลยครับ นอกจากจะเอาเวลาไปพัฒนาระบบหลักแล้ว ยังต้องเจียดเวลามาแก้ปัญหา Infrastructure ด้วย

ฮีโร่ที่มาช่วยแก้ไขปัญหานี้ คือ… Serverless นั่นเองครับ

Serverless ช่วยให้ชีวิตนักพัฒนาไม่ต้อง Manage Server อีกต่อไป

Serverless ตัดปัญหาที่เราต้องในการดูแลรักษาส่วน Infrastructure เองทิ้งไปทั้งหมด เพราะคนที่จะดูแลส่วนนั้น คือ ผู้ให้บริการ Cloud นั่นเอง เค้าจะคอยดูแลระบบไม่ให้เกิดปัญหา ส่วนเรามีหน้าที่แค่อัพโหลดโค้ดเข้าไปก็รันได้เลย

ลองดูตัวอย่าง UI ของ Serverless กันจะได้เห็นภาพมากขึ้นครับ ที่เอามาให้ดูเป็นหน้าตาของ AWS Lambda ส่วนเจ้าอื่น ๆ ก็จะคอนเซปต์เหมือนกันครับ

serverless-function-windows.png
เราสามารถเขียนโค้ดใส่ในเว็บได้เลย หรือถ้าไม่ถนัดก็ใช้วิธีเขียนเสร็จแล้วอัพโหลดไปทั้ง ZIP ก็ได้

จากภาพด้านบน จะเห็นว่า Serverless ก็เหมือนกับเวลาเราเขียนโค้ดใน Text Editor เช่น Sublime Text / Atom / VS Code เลย แต่ปกติเราต้องเขียนแล้วอัพโหลดขึ้นโฮสติ้ง ไม่ว่าจะด้วย FTP หรือ SSH แต่ใน Serverless คือกดเซฟแล้วรันโค้ดได้เลย

ใน Serverless โค้ด 1 ก้อนใช้รัน 1 ฟังก์ชั่นเท่านั้น (หรือที่เค้าเรียกว่า FaaS – Function as a Service) ทำให้โค้ดไม่ซับซ้อนเพราะมีเป้าหมายเดียว แต่การวางแผนให้แต่ละฟังก์ชั่นเชื่อมกันเพื่อทำงานร่วมกัน อันนี้แอดคิดว่าค่อนข้างท้าทายสำหรับคนที่เริ่มต้นใหม่ ๆ ครับ

ประโยชน์ของการย้ายระบบธรรมดามาเป็น Serverless ตามปกติเราเช่า Web Hosting โดยเหมาจ่ายเงินรายเดือนแล้วจะได้สเป็คตามที่เค้าระบุไว้ และรัน 24 ชั่วโมง (ยกเว้นตอนโฮสต์ล่ม) แต่ Serverless ใช้วิธีคิดเงินตามวินาทีที่รัน ถ้าไม่รันก็ไม่ต้องจ่าย ส่วน RAM เราปรับได้เองเลยว่าอยากให้รันด้วยแรมขนาดไหน ค่าใช้จ่ายก็เข้าใจง่าย คือ ยิ่งเรากำหนดให้ใช้แรมเยอะ ราคาต่อวินาทียิ่งแพง

serverless-ram-setting.jpg
ตั้งค่าเองได้เลยว่าจะเอา RAM เท่าไหร่ และให้รันสูงสุดนานแค่ไหน

สำหรับใครที่อ่านมาถึงตรงนี้แล้วคิดว่า “งั้นเช่า Web Hosting ต่อไปดีกว่า เปิดไว้ได้ 24 ชั่วโมงด้วย เพราะไม่รู้ User จะเข้าเว็บตอนไหน” อันนี้ผมเข้าใจครับ เพราะตอนแรกก็คิดแบบนั้น แต่ขออธิบายเพิ่มเติมนิดนึงว่า Serverless จริง ๆ แล้วก็เรียกว่ารัน 24 ชั่วโมง เพราะเราจะสั่งให้มันรันตอนไหนก็ได้ แค่ตอนไม่รันมันไม่คิดเงินเรา

อีกปัญหาของ Web Hosting ทั่วไป คือ พอคนเข้าเยอะ ๆ เว็บก็ล่ม ซึ่งเจอกันบ่อย ๆ เป็นปกติครับ

ตัวอย่างสถานการณ์แบบนี้ เช่น ปกติเว็บข่าวแห่งหนึ่งมีคนอ่านวันละ 10,000 คน แต่อยู่ ๆ ไปเล่นประเด็นร้อน มีคนเข้ามาอ่านพร้อมกัน 100,000 คนใน 5 นาทีแรกที่ปล่อยข่าว ถ้าเป็นโฮสต์ปกติก็ล่มไปตามระเบียบ แถมดีไม่ดีผู้ให้บริการโฮสติ้งจะเมลมาบอกด้วยว่าให้อัพเกรดไปแพลนที่แพงขึ้น (เหตุการณ์จริง)

ทางแก้ถ้าใช้ Hosting ทั่วไปก็คือ จ้างผู้เชี่ยวชาญมาเซ็ต Server ให้รับโหลดได้เยอะ ๆ, ใส่แคชเข้าไป, อัพเกรดแพลน Hosting ให้สูงขึ้น ซึ่งไม่รวมค่าใช้จ่ายในการดูแลเซิร์ฟเวอร์รายเดือนที่อาจจะมีเพิ่มขึ้นมาอีก

ถ้าระบบของเราใช้ Serverless ระบบจะทำการ Horizontal Scale แบบอัตโนมัติ ทำให้จู่ ๆ คนเข้าเยอะ ๆ ก็ไม่มีปัญหาครับ แค่จ่ายเงินเพิ่มในช่วงเวลานั้นเท่านั้น เพิ่มความสบายใจให้โปรแกรมเมอร์อย่างเราขึ้นอีกเยอะ

ราคาของ Serverless: มันเหมาะกับเว็บคนเข้าน้อย ๆ อย่างเดียวหรือเปล่า

สิ่งนึงที่ทำให้ Serverless มีคนหันมาใช้เยอะ ก็คือเรื่องของ “ค่าใช้จ่าย” นี่แหละครับ เพราะค่าใช้จ่ายน้อยมาก ๆ เทียบกับค่าเซิร์ฟเวอร์รายเดือนทั่วไป

ก่อนหน้านี้ผมบอกไปว่า “Serverless ไม่คิดเงินถ้าโค้ดไม่รัน” หลายคนอาจจะเข้าใจว่า “งั้นถ้าเว็บเราคนเข้าเยอะ ๆ ก็ไม่ควรใช้ Serverless”

ความคิดนี้ก็ไม่ถูกซะทีเดียวครับ

เหตุผลแรก ส่วนใหญ่ผู้ให้บริการ Cloud จะมี Free Tier แปลว่า สามารถใช้ทรัพยากรส่วนหนึ่งได้ฟรี ถ้าเกินจากนั้นค่อยจ่ายแค่ส่วนที่เกิน เช่น AWS Lambda ให้เราเรียกใช้ฟรี 1 ล้านครั้ง ถ้าเกินจากนั้นคิด 7 บาทต่อ 1 ล้านครั้ง ถ้าเว็บเราไม่ได้มีคนใช้เกิน 1 ล้านครั้งต่อเดือนอยู่แล้วก็ใช้ฟรีไปเลยครับ

ผมเรียนคอร์ส AWS มาจาก A Cloud Guru ซึ่งเป็นเว็บสอนใช้ Cloud ที่มีนักเรียนมากกว่า 600,000 คน ซึ่งเว็บเค้าเป็น Serverless ทั้งหมด คนสอนบอกว่า “ใน 2 ปีที่เปลี่ยนมาใช้ Serverless… ยังไม่ได้จ่ายค่า AWS Lambda เลยสักบาท”

ป.ล. ข้อมูลจาก SimilarWeb บอกว่าเว็บไซต์ของ A Cloud Guru คนเข้า 1.5 ล้านครั้งต่อเดือน

acloudguru-serverless-architecture.jpg
Architecture แบบ Serverless ของ A Cloud Guru – จากคอร์ส AWS Developer Certificate

จะเห็นว่าราคาของ Serverless ถูกแบบน่ากลัวมาก ๆ ครับ และได้ประโยชน์ไม่ว่าเว็บเราจะคนเข้ามากหรือน้อย

ตัวอย่างการใช้ Serverless: ระบบคิดเงินทางด่วนแบบอัตโนมัติ

อันนี้เป็น Case Study การใช้ Serverless ที่เค้าเอามาเล่าใน Meetup ครับ แอดคิดว่าเข้าใจง่ายดี และเห็นภาพประโยชน์ของ Serverless ชัดเจน เลยขอเอามาเล่าต่อให้ฟังครับ

serverless-meetup-toll-road.jpg
คล้าย ๆ ระบบ Easy Pass สำหรับขึ้นทางด่วนบ้านเราครับ แต่อันนี้ไม่ต้องใช้การ์ดอะไรเลย

เป้าหมายของระบบ: ต้องการพัฒนาระบบสามารถเก็บเงินค่าทางด่วนโดยอัตโนมัติ โดยจะดูจากป้ายทะเบียนรถที่เข้ามาในด่าน และทำงานตามเงื่อนไขดังนี้

  • ถ้าทะเบียนรถคันนั้นมีเงินในระบบ ก็จะตัดเงินแล้วเปิดทางอัตโนมัติ
  • ถ้าทะเบียนรถคันนั้นไม่มีเงินในระบ บก็จะไม่เปิดทาง และให้พนักงานที่ด่านเก็บเงินเพิ่มแทน

ซึ่งระบบนี้ต้องทำงานได้รวดเร็ว (เพราะถ้ารอนานคนขับรถคงด่า) และรองรับคนใช้งานเยอะ ๆ ในช่วง Rush-hour ที่มีคนขึ้นทางด่วนเยอะได้ครับ

toll-road-serverless-architecture.jpg
Architecture ของระบบเก็บเงินค่าทางด่วนอัตโนมัติ

วิธีวางระบบนี้ด้วย Serverless: เนื่องจากคนพูดมาจาก Amazon เค้าเลยยกตัวอย่างด้วยการใช้บริการของ Amazon ทั้งหมดครับ สามารถใช้ของผู้ให้บริการเจ้าอื่นได้ด้วยแนวทางเดียวกันครับ

  1. Input เป็น รูปทะเบียนรถ
  2. Function 1 จะทำงานโดยส่งรูปไปที่ API ของ Amazon Rekognition (API สำหรับทำความเข้าใจรูป หรือวีดิโอ) เพื่อแปลงรูปเป็นเลขทะเบียนรถ
  3. Function 2 จะนำเลขทะเบียนรถไปดึงจำนวนเงินในระบบของรถคันนั้นจาก Amazon DynamoDB (ฐานข้อมูล NoSQL)
  4. Function 3 จะเช็คว่าเงินในระบบพอจ่ายค่าทางด่วนมั้ย ถ้าเงินในระบบพอก็จะตัดเงินออกไปจากในฐานข้อมูล ถ้าไม่พอก็จะแจ้งไปที่พนักงานว่าเงินไม่พอ

จะเห็นว่าทุกขั้นตอนสามารถจัดการได้ด้วยการเขียนโค้ด Function เพื่อให้ Serverless ทำงานได้ทั้งระบบเลยครับ แถมถ้าช่วงที่รถน้อยก็ไม่ต้องจ่ายแพง ถ้าช่วงรถเยอะก็สามารถขยายระบบได้อัตโนมัติ เรียกได้ว่าตอบโจทย์ความต้องการมากครับ

สำหรับการจัดการ Serverless ในกรณีที่มีหลายฟังก์ชั่น และหลาย Condition ทำงานร่วมกัน ถ้าวางเองก็ปวดหัวแน่นอนครับ เค้าเลยมีใช้สิ่งออกมาแก้ปัญหานี้ ชื่อ AWS Step Function เป็นระบบช่วยลิงค์ AWS Lambda หลาย ๆ ฟังก์ชั่นเข้าด้วยกัน แถมสามารถดูการทำงานแบบ Real-time ได้ว่าเกิดปัญหาตรงไหนมั้ย

aws-step-function-serverless-workflow.jpg
Workflow สวยงามเข้าใจง่าย ใน AWS Step Function

สำหรับใครที่สนใจดูสไลด์แบบเต็ม ๆ แอดเพิ่งไปเจอมา (เค้าไม่แจกใน Meetup T_T) ดูได้ที่นี่เลยครับ: AWS Dev Lounge: Applying Twelve Factor Application Manifesto to Serverless Application

ถ้าสนใจใช้ Serverless มีทางเลือกไหนบ้าง

ปัจจุบันผู้ให้บริการ Cloud ดัง ๆ ล้วนมีบริการ Serverless ออกมากันทั้งนั้นครับ ตัวที่แอดใช้บ่อยที่สุด คือ AWS Lambda ซึ่งรองรับหลายภาษา และทำ Platform มาได้ค่อนข้างดีเลยครับ เสียอย่างเดียว คือ AWS ต้อง Config พวก Security ค่อนข้างเยอะ ถ้าเปิดไปครั้งแรกอาจจะงงเรื่อง Role, Policy, VPC ฯลฯ

google-cloud-function-usecase.jpg
Use Case ของการใช้ Serverless ทำ Chatbot ที่สั่งการด้วยเสียงได้ จาก GCF Use Cases

ส่วนเจ้าอื่น ๆ ก็มี Google Cloud Functions ที่น่าสนใจเหมือนกันครับ เพราะดู Friendly มากกว่าเล็กน้อย แอดชอบตรงมีหน้าต่าง SSH ให้เราเปิดใช้งานจากในเว็บได้เลย ส่วนถ้าใครชอบสาย Microsoft ก็มี Azure Functions ครับ (ตัวหลังยังไม่เคยใช้)

ข้อดี – ข้อเสียของ Serverless คืออะไรบ้าง

แอดเชื่อว่าเทคโนโลยีก็เหมือนเหรียญที่มีสองด้านครับ แต่ละ Technology มีข้อดี – ข้อเสียแตกต่างกันไปครับ ไม่มีอะไรดีที่สุดและแย่ที่สุด อยู่ที่ว่าอันไหนเหมาะกับงานไหนมากกว่าแค่นั้นเอง

ลองมาดูกันว่าสำหรับ Serverless แล้วมีข้อดี – ข้อเสียอะไรที่เราต้องรู้ไว้บ้างครับ

ข้อดีของ Serverless

  • Cost – ราคาถูกมาก คิดเงินตามจำนวนวินาทีที่รัน ไม่ต้องเหมาจ่ายรายเดือนแบบ Server ทั่วไป
  • Automatic Scale -ไม่ต้องกลัวระบบล่ม Scale แนวกว้างเองได้ถ้าอยู่ ๆ มีคนเข้าเยอะ ๆ
  • Managed Infrastructure – มีคนดูแล Infrastructure ให้หมด เรามีหน้าที่แค่อย่าเขียนโค้ดให้ไม่ติดบั๊กก็พอ ช่วยให้คนเขียนโค้ดทำงานง่ายขึ้นมาก
  • High Availability – โค้ดของเราถูกก็อปไป Backup ไว้หลาย Data Center ทำให้โอกาสโค้ดหายน้อยมาก ๆ (เช่น มีคนไปวางระเบิด Data Center สามที่พร้อม ๆ กัน)

ข้อเสียของ Serverless

  • Vendor Lock-in – ย้ายระบบได้ยากถ้าทำเสร็จไปแล้ว เพราะจะผูกกับผู้ให้บริการ Cloud นั้น ๆ ไปเลย (ยกเว้นแต่ว่าในอนาคตจะมีวิธีง่าย ๆ ในการย้าย) เช่น ใช้ของ Amazon อยู่ จะเปลี่ยนไป Google Cloud นี่เซ็ตใหม่กันหัวแตก
  • Engineering Difficulty – ต้องมีการวางแผนระบบว่าอะไรเชื่อมต่อกับอะไรบ้าง เพราะทุกอย่างแยกกันเป็น Function เล็ก ๆ หมด ถ้าไม่มีการวางแผนที่ดีจะมั่วได้ง่าย ๆ แถมถ้ามีอะไรพังก็ตรวจสอบยากเพราะระบบลิงค์กันเยอะ (แก้ปัญหาโดยใช้ระบบ Log เช่น AWS CloudWatch และ X-Ray ช่วยได้)

หวังว่าบทความนี้จะทำให้เพื่อน ๆ รู้จัก Serverless กันมากขึ้น และสนใจมาลองใช้กันดู เดี๋ยวนี้บริษัทใหญ่ ๆ เช่น Netflix (ดูวีดิโอ Case Study ได้ที่เว็บ AWS Lambda), Coca Cola ก็เปลี่ยนมาใช้ Serverless แบบเต็มรูปแบบแล้วครับ และในอนาคตคิดว่าจะมีคนมาใช้เพิ่มขึ้นอีกเรื่อย ๆ ครับ

ถ้าชอบบทความเกี่ยวกับ Web Development แบบอธิบายละเอียด เข้าใจง่ายแบบนี้ ติดตามบทความใหม่ ๆ ของเราได้จากทาง Facebook Page Designil หรือสับตะไคร้ให้บทความใหม่ส่งไปที่อีเมลของคุณอัตโนมัติ ในกล่องสมัครรับข่าวสารด้านล่างเลยครับ

 

designil

designil

Data engineer & WordPress Developer ทำงานที่บริษัทแคนว่า ซิดนีย์ออสเตรเลีย ปัจจุบันเป็นเจ้าของเว็บไซต์ Designil, DataTH ชอบอ่านบทความใหม่ๆ ตลอดเวลา และชอบสรุปเรื่องราวเกี่ยวกับเทคโนโลยีให้ภาษาที่เข้าใจง่าย ยินดีที่ได้รู้จักทุกคนนะครับ
บทความทั้งหมด