รับบริการ A (CMS) ที่ควบคุมรูปแบบ (ผลิตภัณฑ์สมมติว่ามีเพียงฟิลด์เดียวที่มี id ชื่อเรื่องราคา) และบริการ B (การจัดส่ง) และ C (อีเมล) ที่ต้องแสดงรูปแบบที่กำหนดแนวทางที่ควรจะเป็น การซิงโครไนซ์ข้อมูลโมเดลที่ได้รับจากบริการเหล่านั้นในแนวทางการจัดหากิจกรรม สมมติว่ารายการสินค้าที่ไม่ค่อยมีการเปลี่ยนแปลง ( แต่ไม่เปลี่ยนแปลง) และว่ามีผู้ดูแลระบบที่เข้าถึงข้อมูลสามารถของการจัดส่งและอีเมลบ่อยมาก (ตัวอย่างเช่นฟังก์ชันคือ: B: display titles of products the order contained
และ C: display content of email about shipping that is going to be sent
) แต่ละบริการมีฐานข้อมูลของตนเอง
โซลูชันที่ 1
ส่งข้อมูลที่จำเป็นทั้งหมดเกี่ยวกับผลิตภัณฑ์ภายในเหตุการณ์ซึ่งหมายถึงโครงสร้างต่อไปนี้สำหรับorder_placed
:
{
order_id: [guid],
product: {
id: [guid],
title: 'Foo',
price: 1000
}
}
บริการข้อมูลผลิตภัณฑ์ B และ C จะถูกเก็บไว้ในproduct
แอตทริบิวต์ JSON บนorders
ตาราง
ดังนั้นเพื่อแสดงข้อมูลที่จำเป็นจะมีการใช้ข้อมูลที่ดึงมาจากเหตุการณ์เท่านั้น
ปัญหา : ขึ้นอยู่กับข้อมูลอื่นที่จำเป็นต้องนำเสนอใน B และ C จำนวนข้อมูลในเหตุการณ์สามารถเติบโตได้ B และ C อาจไม่ต้องการข้อมูลเดียวกันเกี่ยวกับผลิตภัณฑ์ แต่เหตุการณ์จะต้องมีทั้งสองอย่าง (ยกเว้นกรณีที่เราแยกเหตุการณ์เป็นสองเหตุการณ์) หากข้อมูลที่ให้ไว้ไม่ปรากฏในกิจกรรมที่กำหนดรหัสไม่สามารถใช้งานได้ - หากเราจะเพิ่มตัวเลือกสีให้กับผลิตภัณฑ์สำหรับคำสั่งซื้อที่มีอยู่ใน B และ C ผลิตภัณฑ์ที่ให้จะไม่มีสีเว้นแต่เราจะอัปเดตเหตุการณ์แล้วรันซ้ำอีกครั้ง .
โซลูชันที่ 2
ส่ง guid ของผลิตภัณฑ์ภายในเหตุการณ์เท่านั้นซึ่งหมายถึงโครงสร้างต่อไปนี้สำหรับorder_placed
:
{
order_id: [guid],
product_id: [guid]
}
บนบริการข้อมูลผลิตภัณฑ์ B และ C จะถูกเก็บไว้ในproduct_id
แอตทริบิวต์ในorders
ตาราง
ข้อมูลผลิตภัณฑ์จะถูกเรียกคืนโดยบริการ B และ C เมื่อต้องการโดยดำเนินการเรียก API ไปยังA/product/[guid]
ปลายทาง
ปัญหา : สิ่งนี้ทำให้ B และ C ขึ้นอยู่กับ A (ตลอดเวลา) หากสคีมาของผลิตภัณฑ์เปลี่ยนแปลงบน A การเปลี่ยนแปลงจะต้องทำในบริการทั้งหมดที่ขึ้นอยู่กับพวกเขา (ทันใด)
โซลูชันที่ 3
ส่ง guid ของผลิตภัณฑ์ภายในเหตุการณ์เท่านั้นซึ่งหมายถึงโครงสร้างต่อไปนี้สำหรับ order_placed:
{
order_id: [guid],
product_id: [guid]
}
บนบริการข้อมูลผลิตภัณฑ์ B และ C จะถูกเก็บไว้ในproducts
ตาราง; ยังคงproduct_id
อยู่บนorders
โต๊ะ แต่มีการจำลองproducts
ข้อมูลระหว่าง A, B และ C B และ C อาจมีข้อมูลที่แตกต่างเกี่ยวกับผลิตภัณฑ์กว่า A
ข้อมูลผลิตภัณฑ์ถูกสร้างขึ้นเมื่อมีการสร้างบริการ B และ C และอัพเดททุกครั้งที่ข้อมูลเกี่ยวกับผลิตภัณฑ์เปลี่ยนแปลงโดยการโทรไปยังA/product
ปลายทาง (ที่แสดงข้อมูลที่ต้องการของผลิตภัณฑ์ทั้งหมด) หรือทำการเข้าถึงฐานข้อมูลโดยตรงไปยัง A และคัดลอกข้อมูลผลิตภัณฑ์ที่จำเป็น บริการ.
ปัญหา : สิ่งนี้ทำให้ B และ C ขึ้นอยู่กับ A (เมื่อทำการเพาะ) หากสคีมาของผลิตภัณฑ์เปลี่ยนแปลงบน A การเปลี่ยนแปลงจะต้องทำในบริการทั้งหมดที่ขึ้นอยู่กับพวกเขา (เมื่อเริ่มต้น)
จากความเข้าใจของฉันแนวทางที่ถูกต้องคือการใช้โซลูชัน 1 และอัปเดตประวัติกิจกรรมตามตรรกะบางอย่าง (หากแคตตาล็อกผลิตภัณฑ์ไม่เปลี่ยนแปลงและเราต้องการเพิ่มสีที่จะแสดงเราสามารถอัปเดตประวัติอย่างปลอดภัยเพื่อรับสถานะปัจจุบัน ของผลิตภัณฑ์และกรอกข้อมูลที่ขาดหายไปภายในเหตุการณ์) หรือรองรับการไม่มีอยู่ของข้อมูลที่กำหนด (ถ้าแคตตาล็อกผลิตภัณฑ์มีการเปลี่ยนแปลงและเราต้องการเพิ่มสีที่จะแสดงเราไม่สามารถแน่ใจได้ว่า ณ เวลานั้นในอดีต มีสีหรือไม่ - เราสามารถสันนิษฐานได้ว่าผลิตภัณฑ์ทั้งหมดในแคตตาล็อกก่อนหน้านี้เป็นสีดำและรองรับได้โดยการอัพเดทกิจกรรมหรือรหัส)
updating event history
ฉันหมายถึง: ไปที่เหตุการณ์ทั้งหมดคัดลอกจากสตรีมหนึ่ง (v1) ไปยังสตรีมอื่น (v2) เพื่อรักษาสคีมาเหตุการณ์ที่สอดคล้องกัน
display image at the point when purchase was made
) หรือไม่ (แสดงถึงเจตนาdisplay current image as it within catalog
)
updating event history
- ในการจัดหาประวัติเหตุการณ์เหตุการณ์เป็นแหล่งที่มาของความจริงของคุณและไม่ควรเปลี่ยนแปลง แต่จะไปข้างหน้าเท่านั้น หากเหตุการณ์เปลี่ยนแปลงคุณสามารถใช้การกำหนดเวอร์ชันเหตุการณ์หรือโซลูชันที่คล้ายกัน แต่เมื่อเล่นซ้ำเหตุการณ์ของคุณจนถึงจุดที่ระบุในเวลาสถานะของข้อมูลควรจะเป็นเหมือนเดิม ณ จุดนั้น