ฉันกำลังทำงานกับแอปพลิเคชันตัวอย่างขนาดเล็กเพื่อเรียนรู้แนวคิดของ CQRS และการจัดหากิจกรรม ฉันมีการBasket
รวมและการProduct
รวมซึ่งควรทำงานอย่างอิสระ
นี่คือโค้ดหลอกบางอย่างที่จะแสดงการใช้งาน
Basket { BasketId; OrderLines; Address; }
// basket events
BasketCreated { BasketId; }
ItemAdded { BasketId; ProductId; Quantity }
AddItemSucceeded { BasketId; ProductId; Quantity }
AddItemRevoked { BasketId; ProductId; Quantity }
ItemRemoved { BasketId; ProductId; Quantity }
CheckedOut { BasketId; Address }
Product { ProductId; Name; Price; }
// product events
ProductReserved { ProductId; Quantity }
ProductReservationFailed { ProductId; Quantity }
ProductReservationCancelled { ProductId; Quantity; }
คำสั่งนั้นคล้ายกับเหตุการณ์โดยใช้ชื่อที่จำเป็นและไม่เครียดเกินไป
ตอนนี้งานเหล่านี้ใช้ได้ดีอย่างอิสระ ฉันออกคำสั่งAddItem
และจะสร้างItemAdded
เหตุการณ์Basket
โดยรวมซึ่งทำในสิ่งที่ต้องทำกับสถานะของ 'ตะกร้า' ในทำนองเดียวกันสำหรับผลิตภัณฑ์คำสั่งและกิจกรรมใช้งานได้ดี
ตอนนี้ฉันต้องการรวมสิ่งนี้เข้ากับกระบวนการซึ่งจะเป็นแบบนี้ (ในแง่ของคำสั่งและเหตุการณ์ที่เกิดขึ้น):
ผู้จัดการกระบวนการจะทำสิ่งต่อไปนี้:
on BasketCreated: CreateShoppingProcess
on ItemAdded: ReserveProduct
on ProductReserved: SucceedAddingItem // does nothing, but needs to be there so that the basket knows it can check out
on ProductReservationFailed: RevokeAddItem
on RemoveItem: CancelProductReservation
on Checkout: CreateOrder // create an order and so on...
คำถามที่ฉันไม่สามารถหาคำตอบที่ชัดเจนคือ:
- ฉันต้องยืนยันผู้จัดการกระบวนการหรือไม่ ดูเหมือนว่าฉันจะทำ แต่ฉันไม่แน่ใจ
- ถ้าเป็นเช่นนั้นฉันจำเป็นต้องบันทึกเหตุการณ์สำหรับผู้จัดการกระบวนการ อย่างไรก็ตามเหตุการณ์ที่ฟังอยู่นั้นเชื่อมโยงกับมวลรวม ฉันจะเพิ่มรหัสกระบวนการในสิ่งเหล่านั้นหรือไม่? ฉันมีกิจกรรมแยกต่างหากสำหรับผู้จัดการกระบวนการหรือไม่ วิธีการทำเช่นนี้และเก็บไว้เป็น DRY เท่าที่จะทำได้
- ฉันจะรู้ได้อย่างไรว่าตะกร้า
ProductReserved
เหตุการณ์มีไว้สำหรับอะไร มันตกลงที่จะมีBasketId
ในที่เกินไปหรือว่าข้อมูลที่รั่วไหล? - ฉันจะรักษาความสัมพันธ์ระหว่างเหตุการณ์ได้อย่างไรฉันจะทราบได้อย่างไรว่า
ItemAdded
เกิดProductReserved
เหตุการณ์ใด ฉันผ่านไปEventId
หรือไม่ ดูเหมือนจะแปลก ... - ฉันควรใช้ตัว
Basket
จัดการกระบวนการแทนการรวมแบบง่ายหรือไม่?
หลังจากการวิจัยเพิ่มเติมฉันมาที่นี่: Saga เป็นสิ่งที่ทำให้กิจกรรมของตัวเองและฟังเหตุการณ์จากภายนอก โดยทั่วไปมันคือการรวมที่สามารถตอบสนองต่อเหตุการณ์ที่เกิดขึ้นนอกโลกของตัวเอง
Process Manager ทำงานกับเหตุการณ์จากภายนอกและส่งคำสั่ง สามารถสร้างประวัติขึ้นมาใหม่ได้จากเหตุการณ์ที่เกิดขึ้นใน Aggregates ซึ่งแบ่งปันตัวระบุทั่วไปเช่น correlationId