Coding Gun

Microservices Patterns: Saga

SAGA คือ microservices architecture pattern ที่ทำหน้าที่จัดการกับ business transactions เพราะใน microservices เราจะใช้แนวคิดที่เป็น stateless ดังนั้นการจัดการ business transactions ก็จะเป็นปัญหาใน microservices ซึ่ง saga จะเป็นหนึ่งใน pattern ที่มาช่วยแก้ปัญหานี้

เนื่องจากใน microservices เราจะมี 1 database ต่อ 1 service(best practices) ดังนั้นใน 1 business transaction จำเป็นต้องอาศัยมากกว่า 1 services ในการทำงาน เช่นการสั่งซื้อสินค้า จำเป็นต้องเช็คสินค้าใน stock และต้องตัด stock เมื่อชำระเงินแล้ว ดังนั้นเราจึงไม่สามารถใช้ transaction ใน database ได้เพราะ database ของ order service กับ database ของ inventory service เป็นคนละตัวกันหรือในทางปฎิบัติจริงๆ อาจเป็น database คนละประเภทด้วยซ้ำ

SAGA ทำงานอย่างไร?

การทำงานของ saga ตือจะสร้าง sequence of local transactions(transaction ใน database แต่ละตัวจะทำงานต่อกัน) เมื่อ transaction แรกเสร็จก็จะ publish message ไปยัง service ที่สองเพื่อที่จะทำให้เกิด transaction ต่อไปแต่ถ้า transaction นั้นเกิด fail ขึ้นมา saga orchestrator จะทำการ execute compensating transaction เพื่อยกเลิกการทำงานที่เกิดขึ้นในแต่ละ service(ย้อนกลับไปที่จุดเริ่มต้นใหม่)

compensating transaction คือ transaction ที่ทำให้ข้อมูลย้อนกลับไปที่จุดเดิม เช่น เมื่อตัด stock สินค้าไปแล้ว ถ้า transaction ของการจ่ายเงิน fail ก็จะทำการเติมสินค้ากลับเข้าไปใน stock

From 2pc to SAGA
จากรูปด้านบเป็นการทำ distributed transactions ด้วย saga โดยทำการ เชื่อมระหว่าง local transaction(transaction ใน database ของแต่ละ service) เข้าหากันซึ่งในรูปจะเป็น order service และ customer service โดยในกรณีนี้จะเป็นการตรวจสอบ credit limit ก่อนสั่งซื้อสินค้า เมื่อลูกค้าสั่งซื้อสินค้าก็จะเกิด transaction ใน database ของ order service และระหว่างนั้น order service ก็จะ publish message ไปยัง customer service เพื่อทำการตัด credit limit โดยใช้ local transaction ใน customer service และเมื่อเกิดการ fail ขึ้นมาในขั้นตอนการสั่งซื้อ order service ก็จะ publish message(domain event) ไปยัง customer service เพื่อทำการคืน credit ให้กับลูกค้า

Saga มี 2 patterns

การออกแบบ saga จะมีอยู่ 2 แนวทางด้วยกันคือ

domain event คือ object ที่ใช้ในการสื่อสาร โดยใน object นั้นจะประกอบด้วย object อื่นๆที่เกี่ยวข้องทั้งหมด เช่น ใน order ก็จะมี order item

Choreography-based SAGA

Choreography-based SAGA
ขั้นตอนของการทำ Choreopgraphy-based saga มีดังนี้

  1. เมื่อมี request เข้ามาที่ POST /orders order service จะทำการสร้าง order ใน database โดยมีสถานะเป็น pending
  2. Order service จะทำการ publish message ไปบอก customer service ว่ามีการ order
  3. ที่ customer service ก็จะเพิ่มข้อมูลลงไปในตาราง reserved order เพื่อปรับลด credit ลง
  4. และหลังจากนั้น customer service ก็จะ publish message กลับไปที่ order service
  5. Order service จะตัดสินใจว่าจะ approve order นี้หรือไม่

Choreography-based SAGA เหมาะสำหรับ microservices ที่ไม่ได้แตก service ออกมาเยอะมา เพราะถ้ายิ่งมี service ที่เกี่ยวข้องมากเท่าไหร่การแก้ไขก็จะทำได้ยากมากขึ้นเท่านั้น

Orchestration-based SAGA

Orchestration-based SAGA
ขั้นตอนของการทำ Orchestration-based saga มีดังนี้

  1. เมื่อมี request เข้ามาที่ POST /orders order service จะทำการสร้าง Order saga orchestrator
  2. Order saga orchestrator จะทำการสร้าง order ใน database โดยมีสถานะเป็น pending
  3. Order service จะทำการ publish message ไปที่ message broker เพื่อบอก customer service ว่ามี order เกิดขึ้น
  4. ที่ customer service ก็จะเพิ่มข้อมูลลงไปในตาราง reserved order เพื่อปรับลด credit ลง
  5. และหลังจากนั้น customer service ก็จะ publish message กลับไปที่ order service
  6. Order service จะตัดสินใจว่าจะ approve order นี้หรือไม่

Order saga orchestrator คือตัวกลางในการจัดการสร้าง compensating transaction

Orchestration-based SAGA เหมาะสำหรับ microservices ที่มี service หลายๆตัวมามีส่วนเกี่ยวของกับ transaction นี้

อ่านต่อเพิ่มเติมได้ที่นี่

Phanupong Permpimol
Follow me

Software Engineer ที่เชื่อในเรื่องของ Process เพราะเมื่อ Process ดี Product ก็จะดีตาม ปัจจุบันเป็นอาจารย์และที่ปรึกษาด้านการออกแบบและพัฒนา Software และ Web Security