ความแตกต่างของ Stateless vs Stateful ในโลกของ Container

By KDBEER | Last updated Jan 2, 2021
ความแตกต่างของ-Stateless-vs-Stateful-ในโลกของ-Container-5ff0a66d7d58b8115aa4d591

เชื่อว่าหลายคนที่ทำงานในสาย IT น่าจะเคยได้ยินคำว่า stateful หรือ stateless กันมาบ้าง ซึ่งสองคำนี้ สำคัญอย่างมากกับแนวคิดการออกแบบ Software แต่จริงๆ แล้วมันหมายความว่ายังไง เชิญมาหาคำตอบร่วมกันเลยครับ

เรามักอ้างอิง 2 คำนี้กับการออกแบบ software architechture ครับ เพื่อต้องการรับ request จาก client และรอการประมวลผลจาก server ณ เวลาขณะใดขณะหนึ่ง แต่การที่จะเป็น stateful หรือ stateless ได้นั้น ก็ขึ้นอยู่กับว่า transaction นั้นๆ ต้องผ่านกระบวนการใดบ้าง ใช้เวลานานแค่ไหน เมื่อมี request เข้ามา สามารถทำงานจนจบได้เลยหรือไม่ หรือว่าอาจจะต้องไปค้นข้อมูลจาก transaction หรือข้อมูลที่เก็บไว้ก่อนหน้า

Stateless

ส่วนมากแล้ว stateless application มักจะประมวลผลได้เอง แบบตรงไปตรงมาโดยที่ไม่สนใจว่าข้อมูลก่อนหน้าเป็นแบบไหน ยกตัวอย่างเช่น โปรแกรมเครื่องคิด ค่าเริ่มต้นมักจะ set ไว้ที่ zero เสมอ โดยไม่สนใจว่าก่อนหน้านี้ user เคยคำนวณอะไรค้างไว้หรือไม่ หรืออีกตัวอย่างหนึ่ง สมมติว่าคุณพิมพ์งานในเว็บไซต์ออนไลน์ค้างไว้ อยู่ๆ ไฟดับและเปิดขึ้นมาใหม่ จากนั้นคุณพบว่าข้อมูลหายหมดเลย และคุณต้องพิมพ์ใหม่ นั่นก็เป็นอีกตัวอย่างของ stateless application ครับ

คุณลักษณะของ stateless application

  1. มีแค่ function หรือ service ที่ทำงานแบบตรงไปตรงมา เช่นอุปกรณ์ IoT
  2. ประมวลผลโดยที่สนใจแค่ request ปัจจุบัน โดยไม่สนใจข้อมูลก่อนหน้า
  3. สามารถมี server หลายตัวช่วยกันประมวลผลได้ โดยไม่ต้องกังวลว่าจะทำให้ข้อมูลปนกัน
  4. มีความยืดหยุ่นสูง
  5. สามารถทำ containerized หรือเอาโค๊ดมา pack เป็น docker ได้ง่าย
  6. สามารถกำหนดได้ง่ายว่าจะใช้ resource ให้เหมาะกับงาน

Stateful

อันนี้ก็ค่อนข้างที่จะตรงข้ามกับ stateless เลยละครับ จากที่ stateless app ประมวลผลโดยที่ไม่แคร์ข้อมูลที่มีอยู่แล้ว แต่ stateful จะสนใจข้อมูลที่มีอยู่แล้วหรือสนใจ context ของ transaction ที่เคยประมวลผลก่อนหน้า อาจพูดได้ครับว่า stateful นั้นส่วนมากแล้วต้องการที่เก็บข้อมูล หรือฐานข้อมูลแบบถาวรครับ ยกตัวอย่างเดียวกันกับ stateless ครับ คุณพิมพ์งานทิ้งไว้แต่พอไฟดับคุณยังสามารถทำงานต่อไปได้ โดยที่ข้อมูลไม่หายไป เป็นต้นครับ และต้องบอกว่า application ส่วนใหญ่ในปัจจุบันนั้นเป็น stateful นะครับ

คุณลักษณะของ stateful application

  1. ปกติแล้วจะใช้ database
  2. depend on transaction อื่นๆ
  3. มักจะใช้ server  เครื่องเดียว ประมวลผล request ที่เป็น context เดียวกัน
  4. การจัดการ services ต้องคำนึกถึง  network พื้นที่เก็บข้อมูล สถานที่ตั้งของ server เป็นต้น

Containers and state

Container คือสิ่งที่ pack code และ library รวมถึง dependency ที่จำเป็นให้เป็นก้อนเดียวกับ เพราะว่าเราอยากให้มันดีพลอยง่ายๆ และ scale ง่ายๆ แรกเริ่มเดิมทีนั้น container ถูกออกแบบมาให้เป็น stateless แต่ด้วยความต้องการที่จะนำมาใช้กับ stateful และบางบริษัทก็อยากจะย้ายระบบเดิมที่เป็น stateful อยู่แล้ว ขึ้น container ด้วย

ดังนั้นการออกแบบระบบในปัจจุบัน ส่วนมากจึงออกมาเป็นลูกครึ่งระหว่าง stateful และ stateless เช่น service ไม่ได้เชื่อมต่อกับ disk ถาวร แต่ระบบยังสามารถ track request ได้จาก cookies ว่า requets มาจาก user คนไหน

สมมติ ระบบไม่ได้เชื่อมต่อกับ database ที่เป็นฐาวรโดยตรงอย่าง mysql หรือ mongodb ทุกๆ ครั้งที่มี request เข้ามา เช่นเมื่อ user ต้องการจะทราบข้อมูล profile ของตัวเอง ระบบจะไปดูบน redis ก่อนว่ามีข้อมูลไหม ถ้าไม่มีค่อยไปหาต่อใน database ให้ โดนใช้ cookies ของ user เป็นตัวระบุตัวตน

จากตัวอย่างนี้ เราสามารถมี service นี้ ดีพลอยบนหลายๆ server ได้ครับ โดยที่ให้ server ไหนประมวลผลก็ได้ อย่างนี้คือ stateless แต่ระบบยังสามารถรู้ได้ว่า user เป็นใคร และจะไปหาข้อมูลที่ redis หรือ database ดี อยางนี้คือ stateful ครับ

 

Reference

https://www.contino.io/insights/stateless-vs-stateful-containers-whats-the-difference-and-why-does-it-matter

https://www.redhat.com/en/topics/cloud-native-apps/stateful-vs-stateless