มารู้จัก Serverless Platform 3 ตัวนี้กัน มันดีอย่างไรและเมื่อไหร่ที่คุณควรจะใช้มัน

Focus on your application, not your infrastructure

สมัยนี้แล้ว เวลาที่ Developer สร้าง app หรือ service ขึ้นมาหนึงตัว แล้วเราอยากเอาระบบใหม่ขึ้นบ่อยๆ ตามหลัก Continuous Deployment เราก็ไม่ควรจะเสียเวลาจัดการเรื่อง infrastructure ใหม่ทุกครั้ง เราควรแค่เขียนโค้ดเสร็จ จากนั้น push ขึ้น git (ที่เก็บซอร์สโค้ด) แล้วระบบก็ควรจะจัดการ update infrastructure แบบ no downtime ให้อัตโนมติ จากนั้นเราก็นำ url ไปใช้ได้เลย

แล้วในงานระดับ Production ก็ควรจะมีระบบ auto scale ได้เพื่อรองรับโหลดที่อาจจะเข้าแบบพุ่งพวดได้ และก็ควรจะมี tools สำหรับ Logging และ Monitoring ระบบว่ามีผู้เยอะแค่ไหน ในแต่ละ service เท่าไหร่ เราควรรู้ว่าอะไรจะต้อง optimize ตรงไหนเพิ่ม และเวลาเกิดปัญหา สามารถ trace กลับไปหา error หาสาเหตุได้โดยง่าย

และนี่คือมาตรฐานใหม่ของแอพพลิเคชั่นยุคปัจจุบัน (จริงๆ บางอย่างไม่ต้องมีก็ได้ ขึ้นอยู่กับงานด้วย) โดยทั่วไปต้องอาศัยประสบการณ์ เวลา และยอดฝีมือหลายคน ในการสร้างสิ่งเหล่านี้ขึ้นมา

ชีวิต Developer สมัยนี้นี่มันยากจริงๆ แต่ในปัจจุบัน เรามีหลาย solution ที่ช่วยลดงานพวกนี้ลง เพราะ solution เหล่านี้คอย integrate service อื่นๆ ไว้ให้หมดแล้ว

เริ่มตั้งแต่พวก PaaS (Platform as a Service) เช่น Heroku ที่จัดการเรื่องพวกนี้ให้ หรือจะใช้ Open source ที่กำลังเป็นที่นิยม อย่าง Kubernetes ผ่าน Google Cloud Platform ที่มี feature ครบครัน ทำได้แทบจะทุกอย่าง ก็จัดการเรื่องพวกนี้ได้ดีเดียว

ซึ่งแต่ละวิธีที่เล่ามา ก็มีข้อดีข้อเสียต่างกัน เช่น Heroku ตัวฟรีจะข้อจำกัดเยอะ และจังหวะ scale ก็แพงหู่ชี่ ส่วนถ้าเป็น Kubernetes การ setup เบื้องต้นเยอะกว่า มีความยากสำหรับผู้เริ่มต้น และเหมาะเปิดกับเครื่องที่ใหญ่ระดับนึง จึงไม่เหมาะกับ project เล็กๆสั้นๆ

ซึ่งในบางสถานการณ์ เช่น การทดสอบ Experiment เล็กๆ การทำ MVP หรือ Hackathon เราต้องการวิธีที่รวดเร็วและทรงพลังที่จะส่งมอบงานตัวเองให้คนอื่นดูได้

วันนี้ผมเลยขอเสนอตัวเลือกอย่าง Serverless Platform ที่มีจุดเด่นอยู่ที่การ setup น้อย deploy ง่าย เอา url ให้คนอื่นนำไปใช้ได้เลย และสามารถรองรับโหลดมหาศาลได้สบายอีกด้วย มาลองดูกันดีกว่า


Serverless คืออะไร ต่างอะไรกับที่ใช้ๆกันอยู่

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

แต่เมื่อระบบส่วนใหญ่อาจจะมี peak hour จริงแค่สูงสุด 2–3 ชั่วโมงต่อวัน ทำให้ในช่วงเวลาปกติ เราจะพยายามไม่ให้ระบบกิน resource เยอะนัก เพื่อรอรับ peak hour ทำให้มี resource idle อยู่เยอะ

