อะไรคือสิ่งที่ผู้บริโภคกำหนดคาฟคาชดเชย


170

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

ตอนนี้พูดเช่นว่ามี 10 ข้อความ (ออฟเซ็ต 0 ถึง 9) ในหัวข้อและผู้บริโภคเกิดขึ้นที่จะกิน 5 ของพวกเขาก่อนที่มันจะลง (หรือก่อนที่ฉันจะฆ่าผู้บริโภค) จากนั้นบอกว่าฉันรีสตาร์ทกระบวนการผู้บริโภคนั้น คำถามของฉันคือ:

  1. ถ้าauto.offset.resetตั้งค่าsmallestเป็นมันจะเริ่มต้นการบริโภคจาก offset 0 เสมอหรือไม่

  2. ถ้าauto.offset.resetตั้งไว้ที่largestจะเริ่มบริโภคจาก offset 5 หรือไม่

  3. พฤติกรรมเกี่ยวกับสถานการณ์ประเภทนี้เป็นสิ่งกำหนดขึ้นมาเสมอหรือไม่?

โปรดอย่าลังเลที่จะแสดงความคิดเห็นหากสิ่งใดในคำถามของฉันไม่ชัดเจน ขอบคุณล่วงหน้า.

คำตอบ:


260

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

หากคุณใช้ผู้บริโภค java ระดับสูงให้จินตนาการถึงสถานการณ์ต่อไปนี้:

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

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

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

ทุกอย่างที่กล่าวถึงข้างต้นไม่เกี่ยวข้องSimpleConsumerและทุกครั้งที่คุณเรียกใช้มันจะเป็นตัวตัดสินว่าจะเริ่มต้นจากการใช้การauto.offset.resetกำหนดค่า

หากคุณใช้รุ่น Kafka เก่ากว่า 0.9 คุณต้องเปลี่ยนearliest, latestกับ, smallestlargest


3
ขอบคุณมากสำหรับคำตอบ ดังนั้นสำหรับผู้บริโภคระดับสูงเมื่อผู้บริโภคมีความมุ่งมั่น (ทั้งใน ZK หรือ Kafka) สิ่งที่auto.offset.resetไม่ได้มีความสำคัญหลังจากนั้น? ความสำคัญเพียงอย่างเดียวของการตั้งค่าคือเมื่อไม่มีอะไรเกิดขึ้น (และนึกคิดว่าจะเป็นการเริ่มต้นครั้งแรกของผู้บริโภค)?
Asif Iqbal

2
ตรงตามที่คุณอธิบาย
serejja

1
@serejja สวัสดี - แล้วถ้าฉันมีผู้บริโภค 1 คนต่อกลุ่มเสมอและสถานการณ์ # 1 ของคำตอบของคุณก็เกิดขึ้นกับฉัน มันจะเหมือนกันหรือไม่
ha9u63ar

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

@ serejja ใช่และนั่นไม่ได้ผลสำหรับฉัน คุณช่วยลองดูที่นี่ - นี่คือปัญหาของฉัน
ha9u63ar

82

เพียงแค่อัปเดต: จาก Kafka 0.9 ขึ้นไป Kafka ใช้เวอร์ชั่น Java ใหม่ของ consumer และชื่อพารามิเตอร์ auto.offset.reset มีการเปลี่ยนแปลง จากคู่มือ:

จะทำอย่างไรเมื่อไม่มีออฟเซ็ตเริ่มต้นใน Kafka หรือหากออฟเซ็ตปัจจุบันไม่มีอยู่อีกต่อไปบนเซิร์ฟเวอร์ (เช่นเนื่องจากข้อมูลนั้นถูกลบ):

เร็วที่สุด : รีเซ็ตออฟเซ็ตอัตโนมัติเป็นออฟเซ็ตแรกสุดโดยอัตโนมัติ

ล่าสุด : รีเซ็ตออฟเซ็ตเป็นออฟเซ็ตล่าสุดโดยอัตโนมัติ

ไม่มี : ส่งข้อยกเว้นไปยังผู้ใช้บริการหากไม่พบการชดเชยก่อนหน้านี้สำหรับกลุ่มผู้บริโภค

สิ่งอื่น: โยนข้อยกเว้นให้กับผู้บริโภค

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


9

ยิ่งไปกว่านั้นยังมีการชดเชย หากเวลาตั้งแต่คอมมิทล่าสุดคือ> offsets.retention.minutesก็auto.offset.resetเตะเข้า


1
ดูเหมือนจะไม่ซ้ำซ้อนกับการเก็บบันทึกหรือไม่ การเก็บรักษาที่กำหนดไว้ควรอยู่บนพื้นฐานของการเก็บบันทึกหรือไม่
mike01010

@ mike01010 ถูกต้อง ควรขึ้นอยู่กับการเก็บรักษาบันทึกซึ่งเป็นหนึ่งในโซลูชั่นที่เสนอในตั๋ว Prolong default value of offsets.retention.minutes to be at least twice larger than log.retention.hours. problems.apache.org/jira/browse/KAFKA-3806
saheb

คำตอบนั้นทำให้ฉันกลัวครู่หนึ่งจนกระทั่งฉันตรวจสอบเอกสารของoffsets.retention.minutes: <b> หลังจากกลุ่มผู้บริโภคสูญเสียผู้บริโภคทั้งหมด (เช่นว่างเปล่า) จะมีการหักกลบสำหรับช่วงเวลาการเก็บข้อมูลนี้ก่อนที่จะถูกทิ้ง </b> สำหรับแบบสแตนด์อโลน ผู้บริโภค (โดยใช้การกำหนดด้วยตนเอง) การชดเชยจะหมดอายุหลังจากเวลาที่กระทำครั้งสุดท้ายพร้อมกับระยะเวลาเก็บรักษานี้ (นี่ใช้สำหรับKafka 2.3)
jumping_monkey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.