CQRS + การจัดหากิจกรรม: (แก้ไขให้ถูกต้องหรือไม่) คำสั่งต่างๆจะสื่อสารกันแบบจุดต่อจุดในขณะที่การสื่อสารเหตุการณ์โดเมนผ่าน pub / sub?


12

โดยทั่วไปฉันพยายามจะคลุมหัวแนวคิดของCQRSและแนวคิดที่เกี่ยวข้อง

แม้ว่า CQRS ไม่จำเป็นต้องรวมการส่งข้อความและการจัดหากิจกรรม แต่ดูเหมือนว่าจะเป็นการผสมผสานที่ดี

ได้รับกรณีการใช้งานสำหรับการเปลี่ยนแปลงสถานะสำหรับบางสิ่ง (พูดเพื่ออัปเดตคำถามเกี่ยวกับ SO) คุณจะพิจารณาว่าโฟลว์ต่อไปนี้ถูกต้องหรือไม่

ระบบออกรวม UpdateQuestionCommand ซึ่งอาจแยกออกเป็นสองคำสั่งเล็ก: UpdateQuestion ซึ่งมีการกำหนดเป้าหมายที่ Root Aggregate คำถามและ UpdateUserAction (เพื่อนับคะแนน ฯลฯ ) กำหนดเป้าหมายที่ User Aggregate Root สิ่งเหล่านี้ส่งแบบอะซิงโครนัสโดยใช้การส่งข้อความแบบจุดต่อจุด

รากรวมทำสิ่งของพวกเขาและถ้าทุกอย่างดำเนินไปได้ดีกับเหตุการณ์ QuestionUpdated และ UserActionUpdated ตามลำดับซึ่งมีสถานะที่ถูกเอาต์ซอร์ซไปยัง Event Store .. เพื่อที่จะยืนยัน yadayada ให้เสร็จสมบูรณ์ไม่ใช่จุดที่นี่จริงๆ

เหตุการณ์เหล่านี้จะถูกวางในคิว pub / sub เพื่อออกอากาศ ผู้สมัครสมาชิกใด ๆ (ซึ่งมีแนวโน้มว่าจะมีหนึ่งหรือหลายโปรเจ็คเตอร์ที่สร้างมุมมองอ่าน) มีอิสระที่จะสมัครสมาชิกกับเหตุการณ์เหล่านี้

คำถามทั่วไป: เป็นวิธีปฏิบัติที่ดีที่สุดจริง ๆ หรือไม่ที่คำสั่งนั้นสื่อสารแบบจุดต่อจุด (เช่น: รู้จักผู้รับ) ในขณะที่มีการเผยแพร่เหตุการณ์ (เช่น: ผู้รับไม่ทราบ)

สมมติว่าข้างต้นอะไรคือข้อดี / ข้อเสียของการอนุญาตให้คำสั่งออกอากาศผ่าน pub / sub แทนที่จะเป็นแบบจุดต่อจุด

ตัวอย่างเช่น: เมื่อออกอากาศคำสั่งในขณะที่ใช้งานของ Sagaอาจเป็นปัญหาเนื่องจากบทบาทการไกล่เกลี่ยที่ Saga จำเป็นต้องเล่นในกรณีที่ความล้มเหลวของหนึ่งในรากรวมรวมถูกขัดขวางเนื่องจากเทพนิยายไม่ทราบว่ารากรวมใดมีส่วนร่วมเริ่มต้นด้วย .

ในทางกลับกันฉันเห็นข้อดี (ความยืดหยุ่น) เมื่ออนุญาตการออกอากาศคำสั่ง


คำถามที่เขียนดี btw
Dav

คำตอบ:


19

ปฏิเสธความรับผิดชอบ: ฉันเพียงทำตามขั้นตอนแรกของฉันในโลก CQRS แต่ฉันสามารถเสนอความเข้าใจในปัจจุบันของฉันในเรื่องนี้และเราจะดูว่าคนอื่นยืนยัน ทั้งหมดที่ฉันเขียนด้านล่างมีชุดรูปแบบ "ตามที่เห็น" และไม่มีสิทธิ์

กรณี 80%

เพื่อตอบคำถามของคุณคำสั่งนั้นเป็นเรื่องแบบจุดต่อจุด เมื่อคำสั่งเข้าสู่ตัวควบคุม (MVC webapp) จากนั้นตัวควบคุมนั้นจะขอให้ผู้มอบหมายคำสั่งค้นหาตัวจัดการคำสั่ง apropriate เพียงตัวเดียวและมอบหมายงานให้กับตัวจัดการนั้น

ทำไมไม่เผยแพร่

มันเป็นคำถามของความรับผิดชอบ หากบางสิ่งบางอย่างส่งคำสั่งมันจะนำไปสู่ความคาดหวังว่ามันจะสำเร็จ หากคุณเพียงแค่เผยแพร่และหวังว่ามีบางสิ่งที่หยิบขึ้นมาและดำเนินการกับมันก็ไม่รับประกันว่าจะเป็นเช่นนั้น โดยการคาดการณ์คุณยังไม่รู้ด้วยว่าตัวจัดการหลายตัวไม่ตัดสินใจที่จะดำเนินการกับคำสั่งหรือไม่ซึ่งอาจส่งผลให้มีการเปลี่ยนแปลงแบบเดียวกันมากกว่าหนึ่งครั้ง

