Automatically translated.View original post

What is domain activity in DDD?

What is a domain event in DDD?

Aggregates act as a consistency boundary in a domain.

Naturally, we'll need to communicate between two aggregates at some point.

We can do this in an eventually consistent way with domain events.

An aggregate raises a domain event.

Other aggregates can subscribe to this domain event and handle it accordingly.

#ติดเทรนด์ #ป้ายยากับlemon8 #ddd #Lemon8Club #it #โดเมน #รายได้น้อย #ศิลปะฮีลใจ

2024/9/3 Edited to

... Read moreถ้าคุณค้นหา “DDD คืออะไร” แล้วเจอคำว่า Domain Event โผล่มาเต็มไปหมด แต่ยังไม่เห็นภาพ ลองนึกง่ายๆ ว่า DDD (Domain-Driven Design) คือแนวคิดออกแบบซอฟต์แวร์ให้ “ภาษาในโค้ด” สอดคล้องกับ “ภาษาธุรกิจ” โดยโฟกัสที่โดเมน (ปัญหาจริงของงาน) และแยกขอบเขตความรับผิดชอบให้ชัด ผ่านสิ่งที่เรียกว่า Aggregate ใน DDD เรามักกำหนดให้ Aggregate เป็น “ขอบเขตความสอดคล้องของข้อมูล” (consistency boundary) หมายความว่า ภายใน Aggregate เดียวกัน เราพยายามให้ข้อมูลถูกต้องพร้อมกันในทรานแซกชันเดียว แต่พอมีหลาย Aggregate เข้ามาเกี่ยวข้อง เช่น Order กับ Inventory หรือ User กับ Notification เราไม่อยากให้ทุกอย่างล็อกกันยาวๆ จนระบบช้า ตรงนี้เองที่ Domain Event เข้ามาช่วย Domain Event คือ “เหตุการณ์ที่มีความหมายทางธุรกิจ” ที่เกิดขึ้นแล้วในโดเมน เช่น OrderPlaced, PaymentConfirmed, StockReserved จุดสำคัญคือมันเป็นเรื่องที่ “เกิดขึ้นแล้ว” (past tense ในหลายทีมจะนิยมตั้งชื่อ) และถูกปล่อย (raise/publish) ออกจาก Aggregate ที่เป็นเจ้าของเหตุการณ์นั้น ภาพจำที่ฉันใช้คือ: Aggregate A ทำอะไรสำเร็จ → สร้าง Domain Event → ส่งไปที่ event bus → กระจายให้ event handler หลายตัวไปทำงานต่อ เช่น Handler 1 ส่งอีเมล, Handler 2 อัปเดต read model, Handler 3 ไปเรียกบริการอื่น หากบาง handler พลาด (เช่นตัวจัดการเหตุการณ์ 3 ไม่ได้รับ) ระบบยังไม่พังทั้งก้อน เพราะแนวคิดคือ eventually consistent: งานปลายทางอาจช้ากว่า แต่สุดท้ายควรตามทัน (มักเสริมด้วย retry/queue) แล้วควรใช้ Domain Event เมื่อไหร่? - เมื่อมี “ผลกระทบข้าม Aggregate” และเราไม่อยากผูกให้เรียกกันตรงๆ - เมื่ออยากลด coupling ระหว่างโมดูล/บริการ เช่น แยก Billing ออกจาก Shipping - เมื่อยอมรับได้ว่าบางอย่างอัปเดตช้าหน่อย แต่แลกกับความทนทานและสเกล ทิปจากประสบการณ์ส่วนตัวตอนเริ่มทำ DDD: 1) ตั้งชื่อ event ให้เป็นภาษาธุรกิจ ไม่ใช่ชื่อเทคนิค เช่น ใช้ “ยืนยันการชำระเงินแล้ว” มากกว่า “UpdatePaymentStatus” 2) แยก “Domain Event” (ความหมายเชิงธุรกิจ) ออกจาก “Integration Event” (เหตุการณ์เพื่อสื่อสารระหว่างระบบ) ถ้าทีมคุณมีหลายบริการ 3) คิดเรื่องความซ้ำ (duplicate) ไว้ตั้งแต่แรก เพราะ handler อาจได้รับ event ซ้ำได้ ควรทำให้ handler เป็นแบบ idempotent 4) อย่าใช้ event ทุกที่: ถ้าเป็นแค่การเรียกใช้ภายใน Aggregate เดียวกัน หรือจำเป็นต้องสอดคล้องทันที การเรียกตรงๆ อาจง่ายและชัดกว่า สรุปสั้นๆ: ถ้าคุณเข้าใจว่า DDD คือการจัดโครงสร้างโค้ดตามโดเมน และ Aggregate คือขอบเขตความถูกต้อง Domain Event คือวิธี “ประกาศสิ่งที่เกิดขึ้น” เพื่อให้ส่วนอื่นๆ ทำงานต่อผ่าน event bus/handler แบบ eventually consistent ซึ่งช่วยให้ระบบหลวมตัว (decoupled) และขยายได้ง่ายขึ้น