Coding Gun

CQRS และ Event Sourcing

CQRS Design Pattern คืออะไร?

CQRS คือ microservices architecture pattern ที่ย่อมาจาก Command Query Responsibility Segregation เป็นการแยก service สำหรับการสั่งงาน(insert, update, delete) และ Query ซึ่งเป็น service สำหรับการอ่านหรือการ query ข้อมูลออกมาดู ซึ่งจำง่ายๆว่า CQRS คือการแยก service ออกเป็น read และ write

CQRS

โดยจากในภาพเราจะเห็น api ที่ทำงานเหมือนกัน ต่างคนต่างมี database ของตัวเอง(ไม่ควรใช้ database เดียวกัน) ซึ่ง data ของ database นี้จะต้อง sync กัน เราอาจใช้การ replication หรือ cluster ก็ได้

ในการออกแบบที่ซับซ้อนขึ้นคุณอาจใช้ database คนละประเภทก็ได้ เช่นตอน query จะใช้ mongodb ซึ่งจะอ่านข้อมูลได้เร็วกว่า RDBMS ส่วนตอนเขียนเราต้องการ transaction ก็จะใช้ RDBMS แทน และนำ Apache Kafka มา sync ข้อมูลของ database ทั้งสองตัวนี้ หรือในตัวอย่างด้านล่างสุดจะเป็นการนำเอา CQRS และ Event sourcing มาประยุกต์ใช้ร่วมกันเพื่อให้ Event sourcing มาเติมในส่วนของการ sync ข้อมูล(แทนการใช้ Apache Kafka)

ตัวอย่างการ implement CQRS

CQRS in action

จากในรูปเราจะมี Order service, Kitchen service, Deliver service และ Accounting service เป็น command service หรือ command api เมื่อเกิดการสั่งซื้อสินค้าก็จะเกิด order events หลังจากนั้นทำการ publish message ไปที่ order history service (query service) และ event handlers ก็จะเป็นตัวจัดการโครงสร้างของ object ที่จะจัดเก็บลงในฐานข้อมูล(order history view database) ต่อไป

Event sourcing

Event Sourcing Design Pattern คืออะไร?

Event Sourcing คือ microservices architecture pattern ที่ออกแบบมาสำหรับการแจ้ง event ไปยัง service ที่เกี่ยวข้อง เพราะ microservices ออกแบบมาด้วยแนวคิดที่เป็น event driven ทุกอย่างที่เกิดขึ้นจะมองเป็น event หมด เช่น เมื่อลูกค้าสั่งซื้อสินค้า(เกิด event) จะต้องไปเช็คสินค้าใน stock(นี่ก็อีก event) และถ้ามีสินค้าใน stock สินค้าก็จะนำลูกค้าไปจ่ายเงิน(อาจจะ trigger event อื่นต่อไปเรื่อยๆ) ซึ่ง event sourcing จะเป็นการเก็บการเปลี่ยนแปลงต่างๆที่เกิดขึ้นไว้ดังนั้นเราอาจทำการ query event ต่างๆออกมาดู หรือทำการส่งข้อความไปบอก service อื่นๆที่ต้องการทราบถึงการเปลี่ยนแปลงนี้ได้ ทำให้ข้อมูลในแต่ละ service นั้นตรงกัน

ดังนั้น event sourcing นี้จะเป็นแหล่งที่เก็บ application state ที่คุณจะสามารถเห็นการเปลี่ยนแปลงต่างๆที่เกิดขึ้นระหว่างทางได้

domain event คือ object ที่เกิดขึ้นใน event นั้นๆ เช่น ใน order service จะมี domain event เป็น order ซึ่งข้างใน order จะประกอบไปด้วย order items เรียกได้ว่า domain event คือ object ที่ประกอบไปด้วยข้อมูลที่ต้องใช้งานครบถ้วน

Event sourcing and cqrs

จากในรูปนี้เราจะนำเอาทั้ง CQRS และ Event sourcing มาประยุกต์ใช้ร่วมกัน โดยที่ Event sourcing เป็นตัวเชื่อมในการ sync ข้อมูล เมื่อเกิด event(การสั่งซื้อสินค้า)ผ่านทาง command api ตัว command api ก็จะเก็บ event ลงใน database และ publish message เข้าไปยัง message broker เพื่อทำการแจ้งไปยัง query api ให้ทำการ update ข้อมูลลงในฐานข้อมูลของตัวเอง

โดยส่วนมากเราจะใช้ CQRS และ Event sourcing ร่วมกัน เพราะจะทำให้เราแยก command และ query ออกจากกันได้ง่ายขึ้น

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

Phanupong Permpimol
Follow me

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