การทำความเข้าใจหัวข้อและพาร์ทิชันของคาฟคา


185

ฉันเริ่มเรียนรู้คาฟคาเพื่อจุดประสงค์ในการแก้ปัญหาขององค์กร

ในระหว่างที่ฉันอ่านคำถามบางอย่างอยู่ในใจของฉัน:

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

  4. พาร์ติชั่นสร้างขึ้นโดยนายหน้าหรือไม่และไม่ใช่เรื่องที่น่ากังวลสำหรับผู้บริโภคหรือไม่?

  5. เนื่องจากนี่เป็นคิวที่มีออฟเซ็ตสำหรับแต่ละพาร์ติชันมันเป็นความรับผิดชอบของผู้บริโภคที่จะระบุข้อความที่ต้องการอ่านหรือไม่? มันจำเป็นต้องบันทึกสถานะของมันหรือไม่?

  6. จะเกิดอะไรขึ้นเมื่อข้อความถูกลบออกจากคิว - ตัวอย่างเช่น: การเก็บรักษาเป็นเวลา 3 ชั่วโมงจากนั้นเวลาผ่านไปจะจัดการกับทั้งสองด้านได้อย่างไร

คำตอบ:


162

โพสต์นี้มีคำตอบอยู่แล้ว แต่ฉันกำลังเพิ่มมุมมองของฉันด้วยภาพบางส่วนจาก Kafka Definitive Guide

ก่อนที่จะตอบคำถามแต่ละข้อลองเพิ่มภาพรวมของส่วนประกอบผู้ผลิต:

ภาพรวมของส่วนประกอบผู้ผลิต

1. เมื่อผู้ผลิตสร้างข้อความ - มันจะระบุหัวข้อที่ต้องการส่งข้อความไปใช่ไหม? มันสนใจพาร์ติชั่นไหม?

ผู้ผลิตจะตัดสินใจเลือกพาร์ติชันเป้าหมายเพื่อวางข้อความใด ๆ ขึ้นอยู่กับ:

  • ID พาร์ติชันถ้าระบุไว้ในข้อความ
  • พาร์ทิชันที่สำคัญ% numถ้าไม่มีการพูดถึง id พาร์ติชัน
  • ปัดเศษโรบินถ้าไม่มีID พาร์ติชันหรือคีย์ข้อความในข้อความหมายความว่ามีค่าเท่านั้น

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

คุณควรกำหนดค่าgroup.idเสมอเว้นแต่คุณจะใช้ API การมอบหมายอย่างง่ายและคุณไม่จำเป็นต้องจัดเก็บออฟเซ็ตใน Kafka มันจะไม่เป็นส่วนหนึ่งของกลุ่มใด ๆ แหล่ง

3. กลุ่มผู้บริโภคแต่ละกลุ่มมีพาร์ติชั่นที่เกี่ยวข้องในนายหน้าหรือแต่ละกลุ่มผู้บริโภคมีหนึ่งพาร์ติชั่นหรือไม่?

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

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

4. ในฐานะพาร์ติชันที่สร้างขึ้นโดยนายหน้าดังนั้นจึงไม่ต้องกังวลกับผู้บริโภค?

ผู้บริโภคควรทราบถึงจำนวนของพาร์ติชันตามที่กล่าวไว้ในคำถาม 3

5. เนื่องจากนี่คือคิวที่มีออฟเซ็ตสำหรับแต่ละพาร์ติชันเป็นความรับผิดชอบของผู้บริโภคที่จะระบุข้อความที่ต้องการอ่านหรือไม่? มันจำเป็นต้องบันทึกสถานะของมันหรือไม่?

Kafka (จะเฉพาะเจาะจงผู้ประสานงานกลุ่ม ) ดูแลของรัฐชดเชยโดยการผลิตข้อความไปยังภายใน__consumer_offsetsหัวข้อพฤติกรรมนี้สามารถกำหนดให้คู่มือเช่นกันโดยการตั้งค่าไปenable.auto.commit falseในกรณีดังกล่าวconsumer.commitSync()และconsumer.commitAsync()อาจเป็นประโยชน์สำหรับการจัดการออฟเซ็ต

เพิ่มเติมเกี่ยวกับผู้ประสานงานกลุ่ม :

  1. มันเป็นหนึ่งในโบรกเกอร์ที่ได้รับเลือกในคลัสเตอร์จากฝั่งเซิร์ฟเวอร์ Kafka
  2. ผู้บริโภคมีปฏิสัมพันธ์กับกลุ่มผู้ประสานงานเพื่อชดเชยการรับและส่งคำขอ
  3. ผู้บริโภคส่งการเต้นของหัวใจเป็นระยะไปยังผู้ประสานงานกลุ่ม

6. จะเกิดอะไรขึ้นเมื่อข้อความถูกลบออกจากคิว - ตัวอย่างเช่น: การเก็บรักษาเป็นเวลา 3 ชั่วโมงจากนั้นเวลาผ่านไปจะจัดการกับทั้งสองด้านได้อย่างไร

หากผู้บริโภคเริ่มต้นหลังจากระยะเวลาการเก็บข้อความจะถูกบริโภคตามการตั้งค่าซึ่งอาจจะเป็นauto.offset.reset latest/earliestในทางเทคนิคแล้วมันlatest(เริ่มการประมวลผลข้อความใหม่) เพราะข้อความทั้งหมดได้หมดอายุในเวลานั้นและการเก็บรักษาคือการกำหนดค่าระดับหัวข้อ


