วัตถุประสงค์ของการส่งข้อความแบบคู่คีย์ / ค่าของ Kafka คืออะไร [ปิด]


97

ทั้งหมดของตัวอย่างของคาฟคา | ผู้ผลิตแสดงProducerRecordของคู่คีย์ / ค่าเป็นไม่เพียง แต่เป็นชนิดเดียวกัน (ตัวอย่างทั้งหมดแสดง<String,String>) แต่ที่เหมือนกันค่า ตัวอย่างเช่น:

producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));

แต่ในเอกสาร Kafka ฉันไม่สามารถหาที่อธิบายแนวคิดคีย์ / ค่า (และวัตถุประสงค์ / ยูทิลิตี้พื้นฐาน) ได้ ในการส่งข้อความแบบเดิม (ActiveMQ, RabbitMQ และอื่น ๆ ) ฉันมักจะส่งข้อความไปที่หัวข้อ / คิว / การแลกเปลี่ยนโดยเฉพาะ แต่คาฟคาเป็นโบรกเกอร์รายแรกที่ดูเหมือนว่าจะต้องใช้คู่คีย์ / ค่าแทนที่จะเป็นเพียงแค่ข้อความสตริงที่เป็นระเบียบ

ดังนั้นฉันจึงถาม: วัตถุประสงค์ / ประโยชน์ของการกำหนดให้ผู้ผลิตส่งคู่ KV คืออะไร?

คำตอบ:


93

Kafka ใช้นามธรรมของการกระจายเข้าสู่ระบบที่ประกอบด้วยพาร์ทิชัน การแยกล็อกเป็นพาร์ติชันช่วยให้สามารถปรับขนาดระบบได้

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

ดู: http://kafka.apache.org/intro#intro_topicsและhttp://kafka.apache.org/intro#intro_producers

โดยทั่วไปแล้วคีย์และ / หรือค่าก็สามารถเป็นได้nullเช่นกัน หากคีย์เป็นnullพาร์ติชันแบบสุ่มจะเป็นการเลือก หากค่าnullนั้นสามารถมีความหมายพิเศษ "ลบ" ได้ในกรณีที่คุณเปิดใช้งานการบีบอัดบันทึกแทนนโยบายการเก็บบันทึกสำหรับหัวข้อ ( http://kafka.apache.org/documentation#compaction )


2
และสะดุดตา, กุญแจยังเล่นเป็นส่วนที่เกี่ยวข้องใน API สตรีมมิ่งของคาฟคามีKStreamและKTable- ดูที่นี่
reim

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

@gvo คีย์มีการใช้งานมากขึ้นหรือไม่?
leoconco

1
สามารถใช้เพื่อเก็บข้อความเพียงหนึ่งอินสแตนซ์ต่อคีย์ตามที่ระบุไว้ในลิงก์การบีบอัดบันทึก ฉันไม่รู้เกี่ยวกับกรณีการใช้งานอื่น ๆ
gvo

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

17

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

หากไม่มีคีย์ข้อความสองข้อความในคีย์เดียวกันอาจไปยังพาร์ติชันที่แตกต่างกันและถูกประมวลผลโดยผู้บริโภคที่แตกต่างกันในกลุ่ม


-1

อีกกรณีการใช้งานที่น่าสนใจ

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

ฉันยังคงต้องค้นหาว่าเป็นไปได้หรือไม่ จะอัปเดตคำตอบของฉันพร้อมรายละเอียดเพิ่มเติม

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