แล้วถ้าวันไหนมี load เข้ามาเยอะมากๆ และคาดเดาไม่ได้ เช่น ในระดับ 5–10 เท่าของปกติ (ให้นึกถึงวันหวยออก แล้วคนเข้ามาเช็คหวยที่เว็บเรา) เราก็อาจจะต้อง setup load balancer และสร้าง auto scale policy เพื่อรองรับโหลดขนาดมหึมาและทำให้ resource idle ไม่มากเกินไป (แต่ก็ต้องเพียงพอเพื่อที่เวลาคนเข้ามาเยอะๆ ต้อง scale ทัน) ซึ่งจะนำพาปัญหาต่างๆ ตั้งการเซ็ตอัพ ค่าใช้จ่ายเบื้องต้น รวมถึงการ maintain เพื่อให้ระบบ available ตลอดเวลา

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

สำหรับคำอธิบายความแตกต่างเพิ่มเติม ขอแนะนำให้เข้าไปอ่าน https://martinfowler.com/articles/serverless.html ได้เลยครับ


แนะนำบริการแบบ Serverless

ขอแนะนำ Serverless service 3 ตัวครับ Firebase, Graphcool, Lambda ทั้ง 3 มี Free Tier ให้ใช้งานได้อย่างสบายๆ ไปลองกันได้เลย แต่รอฟังผม review ให้คร่าวๆก่อนนะ

1. Firebase

Firebase เป็นบริการ Serverless ยอดนิยมจาก Google ที่รวมบริการหลายๆ อย่างเอาไว้ โดย focus ไปที่ mobile developer รวมถึงบริการที่เป็น serverless เช่น

  • Hosting เพื่อให้บริการ managed hosting service ที่ให้บริการ static web hosting ที่ scale ได้ไม่จำกัด และ deploy ง่ายมากๆ
  • Cloud Functions เป็น FaaS (Function as a Service) ที่ให้เรา deploy function ที่เราเขียนขึ้นไปฝากไว้ แล้วสั่งให้คอยทำงานอัตโนมัติเมื่อ Realtime Database หรือ Storage มีการอัพเดทค่า หรือเรียกผ่าน url ที่ได้มาเมื่อสั่งสร้าง function
  • Realtime Database เป็น BaaS (Backend as a Service) ที่ทำให้สามารถเขียนอ่านไฟล์ได้จากฝั่ง web/mobile ได้โดยไม่ต้องตั้ง server เลย แถมระบบแบบ realtime มาให้ด้วย ทำให้เราสามารถสร้างระบบอย่าง Chat System ขึ้นมาใช้ได้อย่างง่ายดาย
  • Storage ที่ให้เราสั่ง upload file เสร็จแล้วก็ได้ url ได้เต็มที่ โดยที่ไม่ต้องกังวลว่า harddisk จะเต็มไหม ทำให้ไม่ต้องมา scale เอง แล้วยังสามารถ hook event กับ Cloud function ได้อีกด้วย ตามตัวอย่างตามรูปด้านล่าง ที่คอย process รูปที่ upload ขึ้นมา แล้วทำเป็น thumbnail ให้อัตโนมัติ
use case การ hook event ให้สร้าง thumbnail ให้อัตโนมัติ https://firebase.google.com/docs/functions/use-cases

เรื่อง Scale ถึงจะ Autoscale ไม่ต้องไปยุ่งกับ infra เอง แต่ยังมีข้อจำกัดอยู่ เช่น Realtime Data จะรองรับได้สูงสุด 100,000 concurrent connection ซึ่งก็เยอะมากแล้ว แต่ถ้าระบบใหญ่กว่านั้นก็ต้องพิจารณาทางเลือกอื่น

เรื่องความง่าย เราสามารถสร้างโปรเจ็คด้วย CLI โดยใช้คำสั่ง firebase init และการ deploy code ก็แค่สั่ง

firebase deploy

ระบบก็จะจัดการเอา Static files, Functions และ DB configuration ขึ้นให้เลย แล้วก็จะได้ url กลับมา ง่ายนิดเดียว ซึ่งนี่เป็นข้อดีข้อนึงของ GCP/Firebase ที่เก่งเรื่อง Developer Friendly นี่แหละ

สั่ง Deploy ทุกอย่างด้วยคำสั่งเดียว

ถ้าใช้ Firebase ก็ยังสามารถใช้บริการอื่นๆ จาก google cloud platform ได้เลยนะ บริการ Serverless จาก google cloud ก็เช่น Bigquery, Cloud PubSub เป็นต้น

Firebase เป็นบริการที่ถือว่าครบระดับนึง แต่ถ้าจะใช้จริงๆ จังๆ ที่ต้องดูหนักๆ เลย นอกจาก feature ยิบย่อยแล้ว คือเรื่องราคากับเรื่อง Database ที่จะไม่ตอบโจทย์กับงานประเภทที่ต้องการ Relation ของข้อมูล แต่เราก็สามารถเลี่ยงไปใช้ Google Cloud SQL ที่เป็นบริการของ Google Cloud Platform ก็ได้

