Session ไม่ตาม! เพราะ Load Balancer บน Magento2

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) มีหลายรูปแบบที่สามารถนำมาใช้ตามลักษณะการทำงานเฉพาะของแต่ละระบบ เพื่อให้การทำงานราบรื่นและเกิดประสิทธิภาพสูงสุด

Read more

การทำ Data Migration และ Seeder: คู่มือสำหรับ Developer

การทำ Data Migration และ Seeder: คู่มือสำหรับ Developer

ถ้าพูดถึงการพัฒนาแอปพลิเคชันที่เชื่อมต่อกับ Database หนึ่งในความยุ่งยากที่สุดคือการจัดการ Database structure ที่เปลี่ยนไปตามฟีเจอร์ใหม่ๆ ที่เพิ่มเข้ามา เช่น เพิ่มตาราง (Table) เปลี่ยนชนิดข้อมูล (Data type) หรือลบฟิลด์ (Field) ออกไป และแน่นอนว่

By maimem
เช็ค Internet จากเว็บ: ทำยังไงให้รู้ว่าออกเน็ตได้จริง?

เช็ค Internet จากเว็บ: ทำยังไงให้รู้ว่าออกเน็ตได้จริง?

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

By maimem
Rust Series #2 - รู้จัก Cargo: ผู้ช่วยส่วนตัวของโปรเจกต์ Rust!

Rust Series #2 - รู้จัก Cargo: ผู้ช่วยส่วนตัวของโปรเจกต์ Rust!

ถ้าคุณเริ่มต้นเขียน Rust แล้วรู้สึกว่า “เฮ้ย! Rust เจ๋งแหะ” ก็ขอแสดงความยินดีครับ คุณเพิ่งเจอเพื่อนแท้ในโลกโปรแกรมมิ่ง! แต่เดี๋ยวก่อน... ถ้าต้องเขียนโค้ดโปรเจกต์ใหญ่ ๆ บริหารไลบรารี ดูแลไฟล์ต่าง ๆ หรือทดสอบโค้ดทุกวั

By maimem
ซ่อน Credential ใน AWS CodeBuild ให้ปลอดภัยด้วย Parameter Store

ซ่อน Credential ใน AWS CodeBuild ให้ปลอดภัยด้วย Parameter Store

ทำไมต้องซ่อน Credential? ในโลกของ DevOps และ Cloud Computing การจัดการ Credential (ข้อมูลรับรอง เช่น API Keys, Passwords, หรือ Secrets ต่างๆ) เป็นเรื่องที่สำคัญอย่างยิ่ง เพราะ Credential เปรียบเสมือนกุญแจที่เปิดประตูไปสู่ทรัพยากรสำคัญในระบบ เช่น ฐานข้อมูล

By maimem