สรุปเรื่อง Domain Driven Design ที่ AWS Thailand

สรุปเรื่อง Domain Driven Design ที่ AWS Thailand

พอดีทีมเราถูกส่งให้ไปเรียนเรื่อง Domain Driven Design ที่ AWS Thailand เพื่อที่จะได้เข้าใจเทคนิค DDD และสามารถนำมาประยุกต์ใช้กับ Component ของ AWS ได้อย่างเหมาะสม เลยอยากสรุปเอาไว้สักหน่อย


Understand the business Domain

  • เข้าใจการทำงานของระบบ ระบุศัพย์ที่เข้าใจตรงกัน เข้าใจความหมายเท่ากัน
  • เข้าใจ Ubiquitous Language (ศัพย์ท้องถิ่น) ของเราก่อน
  • ต้องทำ เพราะคนเราประสบการณ์ไม่เท่ากัน ต้องทำความเข้าใจร่วมกันก่อน จะได้เข้าใจตรงกัน

Domain & Sub-Domain

  • Domain : Key business domain
  • Sub-Domain : Sub of overall business domain

Type of Subdomain

แล้วเมื่อไหร่ละ ที่ต้องตัดสินใจว่าจะซื้อ จะทำเอง จะเอ้าซอส
แต่ละทีม ควรแบ่งหน้าที่ของงานให้ชัดเจน ไม่ควรให้งานของแต่ละทีมซ้ำซ้อนกัน

Context Mapping

Kind of Mapping

  • Partnership : 2 context อยู่ร่วมกัน ไม่มีใครใหญ่กว่าใคร ถ้าพังก็พังด้วยกัน ขาดกันไม่ได้
  • Shared Kernel : มีส่วนที่ต้องแชร์กัน เน้นการ reuse context ถ้า change ส่วนนี้ context จะกระทบกัน ส่วนใหญ่ใช้ทีมเดียวกันทำ
  • Customer-Supplier : supplier provider สิ่งที่ต้องการ customer เอาของไปใช้
  • Conformist : supplier มี spec ชัดเจน customer ต้องทำตาม เช่น ไปเชื่อมต่อกับ platform เช่น ธนาคาร, line OA เราต้อง follow ตาม
  • Anticorruption Layer : เหมือน Conformist แต่ทั้ง supplier และ customer มี spec ขัดเจน อาจจะต้องใช้ middleware มาช่วย
  • Open Host Service : เปิด API ให้คนอื่นมาเอาข้อมูลไป
  • Published Language : ฝั่ง supplier มีเอกสารชัดเจน customer มีหน้าที่ implement ตาม
  • Separate Way : ไม่มีอะไรเชื่อมต่อกัน
What Is Domain-Driven Design?
Chapter 4. Context Mapping Not only does the bounded context pattern protect the consistency of a ubiquitous language, but it also enables modeling. You cannot build a model without specifying … - Selection from What Is Domain-Driven Design? [Book]

Tactical Design

Data Store

  • Entity : มีสิ่งที่บอกว่าเป็น identity
  • Aggregate : เป็นตัวเลือกว่าจะเอาข้อมูลแต่ละ entity มาทำการ aggregate กัน
  • Value Object : เป็น object ที่เป็น value store ไม่มีสิ่งที่บอก identity

Aggregate Relationship

  • ใช้ reference identity เท่านั้น
  • ทำให้การอัพเดตไม่ต้องสนใจว่า อีกฝั่งจะมีข้อมูลหรือไม่

Domain Event

  • เป็นการทำ message event ในการจัดการของ ส่วนใหญ่ใช้ในการ update ของ โดยตัว consumer ทำการ provide ของออกไป แล้วให้ subscriber เป็นคนเอาสิ่งนั้นไปทำต่อ
  • เป็น business event ที่เกิดขึ้นในระบบไปแล้ว

Architectural Patterns

Layered Architecture

  • Top-down communication model
  • Each layer can only have dependency to underneath layer (ปกติแล้ว แต่ละ tier จะมี dependency ภายใต้ layer นั้นๆเท่านั้น เช่น ui → service → data ไม่งั้นจะกลายเป็น anti pattern เช่น ui → data)

Port and Adapter (Hexagonal Architecture)

  • คล้ายๆ Layered Architecture
  • เราจะ focus ตัว business logic เป็นหลัก
  • ใช้ interface ในการคุยกันระหว่าง layer แทนการคุยกันตรงๆ

Event Souring

  • เตรียม Aggregate Data
  • แยกในส่วนที่ published กับ unpublished ออกจากกัน (outbox pattern) เพื่อแยกว่าส่วนไหนทำสำเร็จ อันไหนไม่สำเร็จ
  • ควรเก็บข้อมูล event ที่เกิด event ว่าเป็นอย่างไรบ้าง
  • ห้ามทำการแก้ไข event store ให้ subscription จาก message queue เท่านั้น
  • ต้องเตรียมคิดทำ caching ด้วย หรือหากเยอะมาก ต้องทำ snapshot
Event Souring - Caching
Event Sourcing - Snapshot

Command Query Responsibility Segregation (CQRS)

  • ในกรณีที่ไม่มี database ไหน ตอบโจทย์
  • จะใช้ database ไหนก็ได้ ไม่จำเป็นต้องใช้ database เหมือนกับต้นทาง
  • ต่อเนื่องจาก Event sourcing
  • ระบบ replicate ของ database ใช้ pattern นี้อยู่

Event Driven Architecture (EDA)

  • ระบบต่างๆ สื่อสารกันแบบ asynchronous

EDA x DDD

  • Choreography between domains
  • Orchestration within domain
  • Event Consideration (Type of event)
    • Domain Event : การกระทำที่เกิดจากการกระทำโดน Business
    • Notification Event : เป็นการกระทำที่เกิดขึ้นเพื่อบอกบางสิ่งบางอย่างที่เกิดขึ้น (แจ้งเพื่อทราบ)
    • Event Carried State : เป็นการกระทำที่เกิดขึ้นเพื่อบอกบางสิ่งที่เป็นการบอกถึง state ที่เปลี่ยนไป (แจ้งรายละเอียดด้วย)
  • Event-Driven Design Considerations
    • ทุกอย่างมีสิทธิ์จะ fail ให้คุณคิดว่ามันมีโอกาสจะ fail เสมอ
    • ให้คุณคิดหา solution ที่จะแก้ปัญหาที่เกิดขึ้นเสมอ เช่น ข้อความอาจจะได้รับไม่เรียงกัน ข้อความอาจจะไปไม่ถึง

DDD AWS Solution

CQRS on AWS
Publishing Domain Events on AWS