tl; dr
ไม่ไม่จำเป็นต้องใช้คีย์ในการส่งข้อความถึงคาฟคา แต่...
นอกจากคำตอบที่เป็นที่ยอมรับที่เป็นประโยชน์แล้วฉันยังต้องการเพิ่มรายละเอียดอีกเล็กน้อย
การแบ่งพาร์ติชัน
โดยค่าเริ่มต้น Kafka จะใช้คีย์ของข้อความเพื่อเลือกพาร์ติชันของหัวข้อที่เขียนถึง สิ่งนี้ทำได้DefaultPartitioner
โดย
kafka.common.utils.Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
หากไม่มีคีย์ให้ Kafka จะแบ่งข้อมูลแบบสุ่มในรูปแบบ Round-robin
ในคาฟคาคุณสามารถสร้างพาร์ติชันเนอร์ของคุณเองได้โดยการขยายPartitioner
คลาส สำหรับสิ่งนี้คุณต้องแทนที่partition
วิธีการที่มีลายเซ็น:
int partition(String topic,
Object key,
byte[] keyBytes,
Object value,
byte[] valueBytes,
Cluster cluster)
โดยปกติคีย์ของข้อความ Kafka จะใช้เพื่อเลือกพาร์ติชันและค่าส่งคืน (ประเภทint
) คือหมายเลขพาร์ติชัน หากไม่มีคีย์คุณจะต้องพึ่งพาค่าซึ่งอาจซับซ้อนกว่าในการประมวลผล
การสั่งซื้อ
ตามที่ระบุไว้ในคำตอบที่ระบุ Kafka รับประกันการสั่งซื้อข้อความในระดับพาร์ติชันเท่านั้น
สมมติว่าคุณต้องการจัดเก็บธุรกรรมทางการเงินสำหรับลูกค้าของคุณในหัวข้อ Kafka ที่มีสองพาร์ติชัน ข้อความอาจมีลักษณะ (คีย์: ค่า)
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": -1337}
null:{"customerId": 1, "changeInBankAccount": +200}
เนื่องจากเราไม่ได้กำหนดคีย์ทั้งสองพาร์ติชันจึงน่าจะมีลักษณะดังนี้
// partition 0
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": -1337}
ผู้บริโภคของคุณที่อ่านหัวข้อนั้นอาจบอกคุณได้ว่ายอดเงินในบัญชีคือ 600 ในช่วงเวลาหนึ่งแม้ว่าจะไม่เคยเป็นเช่นนั้นก็ตาม! เพียงเพราะอ่านข้อความทั้งหมดในพาร์ติชัน 0 ก่อนข้อความในพาร์ติชัน 1
ด้วยคีย์ที่มีความหมาย (เช่น customerId) สิ่งนี้สามารถหลีกเลี่ยงได้เนื่องจากการแบ่งส่วนจะเป็นดังนี้:
// partition 0
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": -1337}
1:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
2:{"customerId": 2, "changeInBankAccount": +100}
บันทึกการบดอัด
โดยไม่ต้องคีย์เป็นส่วนหนึ่งของข้อความของคุณคุณจะไม่สามารถตั้งค่าการกำหนดค่าหัวข้อการcleanup.policy
compacted
ตามเอกสารประกอบ "การบีบอัดบันทึกช่วยให้มั่นใจได้ว่า Kafka จะรักษาค่าสุดท้ายที่ทราบไว้เป็นอย่างน้อยสำหรับแต่ละคีย์ข้อความภายในบันทึกข้อมูลสำหรับพาร์ติชันหัวข้อเดียว"
การตั้งค่าที่ดีและเป็นประโยชน์นี้จะไม่สามารถใช้ได้หากไม่มีคีย์ใด ๆ
การใช้คีย์
ในกรณีการใช้งานจริงกุญแจสำคัญของข้อความ Kafka อาจมีอิทธิพลอย่างมากต่อประสิทธิภาพและความชัดเจนของตรรกะทางธุรกิจของคุณ
ตัวอย่างเช่นสามารถใช้คีย์สำหรับการแบ่งพาร์ติชันข้อมูลของคุณได้ ในขณะที่คุณสามารถควบคุมผู้บริโภคของคุณให้อ่านจากพาร์ติชันเฉพาะได้สิ่งนี้สามารถใช้เป็นตัวกรองที่มีประสิทธิภาพได้ นอกจากนี้คีย์ยังสามารถรวมข้อมูลเมตาบางส่วนเกี่ยวกับค่าจริงของข้อความที่ช่วยให้คุณควบคุมการประมวลผลในภายหลังได้ โดยปกติแล้วคีย์จะมีขนาดเล็กกว่าดังนั้นจึงสะดวกกว่าในการแยกวิเคราะห์คีย์แทนค่าทั้งหมด ในเวลาเดียวกันคุณสามารถใช้การทำให้เป็นอนุกรมและการลงทะเบียนสคีมาทั้งหมดเมื่อเสร็จสิ้นกับค่าของคุณพร้อมกับคีย์
เป็นบันทึกนอกจากนี้ยังมีแนวคิดของส่วนหัวที่สามารถใช้ในการจัดเก็บข้อมูลดูเอกสาร