ฉันเพิ่งเริ่มดำน้ำใน CQRS / ES เพราะฉันอาจจำเป็นต้องใช้มันในที่ทำงาน ดูเหมือนว่าจะมีแนวโน้มมากในกรณีของเราเพราะมันจะแก้ปัญหาได้มากมาย
ฉันร่างความเข้าใจคร่าวๆว่าแอพ ES / CQRS ควรมีลักษณะเป็นบริบทอย่างไรในกรณีการใช้งานธนาคารที่เรียบง่าย (ถอนเงิน)
เพื่อสรุปหากบุคคล A ถอนเงิน:
- ออกคำสั่ง
- คำสั่งถูกมอบให้สำหรับการตรวจสอบ / การตรวจสอบ
- เหตุการณ์ถูกส่งไปยังที่เก็บเหตุการณ์หากการตรวจสอบความถูกต้องสำเร็จ
- ผู้รวบรวมจะ dequeues เหตุการณ์เพื่อใช้การแก้ไขกับการรวม
จากสิ่งที่ฉันเข้าใจบันทึกเหตุการณ์เป็นที่มาของความจริงเนื่องจากมันเป็นบันทึกของข้อเท็จจริงเราก็จะสามารถประมาณการภาพใด ๆ ออกมาได้
ตอนนี้สิ่งที่ฉันไม่เข้าใจในสิ่งที่ยิ่งใหญ่นี้คือสิ่งที่เกิดขึ้นในกรณีนี้:
- กฎ: ยอดคงเหลือต้องไม่ติดลบ
- person A มียอดคงเหลือ 100e
- person A ทำการถอนคำสั่งจาก 100e
- ผ่านการตรวจสอบและ MoneyWithdrewEvent 100e เหตุการณ์
- ในระหว่างนี้บุคคล A ออกการถอนคำสั่งอีก 100e
- MoneyWithdrewEvent ตัวแรกไม่ได้รับการรวบรวม แต่ยังผ่านการตรวจสอบเนื่องจากการตรวจสอบการตรวจสอบกับการรวม (ที่ยังไม่ได้รับการปรับปรุง)
- MoneyWithdrewEvent 100e ถูกปล่อยออกมาอีกครั้ง
==> เราอยู่ในสถานะที่ไม่สอดคล้องกันของยอดคงเหลือที่ -100e และบันทึกมี 2 MoneyWithdrewEvent
ที่ฉันเข้าใจมีหลายกลยุทธ์ที่จะรับมือกับปัญหานี้:
- ก) ใส่รหัสเวอร์ชั่นรวมพร้อมกับเหตุการณ์ในที่จัดเก็บเหตุการณ์ดังนั้นหากมีรุ่นที่ไม่ตรงกันเมื่อทำการดัดแปลงจะไม่มีอะไรเกิดขึ้น
- b) ใช้กลยุทธ์การล็อกบางอย่างซึ่งหมายถึงว่าชั้นการตรวจสอบจะต้องสร้างขึ้นมา
คำถามที่เกี่ยวข้องกับกลยุทธ์:
- ก) ในกรณีนี้บันทึกเหตุการณ์ไม่ใช่ที่มาของความจริงอีกต่อไปจะจัดการกับมันอย่างไร นอกจากนี้เรากลับไปที่ลูกค้าตกลงในขณะที่มันผิดทั้งหมดเพื่อให้ถอนได้ดีกว่าในกรณีนี้ที่จะใช้ล็อค?
- b) ล็อค == การหยุดชะงักคุณมีข้อมูลเชิงลึกเกี่ยวกับแนวปฏิบัติที่ดีที่สุดหรือไม่?
โดยรวมแล้วความเข้าใจของฉันถูกต้องเกี่ยวกับวิธีจัดการกับการเกิดพร้อมกันหรือไม่
หมายเหตุ: ฉันเข้าใจว่าบุคคลคนเดียวกันที่ถอนเงินสองครั้งในช่วงเวลาสั้น ๆ เช่นนี้เป็นไปไม่ได้ แต่ฉันได้ยกตัวอย่างง่ายๆเพื่อไม่ให้หลงรายละเอียด