ฉันกลับมาที่ QA นี้ต่อไป และฉันไม่พบคำตอบที่มีอยู่เหมาะสมพอฉันจึงเพิ่มคำตอบนี้
TL; DR ใช่หรือไม่ขึ้นอยู่กับการใช้งานการจัดหากิจกรรมของคุณ
มีเหตุการณ์หลักสองประเภทที่มาจากระบบที่ฉันรับรู้
ตัวประมวลผลเหตุการณ์ดาวน์สตรีม = ใช่
ในระบบประเภทนี้เหตุการณ์ที่เกิดขึ้นในโลกแห่งความจริงและถูกบันทึกไว้เป็นข้อเท็จจริง เช่นระบบคลังสินค้าเพื่อติดตามแพลเลตของผลิตภัณฑ์ โดยทั่วไปจะไม่มีเหตุการณ์ที่ขัดแย้งกัน ทุกอย่างเกิดขึ้นแล้วแม้ว่ามันจะผิด (พาเลท Ie คือ 123456 วางบนรถบรรทุก A แต่ถูกกำหนดไว้สำหรับรถบรรทุก B) จากนั้นข้อเท็จจริงจะถูกตรวจสอบเพื่อหาข้อยกเว้นผ่านกลไกการรายงาน Kafka นั้นเหมาะสำหรับแอพพลิเคชั่นประมวลผลเหตุการณ์แบบดาวน์สตรีมประเภทนี้
ในบริบทนี้เป็นที่เข้าใจว่าเหตุใดคนคาฟคาจึงเรียกร้องให้เป็นโซลูชั่นการจัดหากิจกรรม เพราะมันค่อนข้างคล้ายกับวิธีที่ใช้ไปแล้วในตัวอย่างเช่นสตรีมการคลิก อย่างไรก็ตามผู้ที่ใช้คำว่า Event Sourcing (ซึ่งต่างจากการประมวลผลแบบสตรีม) น่าจะหมายถึงการใช้งานที่สอง
แอปพลิเคชันที่ควบคุมความจริง = ไม่
แอปพลิเคชันประเภทนี้ประกาศเหตุการณ์ของตนเองอันเป็นผลมาจากการร้องขอของผู้ใช้ที่ผ่านตรรกะทางธุรกิจ คาฟคาทำงานได้ไม่ดีในกรณีนี้ด้วยเหตุผลสองประการ
ขาดการแยกเอนทิตี
สถานการณ์นี้ต้องการความสามารถในการโหลดสตรีมเหตุการณ์สำหรับเอนทิตีที่เฉพาะเจาะจง เหตุผลทั่วไปสำหรับสิ่งนี้คือการสร้างแบบจำลองการเขียนชั่วคราวสำหรับตรรกะทางธุรกิจเพื่อใช้ในการประมวลผลคำขอ การทำเช่นนี้ไม่สามารถทำได้ใน Kafka การใช้หัวข้อต่อเอนทิตีอาจอนุญาตสิ่งนี้ยกเว้นกรณีนี้ไม่ใช่แบบเริ่มต้นเมื่ออาจมีเอนทิตีหลายพันหรือหลายล้านรายการ นี่เป็นเพราะข้อ จำกัด ทางเทคนิคใน Kafka / Zookeeper
หนึ่งในเหตุผลหลักที่ใช้รูปแบบการเขียนชั่วคราวในวิธีนี้คือการเปลี่ยนแปลงตรรกะทางธุรกิจราคาถูกและใช้งานง่าย
ขอแนะนำให้ใช้หัวข้อต่อประเภทสำหรับ Kafka แต่สิ่งนี้จะต้องมีการโหลดกิจกรรมสำหรับทุกเอนทิตีของประเภทนั้นเพียงเพื่อรับกิจกรรมสำหรับเอนทิตีเดียว เนื่องจากคุณไม่สามารถบอกได้จากตำแหน่งบันทึกว่ากิจกรรมใดเป็นของเอนทิตี้ใด แม้แต่การใช้สแนปชอตเพื่อเริ่มจากตำแหน่งบันทึกที่รู้จักก็อาจเป็นเหตุการณ์สำคัญที่จะทำให้เกิดการเปลี่ยนแปลง
ขาดการตรวจสอบความขัดแย้ง
ประการที่สองผู้ใช้สามารถสร้างเงื่อนไขการแข่งขันเนื่องจากการร้องขอพร้อมกันกับเอนทิตีเดียวกัน อาจไม่เป็นที่พึงปรารถนาที่จะบันทึกเหตุการณ์ที่ขัดแย้งกันและแก้ไขหลังจากเหตุการณ์นั้น ดังนั้นจึงเป็นสิ่งสำคัญที่จะสามารถป้องกันเหตุการณ์ที่ขัดแย้งกัน เมื่อต้องการปรับขนาดการโหลดคำขอเป็นเรื่องปกติที่จะใช้บริการแบบไม่มีสถานะในขณะที่ป้องกันการเขียนที่ขัดแย้งโดยใช้การเขียนแบบมีเงื่อนไข (เขียนเฉพาะเมื่อเหตุการณ์เอนทิตีล่าสุดคือ #x) Aka Optimistic Concurrency Kafka ไม่สนับสนุนการเห็นพ้องด้วยในแง่ดี แม้ว่ามันจะสนับสนุนในระดับหัวข้อมันจะต้องลงไปถึงระดับเอนทิตีเพื่อให้มีประสิทธิภาพ ในการใช้คาฟคาและป้องกันเหตุการณ์ที่ขัดแย้งกันคุณจะต้องใช้ตัวเขียนที่ต่อเนื่องและสถานะในระดับแอปพลิเคชัน นี่คือข้อกำหนด / ข้อ จำกัด ทางสถาปัตยกรรมที่สำคัญ
ข้อมูลเพิ่มเติม
อัปเดตต่อความคิดเห็น
ความคิดเห็นถูกลบไปแล้ว แต่คำถามก็เป็นเช่น: ผู้คนจะใช้พื้นที่จัดเก็บเหตุการณ์อย่างไร
ดูเหมือนว่าคนส่วนใหญ่ใช้การจัดเก็บเหตุการณ์ของตัวเองบนฐานข้อมูลที่มีอยู่ สำหรับสถานการณ์ที่ไม่เผยแพร่เช่นผลิตภัณฑ์แบ็คเอนด์ภายในหรือผลิตภัณฑ์แบบสแตนด์อโลนมันมีเอกสารวิธีการสร้างที่จัดเก็บเหตุการณ์บน SQL อย่างดี และมีห้องสมุดอยู่ด้านบนของฐานข้อมูลชนิดต่าง ๆ นอกจากนี้ยังมีEventStoreซึ่งสร้างขึ้นเพื่อจุดประสงค์นี้
ในสถานการณ์แบบกระจายฉันเห็นการใช้งานที่แตกต่างกันสองอย่าง โครงการ Pantherของ Jet ใช้ Azure CosmosDBพร้อมคุณสมบัติ Change Feed เพื่อแจ้งเตือนผู้ฟัง การใช้งานที่คล้ายกันอีกอย่างที่ฉันเคยได้ยินเกี่ยวกับ AWS คือการใช้ DynamoDB พร้อมคุณสมบัติสตรีมเพื่อแจ้งผู้ฟัง คีย์พาร์ติชันอาจเป็นรหัสสตรีมสำหรับการกระจายข้อมูลที่ดีที่สุด (เพื่อลดปริมาณการจัดสรรพื้นที่ส่วนเกิน) อย่างไรก็ตามการเล่นซ้ำเต็มรูปแบบข้ามลำธารใน Dynamo นั้นมีราคาแพง (อ่านและคุ้มค่า) ดังนั้นสิ่งนี้จึงถูกตั้งค่าสำหรับ Dynamo Streams เพื่อทิ้งกิจกรรมลง S3 เมื่อผู้ฟังใหม่ออนไลน์หรือผู้ฟังที่มีอยู่ต้องการเล่นซ้ำแบบเต็มมันจะอ่าน S3 เพื่อให้ทันก่อน
โครงการปัจจุบันของฉันเป็นสถานการณ์ที่มีผู้เช่าหลายคนและฉันได้ม้วนตัวเองออกจาก Postgres สิ่งที่ดูเหมือนว่า Citus นั้นเหมาะสมสำหรับการขยายขีดความสามารถการแบ่งพาร์ติชันโดยสตรีม + บวก
คาฟคายังคงมีประโยชน์มากในสถานการณ์จำลอง มันเป็นปัญหาที่ไม่สำคัญที่จะเปิดเผยกิจกรรมของบริการแต่ละบริการอื่น ๆ โดยทั่วไปแล้ว Event store นั้นไม่ได้สร้างขึ้นมา แต่นั่นเป็นสิ่งที่ Kafka ทำได้ดี แต่ละบริการมีแหล่งที่มาของความจริงภายในของตัวเอง (อาจเป็นที่เก็บเหตุการณ์หรืออย่างอื่น) แต่ฟัง Kafka เพื่อรับรู้ว่าเกิดอะไรขึ้น "นอก" บริการอาจโพสต์กิจกรรมไปยัง Kafka เพื่อแจ้ง "นอก" ในสิ่งที่น่าสนใจที่บริการทำ