2. Graphcool

น้องใหม่ไฟแรง Serverless ที่ Focus ที่ API แบบ GraphQL ที่กำลังเป็นที่นิยม ที่สร้างขึ้นมาชนกับ Firebase โดยตรง

ภาพจาก https://www.graph.cool/ ที่จับ feature ชนกับ firebase ตรงๆ

Core หลักคือ Data แบบมี Type มี Relation ได้ และ API เป็นแบบ GraphQL ที่จะคอยสร้าง Query, Mutation, Subscribtion ให้อัตโนมัติ เพียงแค่เราไปประกาศ Schema และโยง relationship ระหว่าง model ซึ่งทำให้เราได้ระบบแบบ RDBMS มาใช้ได้อย่างรวดเร็ว

สามารถใช้ได้ทั้งกับ Apollo Framework และ Relay Framework ทำให้ใช้งานได้กับหลายภาษา หลาย framwork ทันที เช่น React, React Native, Apollo, Vue.js, iOS Native, Android Native เป็นต้น อีกทั้ง Graphcool ยัง integrate Tools ของ GraphQL มาให้ใช้อย่างมากมาย ทำให้ Graphcool เป็นตัวเลือกที่น่าสนใจขึ้นไปอีก

โฟกัสที่ GraphQL มี tool มากมายให้ใช้งาน

นอกจากเรื่อง Database Graphcool ก็ยังมีบริการพวก Storage และ Functions แบบ Serverless ให้ใช้ รวมถึงบริการอื่นๆ เช่น Notification หรือไป integrate กับ Auth0 เพื่อ login ด้วย Social Network หรือเบอร์โทรศัพท์ผ่านได้ จึงเรียกได้ว่ามีครบระดับนึงเลยทีเดียว สามารถเข้าไปดู feature อื่นๆ ได้จาก https://www.graph.cool/features/

Integration ต่างๆ ยังมีแค่ที่เกี่ยวกับ Auth กับ Search

จากการที่ผมได้ลองแล้ว ตัว Graphcool นั้นจะเหมาะกับการทำงานแบบ Relational Data มาก เราสามารถออกแบบได้ด้วยพื้นฐาน RDBMS ได้เลย ทำสามารถสร้าง application ได้หลากหลายมาก

ถึงจะมี features ที่โดดเด่น แต่จากการทดลองใช้แล้ว ยังพบว่ายังมีข้อจำกัดอยู่เยอะ เมื่อเทียบกับ platform อื่นๆ เช่น ยังใหม่อยู่ Community ยังไม่ Mature นักเวลาเจอ bug ของระบบอาจจะยังต้องรอให้แก้ เรื่องการ Scale ของระบบยังไม่ถูก prove ว่ารองรับได้ระดับไหน

