Session ไม่ตาม! เพราะ Load Balancer บน Magento2
เมื่อเร็วๆนี้ ผมได้ทำงานเกี่ยวกับพวก Marketplace บน Magento2 ซึ่งเป็นแพลตฟอร์มอีคอมเมิร์ซที่ใช้งานมากในระดับองค์กร โครงสร้างของระบบนี้อยู่บน Server-side architecture ที่ต้องจัดการปัญหาและความท้าทายหลายด้าน โดยเฉพาะการทำให้ระบบ Load Balancer และ Auto Scaling ทำงานได้ราบรื่น เพื่อรองรับจำนวนผู้ใช้งานที่เปลี่ยนแปลงอยู่ตลอดเวลา แต่ด้วยการออกแบบให้ระบบนี้รันบนหลาย Pods หรือหลาย instances ภายใต้ Load Balancer ก็อาจทำให้เกิดปัญหาด้าน Session Management โดยเฉพาะในกรณีการใช้งานใน Guest Mode
ปัญหาที่เราเจอในครั้งนี้คือ เมื่อผู้ใช้งานเพิ่มสินค้าใน Cart ในโหมด Guest ระบบจะสร้าง Session สำหรับผู้ใช้นั้น ๆ บน Pod ที่ประมวลผลคำสั่งในขณะนั้น แต่เมื่อผู้ใช้ทำการ Refresh หน้าจอ ระบบอาจถูกโยกย้ายไปยัง Pod อื่นตามการกระจายโหลดของ Load Balancer ทำให้ Session เดิมไม่ได้ตามไปด้วย ส่งผลให้สินค้าไม่ถูกเพิ่มใน Cart หรือการเชื่อมต่อกับสถานะเดิมหายไป เราจึงแก้ปัญหานี้ด้วยการใช้ Sticky Session Mode ใน Load Balancer
แนวคิดพื้นฐานของ Session Management
ก่อนจะเจาะลึกในวิธีการแก้ปัญหา เรามาทำความเข้าใจแนวคิดหลัก ๆ ของการจัดการ Session และการจัดการโหลด (Load Balancing) ซึ่งมีหลายรูปแบบ ดังนี้:
- Client-side Session: การจัดเก็บข้อมูล Session ไว้ที่ฝั่งผู้ใช้หรือเบราว์เซอร์ เช่น การใช้ Cookies หรือ Local Storage ซึ่งง่ายต่อการจัดการ แต่มีข้อจำกัดด้านความปลอดภัยและไม่เหมาะกับการจัดการข้อมูลที่ละเอียดอ่อนในระบบขนาดใหญ่
- Server-side Session: ข้อมูลและสถานะของผู้ใช้ทั้งหมดถูกจัดเก็บและจัดการโดย Server ซึ่งเหมาะกับการรักษาความปลอดภัยและการจัดการข้อมูลที่ซับซ้อน แต่มีความท้าทายเมื่อระบบมีหลาย Pods หรือการโยกย้ายการประมวลผลระหว่าง Servers หรือ Pods ซึ่งเป็นสาเหตุของปัญหาในเคสนี้
- Distributed Session Management: การจัดการ Session ให้สามารถเข้าถึงได้จากหลาย Server หรือหลาย Pods โดยไม่จำเป็นต้องยึดติดกับ Server หรือ Pod ใด ๆ เช่น การใช้ Redis หรือ Memcached เป็นฐานข้อมูลกลางสำหรับจัดการ Session แต่ก็มีความซับซ้อนในการตั้งค่าและอาจมีผลต่อประสิทธิภาพของระบบ
Load Balancer และรูปแบบการทำงานหลายโหมด
การตั้งค่า Load Balancer ให้เหมาะสมเป็นอีกหนึ่งกลยุทธ์สำคัญในระบบ Server-side เพื่อให้การกระจายโหลดเป็นไปอย่างมีประสิทธิภาพ โดยมีหลายโหมดที่สามารถเลือกใช้ตามลักษณะการทำงาน:
- Round Robin: เป็นโหมดพื้นฐานที่กระจายคำร้องขอให้หมุนเวียนไปยังแต่ละ Server หรือ Pod อย่างเท่าเทียม ข้อดีคือการทำงานง่ายและเสมอภาค แต่ข้อเสียคือไม่มีการติดตาม Session ของผู้ใช้ ทำให้ไม่เหมาะกับระบบที่ต้องการให้ Session คงอยู่กับ Server หรือ Pod ใด Pod หนึ่ง
- Sticky Session (Session Affinity): โหมดนี้จะผูกผู้ใช้กับ Server หรือ Pod ที่รับคำร้องขอครั้งแรก ทำให้ Session คงอยู่กับ Pod เดิม ซึ่งแก้ปัญหาของเราในเคสนี้ได้โดยตรง ข้อดีคือช่วยรักษาความต่อเนื่องของ Session แต่ข้อเสียคือการกระจายโหลดอาจไม่เท่ากัน โดยเฉพาะในกรณีที่มีผู้ใช้จำนวนมากที่ต้องใช้ทรัพยากรจาก Pod เดิม
- Least Connection: โหมดนี้กระจายโหลดไปยัง Server หรือ Pod ที่มีการใช้งานน้อยที่สุดในขณะนั้น ช่วยให้โหลดในระบบกระจายไปยัง Pods ที่สามารถรองรับได้มากที่สุด แต่ก็ไม่สามารถรักษา Session ได้เช่นกัน ทำให้เหมาะกับระบบที่ไม่ต้องพึ่งพาการคงอยู่ของ Session
- IP Hash: โหมดนี้ใช้ IP Address ของผู้ใช้เป็นตัวระบุในการเชื่อมโยงกับ Server หรือ Pod เฉพาะ โดยที่ผู้ใช้จะถูกโยงไปยัง Server เดิมตลอดเวลาที่ใช้งานจาก IP เดิม ข้อดีคือช่วยรักษา Session ได้ใกล้เคียงกับ Sticky Session แต่อาจมีปัญหาในกรณีที่ผู้ใช้เปลี่ยน IP บ่อยครั้ง เช่น ในการใช้งานบนมือถือ
Sticky Session: วิธีแก้ปัญหาในเคสนี้
ในเคสของเรา เราได้เลือกใช้ Sticky Session Mode เพราะมีความเหมาะสมที่สุดกับปัญหาที่พบ เนื่องจากเราต้องการให้ผู้ใช้งานใน Guest Mode ถูกผูกติดกับ Pod ที่รับคำสั่ง Add to Cart แรก โดยที่ Session ของผู้ใช้จะคงอยู่ใน Pod เดิมไปจนกว่าผู้ใช้จะออกจากระบบ หรือหมดเวลาการใช้งาน ทำให้การเพิ่มสินค้าใน Cart สามารถทำงานได้ราบรื่นและไม่มีปัญหาการสูญหายของสถานะการใช้งาน
การวิเคราะห์ข้อดีและข้อเสียของ Sticky Session ในระบบ Marketplace
การตั้งค่าให้ Load Balancer เป็น Sticky Session มีข้อดีและข้อเสียที่ควรพิจารณา:
- ข้อดี:
- การรักษา Session เดิมได้ช่วยให้ข้อมูลการทำงานต่อเนื่อง ไม่สูญหาย
- ลดปัญหาความซับซ้อนในการตั้งค่าระบบที่ต้องการการคงอยู่ของสถานะ เช่น การเพิ่มสินค้าใน Cart ของ Guest Mode
- ข้อเสีย:
- โหลดของระบบอาจไม่สมดุล เพราะผู้ใช้จำนวนมากอาจถูกผูกไว้กับ Pod เดียวกัน
- หาก Pod ที่ผู้ใช้ถูกผูกอยู่เกิดปัญหาหรือหยุดทำงาน ผู้ใช้อาจต้องเริ่มต้นการใช้งานใหม่
สรุป
จากการแก้ปัญหาครั้งนี้ เราได้เรียนรู้และเลือกวิธีที่เหมาะสมในสถานการณ์จริง คือการใช้ Sticky Session Mode บน Load Balancer ซึ่งเป็นวิธีการจัดการ Session ให้ต่อเนื่องในระบบ Magento2 Marketplace ที่ต้องการความเสถียรและการคงอยู่ของ Session ขณะเดียวกัน เราควรเข้าใจว่าการจัดการโหลด (Load Balancing) มีหลายรูปแบบที่สามารถนำมาใช้ตามลักษณะการทำงานเฉพาะของแต่ละระบบ เพื่อให้การทำงานราบรื่นและเกิดประสิทธิภาพสูงสุด