Saga: จัดการธุรกรรมที่ข้ามหลายระบบ เมื่อ ACID ทำไม่ได้

29 มิถุนายน 2569อ่าน 7 นาที
Saga: จัดการธุรกรรมที่ข้ามหลายระบบ เมื่อ ACID ทำไม่ได้

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

ในระบบเดียว เราใช้ธุรกรรมแบบ ACID เพื่อให้งานหลายขั้นทำครบทั้งชุดหรือไม่ทำเลย แต่เมื่องานต้องข้ามหลายระบบที่แยกกัน เช่น จองทริปที่ต้องจองตั๋วเครื่องบิน โรงแรม และรถ ซึ่งแต่ละอย่างอยู่คนละบริการ เราไม่สามารถครอบทั้งหมดด้วยธุรกรรมเดียวได้ Saga คือรูปแบบการจัดการงานข้ามระบบ ด้วยการทำทีละขั้น และถ้าขั้นใดล้มเหลว ก็เรียกการกระทำชดเชยเพื่อยกเลิกขั้นก่อนหน้าที่ทำสำเร็จไปแล้ว เช่น ถ้าจองรถไม่ได้ ก็ยกเลิกโรงแรมและตั๋วที่จองไว้

ชดเชย แทนการย้อนกลับอัตโนมัติ

ต่างจากธุรกรรมในระบบเดียวที่ย้อนกลับได้อัตโนมัติ Saga ต้องออกแบบการกระทำชดเชยสำหรับแต่ละขั้นเอง เช่น ขั้น จ่ายเงิน มีการชดเชยคือ คืนเงิน สิ่งนี้ทำให้ระบบข้ามบริการยังคงความสอดคล้องได้ แม้จะไม่มีธุรกรรมกลางครอบทั้งหมด ข้อควรระวังคือระหว่างที่ Saga ยังทำไม่ครบ ข้อมูลอาจอยู่ในสถานะกลางชั่วคราว จึงต้องออกแบบให้รับสถานะนั้นได้ และสื่อสารกับผู้ใช้ให้เหมาะ เช่น แสดงว่ากำลังดำเนินการ

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

Saga เป็นรูปแบบที่จำเป็นเมื่อธุรกิจเติบโตจนระบบถูกแยกเป็นหลายบริการ และงานสำคัญต้องข้ามบริการเหล่านั้น การเข้าใจว่าความสอดคล้องของข้อมูลข้ามระบบต้องออกแบบด้วยการชดเชย ไม่ใช่หวังพึ่งธุรกรรมกลาง ช่วยให้สร้างระบบที่ยังเชื่อถือได้แม้ในกรณีที่บางขั้นล้มเหลว ซึ่งเป็นเรื่องปกติในระบบที่มีหลายส่วนทำงานร่วมกัน

SagaDistributed SystemsTransactionsArchitecture

บริการที่เกี่ยวข้อง

รับพัฒนาเว็บแอปพลิเคชัน

สร้างเว็บแอปที่รองรับการเติบโตและเชื่อมกับระบบอื่นได้

WhaleScope

ดูโครงสร้างตลาดของทุกหมวดธุรกิจไทย บน WhaleScope

รายชื่อบริษัท ผู้เล่นรายใหญ่ และอัตราคงอยู่ของแต่ละหมวด — จากข้อมูลจดทะเบียน 2 ล้านนิติบุคคล

อ่านต่อ

Eventual Consistency: เมื่อข้อมูลไม่ตรงกันชั่วคราว เป็นเรื่องปกติของระบบกระจาย

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

ACID: ทำไมธุรกรรมฐานข้อมูลต้องครบทั้งชุด หรือไม่ทำเลย

โอนเงินแล้วหักจากบัญชีหนึ่งได้ แต่ไม่เข้าอีกบัญชี คือฝันร้ายของทุกระบบการเงิน ACID คือคุณสมบัติที่รับประกันว่าธุรกรรมจะทำครบทั้งชุดหรือไม่ทำเลย เข้าใจว่าทำไมมันสำคัญกับข้อมูลที่ผิดไม่ได้

Outbox Pattern: แจ้งข่าวระบบอื่นให้ครบทุกครั้ง ไม่มีหลุดหาย

บันทึกออเดอร์สำเร็จแต่ข้อความแจ้งระบบคลังหายไป สต๊อกก็ไม่ถูกตัด ปัญหาเขียนสองที่พร้อมกันนี้เจอบ่อยกว่าที่คิด Outbox Pattern แก้ด้วยการฝากข้อความไว้ในฐานข้อมูลเดียวกัน แล้วค่อยทยอยส่งให้ถึงแน่นอน

Database Sharding: แบ่งฐานข้อมูลเมื่อใหญ่เกินเครื่องเดียว

เมื่อข้อมูลใหญ่จนเครื่องเดียวรับไม่ไหว การเพิ่มเครื่องให้แรงขึ้นมีเพดาน Sharding คือการแบ่งข้อมูลออกไปหลายเครื่อง ช่วยให้ขยายต่อได้ แต่ก็เพิ่มความซับซ้อนที่ต้องแลก