ในทางกลับกันกิจกรรมเป็นข้อมูลในธรรมชาติและมีเหตุผลที่จะคาดหวังว่าองค์ประกอบศูนย์สองหรือมากกว่านั้นจะสนใจในเหตุการณ์เฉพาะ เราไม่สนใจขอบเขตของการเปลี่ยนแปลงตามที่ร้องขอจริงๆ

ตัวอย่าง

นี่อาจเทียบได้กับชีวิตจริง หากคุณมีลูกสามคนเดินเข้าไปในห้องและตะโกนว่า "ทำความสะอาดห้องน้ำ" คุณไม่รับประกันว่าจะมีใครสักคนและ perhaphs ถ้ามันจะไม่ทำสองครั้ง (ถ้าคุณมีลูกเชื่อฟังนั่นคือ ;-) คุณควร ค่าโดยสารจะดีกว่าถ้าคุณมอบหมายให้เด็กคนหนึ่งทำในสิ่งที่คุณต้องการ

เมื่อเด็กคนนั้นทำงานเสร็จแล้วมันจะสะดวกถ้ามันตะโกนว่า "ห้องน้ำได้รับการทำความสะอาด" เพื่อให้ทุกคนที่ต้องการแปรงฟันรู้ว่าพวกเขาสามารถทำได้


ทำให้รู้สึกมาก การเปรียบเทียบที่ยอดเยี่ยม :)
Geert-Jan

คุณหลงทางฉัน .. When a command enters a controller (MVC webapp)- คุณกำลังใช้ RESTful อยู่หรือไม่ หรือปลายทางไฮบริด API บางส่วน คุณสามารถเพิ่มตัวอย่างได้ไหม
Piotr Kula

@ppumkin เราใช้จุดปลาย WebAPI ที่เว็บแอปของเราจะเรียกใช้ทุกครั้งที่ต้องการเรียกใช้คำสั่ง เช่น. หากผู้ใช้ต้องการที่จะเพิ่มความคิดเห็นโพสต์เว็บแอปจะส่งคำขอ POST example.com/api/Post/AddPostCommentไป
Dav

1

ฉันเห็นด้วยว่าระบบการเริ่มต้นมักจะไม่คาดหวังว่าคำสั่งจะทำธุรกรรมโดยระบบเป้าหมายหลายระบบ:

  • คำสั่งมักจะไม่ 'ส่งและอธิษฐาน' - ระบบเริ่มต้นของคำสั่งโดยทั่วไปต้องการความคิดเห็นแบบอะซิงโครนัสเนื่องจากความก้าวหน้าและผลลัพธ์ของคำสั่งเกิดขึ้น (เช่นเหตุการณ์ของรัฐเช่นacknowledgementและประสบความสำเร็จcompletionหรือfailureสามารถเผยแพร่โดยระบบเป้าหมาย ระบบ).
  • หากระบบเป้าหมายหลายระบบมีส่วนเกี่ยวข้องระบบเริ่มต้นจะได้รับผลลัพธ์หลายรายการ (อาจขัดแย้ง) สำหรับคำสั่ง (เช่นเป้าหมาย 1 สำเร็จ แต่เป้าหมาย 2 ล้มเหลว) สิ่งนี้จะต้องมีความซับซ้อนเพิ่มเติมในการกำหนดสถานะที่แท้จริงของคำสั่งเดิม (เช่นการทำธุรกรรมคำสั่งจะถือว่าประสบความสำเร็จเฉพาะในกรณีที่เป้าหมายทั้งหมดประสบความสำเร็จหรือไม่คำสั่งจะต้องย้อนกลับหรือชดเชยในเป้าหมายที่ประสบความสำเร็จ ฯลฯ ) สิ่งนี้จะแนะนำการมีเพศสัมพันธ์และความซับซ้อนที่ไม่พึงประสงค์ระหว่างการเริ่มต้นและระบบเป้าหมาย

อย่างไรก็ตามยังมีข้อดีในการสมัครสมาชิกเพิ่มเติม (ไม่ใช่ธุรกรรมและโดยปกติแล้วผู้บริโภคที่ 'สำส่อน') ที่ 'แอบฟัง' คำสั่งที่ออกระหว่างระบบ

  • วัตถุประสงค์การตรวจสอบ
  • เครื่องมือวัดและตัวชี้วัดการดำเนินงาน (เช่นโหลดการวิเคราะห์ธุรกิจ ฯลฯ )
  • การประมวลผลเหตุการณ์ที่ซับซ้อนหรือสตรีมการประมวลผลเหตุการณ์ 'ดักฟัง' - ระบบเหล่านี้สามารถตรวจจับข้อผิดพลาดหรือความผิดปกติในคำสั่ง (เช่นความถี่ของคำสั่งหรือความสัมพันธ์ระหว่างชุดคำสั่งและเหตุการณ์ที่แตกต่างกัน) และสามารถกระตุ้นการแจ้งเตือนหรือดำเนินการแก้ไข รูปแบบของคำสั่งประเภทต่าง ๆ เพิ่มเติม)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.