การจัดหากิจกรรมเฉพาะเมื่อการเขียนเป็นของหายากหรือไม่


9

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

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

แล้วฉันจะพลาดอะไร การกู้คืนสถานะจากสตรีมเหตุการณ์ทำได้ปกติหรือไม่ หรือเป็นความคิดที่จะต้องทำเช่นนี้และใช้หน่วยเก็บข้อมูลที่แตกต่างกันโดยสิ้นเชิงสำหรับการดำเนินงานปกติ (เช่นใช้หน่วยเก็บข้อมูล Query จาก CQRS) และเรียกคืนจากเหตุการณ์เฉพาะในกรณีพิเศษ (เช่นการจำลองแบบการตรวจสอบ ฯลฯ )

คำตอบ:


6

แล้วฉันจะพลาดอะไร

การคาดเดา

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

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

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

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

(Snapshotting ทำให้การโยกย้ายมีความซับซ้อนการเปลี่ยนแปลงใด ๆ ในการทำให้เป็นอนุกรมของโมเดลจะทำให้สแน็ปช็อตแคชเป็นโมฆะแน่นอนคุณสามารถสร้างสแน็ปช็อตใหม่โดยใช้การทำให้เป็นอนุกรมใหม่เป็นส่วนหนึ่งของการโยกย้าย

การกู้คืนสถานะจากสตรีมเหตุการณ์ทำได้ปกติหรือไม่

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

อีกสองความคิดที่ขัดแย้ง

  1. อาจมีแคชอยู่ด้านหลังส่วนติดต่อของที่เก็บ
  2. การทำให้แคชใช้ไม่ได้เป็นหนึ่งในปัญหาหนักสองอย่าง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.