โดยทั่วไปฉันพยายามจะคลุมหัวแนวคิดของCQRSและแนวคิดที่เกี่ยวข้อง
แม้ว่า CQRS ไม่จำเป็นต้องรวมการส่งข้อความและการจัดหากิจกรรม แต่ดูเหมือนว่าจะเป็นการผสมผสานที่ดี
ได้รับกรณีการใช้งานสำหรับการเปลี่ยนแปลงสถานะสำหรับบางสิ่ง (พูดเพื่ออัปเดตคำถามเกี่ยวกับ SO) คุณจะพิจารณาว่าโฟลว์ต่อไปนี้ถูกต้องหรือไม่
ระบบออกรวม UpdateQuestionCommand ซึ่งอาจแยกออกเป็นสองคำสั่งเล็ก: UpdateQuestion ซึ่งมีการกำหนดเป้าหมายที่ Root Aggregate คำถามและ UpdateUserAction (เพื่อนับคะแนน ฯลฯ ) กำหนดเป้าหมายที่ User Aggregate Root สิ่งเหล่านี้ส่งแบบอะซิงโครนัสโดยใช้การส่งข้อความแบบจุดต่อจุด
รากรวมทำสิ่งของพวกเขาและถ้าทุกอย่างดำเนินไปได้ดีกับเหตุการณ์ QuestionUpdated และ UserActionUpdated ตามลำดับซึ่งมีสถานะที่ถูกเอาต์ซอร์ซไปยัง Event Store .. เพื่อที่จะยืนยัน yadayada ให้เสร็จสมบูรณ์ไม่ใช่จุดที่นี่จริงๆ
เหตุการณ์เหล่านี้จะถูกวางในคิว pub / sub เพื่อออกอากาศ ผู้สมัครสมาชิกใด ๆ (ซึ่งมีแนวโน้มว่าจะมีหนึ่งหรือหลายโปรเจ็คเตอร์ที่สร้างมุมมองอ่าน) มีอิสระที่จะสมัครสมาชิกกับเหตุการณ์เหล่านี้
คำถามทั่วไป: เป็นวิธีปฏิบัติที่ดีที่สุดจริง ๆ หรือไม่ที่คำสั่งนั้นสื่อสารแบบจุดต่อจุด (เช่น: รู้จักผู้รับ) ในขณะที่มีการเผยแพร่เหตุการณ์ (เช่น: ผู้รับไม่ทราบ)
สมมติว่าข้างต้นอะไรคือข้อดี / ข้อเสียของการอนุญาตให้คำสั่งออกอากาศผ่าน pub / sub แทนที่จะเป็นแบบจุดต่อจุด
ตัวอย่างเช่น: เมื่อออกอากาศคำสั่งในขณะที่ใช้งานของ Sagaอาจเป็นปัญหาเนื่องจากบทบาทการไกล่เกลี่ยที่ Saga จำเป็นต้องเล่นในกรณีที่ความล้มเหลวของหนึ่งในรากรวมรวมถูกขัดขวางเนื่องจากเทพนิยายไม่ทราบว่ารากรวมใดมีส่วนร่วมเริ่มต้นด้วย .
ในทางกลับกันฉันเห็นข้อดี (ความยืดหยุ่น) เมื่ออนุญาตการออกอากาศคำสั่ง