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

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

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

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

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

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