ทั้งยังอ่อนเรื่องระบบที่ช่วย Logging/Monitoring ดีๆ รวมถึงการ update code ผ่าน CLI ยังทำได้ไม่สมบูรณ์นักในเวอร์ชั่นหลัก (ซึ่งในเวอร์ชั่นถัดไปจะสามารถ update ผ่าน CLI ได้สมบูรณ์มากขึ้นแล้ว ลองก่อนได้จาก https://blog.graph.cool/graphcool-framework-preview-ff42081b1333)

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

3. AWS Serverless

ลองมาดูรุ่นใหญ่ของ Serverless อย่าง AWS กัน หลายคนน่าจะเคยได้ยิน หรือได้ลองใช้ AWS Lambda มากันบ้างแล้ว

AWS Lambda เป็น FaaS ที่ support ภาษามากที่สุดคือ Node.js, Java, C#, Python แถมราคาถูก free-tier ให้มาเยอะมากๆ ถ้าฟังก์ชันคุณ ใช้แรมไม่เกิน 128MB​ (ต่อการเรียก 1 ครั้ง) จะใช้ได้ฟรีๆ สูงสุดถึง 3.2 ล้านวินาทีต่อเดือน (ถ้าใช้เวลา 1 วินาที ต่อการรัน 1 ครั้ง จะรันได้ทั้งหมด 3.2 ล้านครั้งนั่นเอง) https://aws.amazon.com/lambda/pricing/

แต่จุดแข็งที่สำคัญที่สุด น่าจะอยู่ที่ Integration ภายในที่เยอะมากๆ ครับ

บริการที่เป็น Serverless ของ AWS https://aws.amazon.com/serverless/
  • S3 ต่อกับ Storage Service เพื่อคอยจัดการไฟล์ที่ถูก upload ขึ้นมาใหม่ เช่น การย่อรูปอัตโนมัติ
  • DynamoDB ตัวนี้จะเป็น Database as a Service ซึ่งจะต่างจาก Firebase และ Graphcool ที่เป็น BaaS ตรงที่ จะไม่มี API มาให้ frontend เรียกใช้และไม่มี feature อย่าง realtime แต่ข้อดีคือ Scalability และราคาที่ดีกว่ามากๆ และยังสามารถ hook event เพื่อให้ Lambda ทำงานได้เหมือนตัวอื่นๆ
  • Scheduled events ผ่าน CloudWatch เป็นหนึ่งสิ่งที่ยังหาจากที่อื่นไม่ได้ โดยเราสามารถสร้าง cron expression ง่ายๆ ไปฝากไว้กับ CloudWatch เพื่อให้มันมาเรียก function ตามเวลาที่เรากำหนด โดยเราไม่ต้องไปเปิดเครื่องเพิ่มเพื่อทำแค่การตั้งเวลา
  • ระบบจะแยก Logging, Monitoring ไปให้ CloudWatch ที่เป็น service แยกจัดการเรื่องนี้แทน ถ้ายังไม่ดีพอ ก็ stream ออกไปตัวอื่นจัดการต่อได้

อีกทั้งยังมี integration อื่นๆ อีกที่ผมยังลองใช้ไม่หมด เช่นต่อกับ Kinesis, CloudTrail, SNS ลองเข้าไปดูได้ที่ https://docs.aws.amazon.com/lambda/latest/dg/use-cases.html

ตัวอย่างการนำไปใช้​โดยต่อ Kinesis และ Dynamodb https://aws.amazon.com/serverless/

แถมยังมีคนทำ framework หลายตัว มาช่วยจัดการระบบตรงนี้ ให้ใช้ได้อย่างง่ายดาย อย่างตัว https://github.com/serverless/serverless ที่มียอด stars ใน github ประมาณ 20,000 เลยทีเดียว ทั้งยังมี example ให้ดูและ plugin ให้ใช้มากมาย เข้าไปดูได้ใน repo เลย

มี Framework Stars ~20k ให้ใช้ http://serverless.com

หรือจะใช้ framework ที่ lightweight กว่าของ TJ Holowaychuk อย่าง http://apex.run/ ก็ได้

โดยรวมแล้ว ถึงจะไม่ได้ดูหรูหราเหมือนจ้าวอื่นและเริ่มต้นใช้ยากกว่า แต่ AWS ก็เป็น Platform serverless ที่มีรายละเอียดปลีกย่อยเยอะที่สุดแล้ว


สรุป

ทั้ง 3 ตัวมี feature ไม่เหมือนกันซะทีเดียว คงบอกได้ว่าต้องเลือกใช้งานตามความเหมาะสม

  • ถ้าอยากได้ Realtime ก็ใช้ Firebase
  • ถ้าอยากได้ GraphQL ก็ใช้ Graphcool
  • ถ้าเน้น Integration เยอะๆ แน่นๆ ราคาดีๆ ก็ใช้ AWS Lambda

หรือจริงๆ จะใช้ร่วมกันหมดเลยก็ยังได้ แต่ก็ต้องยอมเสียค่าใช้จ่ายเพิ่มกันหน่อยละ

Serverless ยังไม่ได้พร้อมกับทุกอย่าง ควรศึกษาข้อดี ข้อเสียของ Serverless ไว้เพิ่มเติมด้วย แนะนำให้ลองไปอ่านบทความด้านล่างเพิ่มเติมนะ https://devops.com/go-serverless-pros-cons/

โดยรวมแล้ว Serverless จะลด Operation Cost ลงทำให้ปัญหาหลัง dev เสร็จจะน้อยลง เหมาะกับทีมเล็กที่ไม่มีคนดูแลแยก และสามารถนำไปใช้ได้กับโปรเจ็คบางประเภทแล้ว เช่น สำหรับ พวก Microservices, Experiment สั้นๆ, Startup MVP หรือถ้าไปแข่งพวก Hackathon ก็ถือเป็นทางเลือกที่ดีทีเดียว

อาจจะยังถือว่ายังโตไม่เต็มที่ คนนำไปใช้จริงๆ จังๆ ยังน้อยอยู่ แต่ปีทีที่แล้วกับ Docker คนก็พูดไว้แบบเดียวกัน แล้วปีนี้กลับกลายเป็นปีของ Docker/Kubernetes ซะแล้ว เพราะงั้นศึกษาไว้ไม่เสียหาย ปีหน้ามันอาจจะกลายเป็นปีของ Serverless ก็ได้นะ :D