แล้วฉันจะพลาดอะไร
การคาดเดา
สิ่งแรกที่คุณอาจขาดหายไปก็คือคุณจะต้องโหลดเหตุการณ์สำหรับสถานะที่คุณกำลังสร้างใหม่เท่านั้น หากคุณสามารถจำลองขอบเขตการทำธุรกรรมของคุณได้อย่างหมดจดแต่ละวัตถุสามารถเขียนเหตุการณ์ที่ติดแท็กด้วย id ของตัวเองแล้วอ่านกลับในเหตุการณ์เหล่านั้นเท่านั้น ใช้ฐานข้อมูลเชิงสัมพันธ์สำหรับการจัดเก็บเหตุการณ์จะมีคอลัมน์ id ดัชนีเพื่อเพิ่มความเร็วในการค้นหา ใช้ EventStore แต่ละออบเจกต์จะมีสตรีมของตัวเอง
ใช้ความระมัดระวังในแบบจำลองของคุณเพื่อทำสิ่งนี้อย่างหมดจดตามที่คุณต้องการเพื่อให้แน่ใจว่าคุณกำลังแก้ไขวัตถุเดียวในแต่ละธุรกรรมและดังนั้นคุณต้องดูแลให้แน่ใจว่าคุณแยกค่าคงที่แต่ละอย่างที่คุณพยายาม บังคับใช้
ในกรณีที่ไม่เร็วพอคุณยังคงมีความเป็นไปได้ในการสร้างสแนปชอตของสถานะ (บันทึก) และยังคงอยู่ใน "พื้นที่จัดเก็บแบบดั้งเดิม" แต่ละสแน็ปช็อตจะถูกแท็กด้วยหมายเลขลำดับของเหตุการณ์ล่าสุดที่ใช้สร้างสแน็ปช็อต ในการรีโหลดที่เก็บข้อมูลจะจับภาพก่อนจากนั้นนำเหตุการณ์ที่ใหม่กว่ามาใช้ (นี่หมายถึงวิธีที่สมเหตุสมผลในการจับภาพรวมล่าสุด - เหตุการณ์จะถูกติดแท็กด้วยหมายเลขลำดับหรือคุณมีวิธีที่มีประสิทธิภาพในการอ่านกระแสข้อมูลกิจกรรมย้อนหลังจนกระทั่งถึงจุดเริ่มต้น)
ยังคงมีข้อได้เปรียบเหนือวิธีการทั่วไปที่นี่เนื่องจากสแนปชอตของคุณสามารถสร้างควบคู่ไปกับการเขียนของคุณแทนที่จะรวมเข้ากับพวกเขา: คุณเพียงแค่ใส่ผู้ฟังเหตุการณ์ในเธรด / กระบวนการอื่น ๆ ไปที่ร้านสแน็ปช็อตตามกำหนดเวลาที่เหมาะสม ท้ายที่สุดภาพรวมไม่จำเป็นต้องตรงเวลาเป็นพิเศษบ่อยครั้งมากพอที่การใช้งานเหตุการณ์ที่ใหม่กว่านั้นจะไม่ส่งผลกระทบต่อ SLA ของคุณ
(Snapshotting ทำให้การโยกย้ายมีความซับซ้อนการเปลี่ยนแปลงใด ๆ ในการทำให้เป็นอนุกรมของโมเดลจะทำให้สแน็ปช็อตแคชเป็นโมฆะแน่นอนคุณสามารถสร้างสแน็ปช็อตใหม่โดยใช้การทำให้เป็นอนุกรมใหม่เป็นส่วนหนึ่งของการโยกย้าย
การกู้คืนสถานะจากสตรีมเหตุการณ์ทำได้ปกติหรือไม่
ใช่แล้ว. สิ่งที่ตามปกติจะแสดงในตัวอย่างของ CQRS คือชั้นของแอปพลิเคชันหลังจากตรวจสอบให้แน่ใจว่าคำสั่งที่ส่งมีรูปแบบที่ดีแล้วแอปพลิเคชันเลเยอร์จะโหลดวัตถุโดเมนจากพื้นที่เก็บข้อมูลโดยที่การโหลดเป็นตัวสร้างเริ่มต้น (หรือเทียบเท่าเป็นการเรียกไปยังโรงงานที่มีรายการเหตุการณ์)
อีกสองความคิดที่ขัดแย้ง
- อาจมีแคชอยู่ด้านหลังส่วนติดต่อของที่เก็บ
- การทำให้แคชใช้ไม่ได้เป็นหนึ่งในปัญหาหนักสองอย่าง