5
หวัดดี! ฉันเป็นผู้เขียนคำตอบที่ได้รับการยอมรับ แต่ฉันคิดว่าคุณก็ดีมากเช่นกันโดยเฉพาะอย่างยิ่งในจุดที่ 3 ซึ่งไดอะแกรมทำให้สิ่งต่าง ๆ ชัดเจนขึ้น 200%! คุณคิดว่าเราควรผสานหรือไม่
C4stor

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

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

1
@ g10guang: เป็นเพราะความยากลำบากในการบำรุงรักษาออฟเซ็ต
mrsrinivas

1
สถานการณ์อื่น คุณสามารถมีหนึ่งพาร์ติชันและผู้บริโภคหลายคนสมัครสมาชิก / มอบหมาย นายหน้าจะส่งมอบเรกคอร์ดไปยังผู้บริโภคที่ลงทะเบียนครั้งแรกเท่านั้น แต่สมมติว่าผู้บริโภครายแรกใช้เวลาในการประมวลผลงานมากกว่าช่วงเวลาโพล ปริมาณการใช้บันทึกไม่ได้มุ่งมั่นกับนายหน้า นายหน้าเข้าใจว่าผู้บริโภคอยู่ในสถานะแฮงเอาท์ ในสถานะนี้โบรกเกอร์จะทริกเกอร์การปรับสมดุลการส่งพาร์ติชันที่กำหนดใหม่ให้กับผู้บริโภคทั้งหมด ผู้บริโภครายอื่นได้รับข้อความอีกครั้งแม้ว่าจะยังอยู่ระหว่างการประมวลผลโดย C1 ระวัง.
Ruben Daddario

127

มาถ่ายกันตามลำดับ :)

1 - เมื่อผู้ผลิตสร้างข้อความ - มันจะระบุหัวข้อที่ต้องการส่งข้อความไปใช่ไหม? มันสนใจพาร์ติชั่นไหม?

ตามค่าเริ่มต้นผู้ผลิตไม่สนใจการแบ่งพาร์ติชัน คุณมีตัวเลือกในการใช้ตัวแบ่งพาร์ติชันแบบกำหนดเองเพื่อให้มีการควบคุมที่ดีกว่า แต่ก็เป็นตัวเลือกทั้งหมด


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

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


3 - กลุ่มผู้บริโภคแต่ละกลุ่มมีพาร์ติชั่นที่สอดคล้องกันในนายหน้าหรือแต่ละกลุ่มผู้บริโภคมีหนึ่งพาร์ติชั่นหรือไม่

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


4 - พาร์ติชันที่สร้างขึ้นโดยนายหน้าจึงไม่กังวลสำหรับผู้บริโภคหรือไม่

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


5 - เนื่องจากนี่เป็นคิวที่มีออฟเซ็ตสำหรับแต่ละพาร์ติชันเป็นความรับผิดชอบของผู้บริโภคที่จะระบุข้อความที่ต้องการอ่านหรือไม่? มันจำเป็นต้องบันทึกสถานะของมันหรือไม่?

ใช่ผู้บริโภคบันทึกออฟเซ็ตต่อหัวข้อต่อพาร์ติชัน สิ่งนี้ได้รับการจัดการโดยคาฟคาทั้งหมดไม่ต้องกังวลกับมัน


6 - จะเกิดอะไรขึ้นเมื่อข้อความถูกลบออกจากคิว - ตัวอย่างเช่น: การเก็บรักษาเป็นเวลา 3 ชั่วโมงจากนั้นเวลาผ่านไปจะจัดการกับทั้งสองด้านได้อย่างไร

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


3
Sry :) มันยากที่จะอธิบายกระบวนการคาฟคาทั้งหมดใน 500 ตัวอักษรผมขอแนะนำให้อ่านkafka.apache.org/documentation.html#theconsumer (และอาจเป็นส่วนที่เหลือของส่วนที่ 4 เกี่ยวกับคาฟคาภายใน) โดยทั่วไป: ผู้บริโภคร้องขอการบันทึกออฟเซ็ต แต่จะถูกบันทึกไว้ที่อื่น
C4stor

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

20

Kafka ใช้การคิดหัวข้อซึ่งจะนำคำสั่งมาสู่การส่งข้อความ

เพื่อความสมดุลในการโหลดหัวข้ออาจแบ่งออกเป็นหลายพาร์ติชันและทำซ้ำข้ามโบรกเกอร์

มีการจัดลำดับพาร์ติชันลำดับของข้อความที่ไม่สามารถเปลี่ยนได้ซึ่งต่อท้ายเช่นบันทึกการกระทำ

ข้อความในพาร์ติชันมีหมายเลขรหัสต่อเนื่องที่ระบุแต่ละข้อความภายในพาร์ติชัน

พาร์ติชันอนุญาตให้บันทึกของหัวข้อขยายเกินขนาดที่จะพอดีกับเซิร์ฟเวอร์เดียว (นายหน้า) และทำหน้าที่เป็นหน่วยของการขนาน

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

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

อธิบายได้ดีในบทความนี้: http://codeflex.co/what-is-apache-kafka/


พาร์ติชันเป็นเพียงสำหรับการโหลดหัวข้อ
g10guang

1
@ g10guang: พาร์ทิชันช่วยในการประมวลผลข้อความในแบบคู่ขนานเช่นกัน
mrsrinivas

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

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

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