จากการพูดคุยเรื่องของ Event-based architecture นั้น มักจะเจอ 2 คำคือ

  1. Domain Event
  2. Event Sourcing

คำถามที่น่าสนใจคือมันคืออะไร ?
ทำหน้าที่อะไรกันแน่
ก็เลยทำการอธิบายแบบสั้น ๆ ไว้หน่อย

Domain Event คืออะไร ?

ใช้อธิบายเหตุการณ์ที่เกิดขึ้นภายใน domain หรือกลุ่มงานในขอบเขตนั้น ๆ
เป็นภาษาที่ใช้คุยกันใน domain นั้น ๆ
ทั้ง Domain expert, Business, Development
ต้องตกลงและเข้าใจร่วมกัน
จึงเป็นหัวใจหลักของการทำงานร่วมกัน

ชื่อของ Domain Event นั้น ต้องไม่ผู้กับเทคโนโลยีใด ๆ
ยกตัวอย่างเช่น

  • ผู้ใช้งานทำงานลงทะเบียนแล้ว
  • ผู้ซื้อได้รับสินค้าเรียบร้อยแล้ว
  • การชำระเงินไม่สำเร็จ เพราะว่าหมดระยะเวลาการชำระเงิน

Domain Event นั้นสามารถเกิดได้ทั้ง
ภายในขอบเขตงานของตัวเอง หรือข้ามขอบเขตงานอื่น ๆ ได้เช่นกัน
เพื่อใช้ในการทำงานร่วมกันเท่านั้น
ยกตัวอย่างเช่น การทำงานในรูปแบบ CQRS เป็นต้น

แต่หน้าที่หลักของ Domain Event คือ
ใช้สำหรับการติดต่อสื่อสารและทำงานร่วมกันข้ามขอบเขตการทำงานต่าง ๆ ยกตัวอย่างเช่นมี 3 ส่วนงานคือ

  • Order
  • Invoice
  • Delivery

เมื่อในส่วนงาน Order มีการสร้าง Order หรือคำสั่งซื้อสำเร็จแล้ว
ทางส่วนงาน Invoice และ Delivery ก็จะต้องรู้หรือทำงานตามด้วย
ดังนั้นเหตุการณ์คำสั่งซื้อสำเร็จ จึงเป็นหนึ่งใน Domain Event นั่นเอง

จากแนวคิดนี้ทำให้แต่ละส่วนงานเป็นอิสระแก่กัน
ทำข้อตกลงหรือ contract กันผ่าน Domain Event

แต่ปัญหาที่ตามมาคือ เราจะทำการจัดเก็บ event นี้อย่างไร ?
ข้อมูลใน Event จะเป็นอย่างไร ?
ตำตอบที่ได้มาคือ Event Sourcing

Event Sourcing คืออะไร ?

Event Sourcing ensures that all changes to application state are stored as a sequence of events.

ทำการเก็บข้อมูลของทุก ๆ การเปลี่ยนแปลงไว้
ในรูปแบบของ Event stream นั่นเอง
โดยข้อมูลจะเรียงลำดับตามเวลาที่ Event เกิดขึ้น
และแต่ละ Event จะไม่สามารถแก้ไขได้ (Immutability)

ดังนั้น Event ที่จัดเก็บใน Event sourcing นั้น
เหมือนกับ local storage ของแต่ละขอบเขตงานนั้น ๆ 
ดังนั้นมักจะไม่ expose หรือใช้แบบ global หรือใช้งานข้ามขอบเขตงาน
มิเช่นนั้นจะทำการแต่ละส่วนงานผูกมัดกันเกินไป (Tight coupling)

แต่ถ้าต้องทำการ expose Event (Domain Event) 

เพื่อให้ขอบเขตงานอื่น ๆ ใช้งานด้วย
อาจะ expose ออกไปในรูปแบบต่าง ๆ ดังนี้

  • Public API
  • Customer/Supplier
  • Open Host with Publish/Subscribe

แสดงตัวอย่างของ Open Host with Publish/Subscribe ดังรูป

Reference Websites