क्या काफ्का उपभोक्ता ऑफसेट निर्धारित करता है?


169

मैं काफ्का के लिए अपेक्षाकृत नया हूं। मैंने इसके साथ थोड़ा सा प्रयोग किया है, लेकिन उपभोक्ता ऑफसेट के बारे में कुछ बातें मेरे लिए अस्पष्ट हैं। अब तक जो मैंने समझा है, जब कोई उपभोक्ता शुरू होता है, तो जिस ऑफसेट से वह पढ़ना शुरू करेगा, वह कॉन्फ़िगरेशन सेटिंग से निर्धारित होता है auto.offset.reset(यदि मैं गलत हूं तो मुझे सही करें)।

अब उदाहरण के लिए कहें कि विषय में 10 संदेश (ऑफसेट 0 से 9) हैं, और एक उपभोक्ता घटित होने से पहले उनमें से 5 का उपभोग करने के लिए हुआ (या इससे पहले कि मैंने उपभोक्ता को मार दिया)। फिर कहते हैं कि मैं उस उपभोक्ता प्रक्रिया को पुनः आरंभ करता हूं। मेरे प्रश्न हैं:

  1. यदि auto.offset.resetसेट किया गया है smallest, तो क्या यह हमेशा ऑफसेट 0 से खपत शुरू करने वाला है?

  2. यदि auto.offset.resetसेट किया गया है largest, तो क्या यह ऑफसेट 5 से खपत शुरू करने जा रहा है?

  3. क्या इस तरह के परिदृश्य के संबंध में व्यवहार हमेशा निर्धारक होता है?

यदि मेरे प्रश्न में कुछ भी अस्पष्ट है, तो कृपया टिप्पणी करने में संकोच न करें। अग्रिम में धन्यवाद।

जवाबों:


260

यह आपके द्वारा वर्णित से थोड़ा अधिक जटिल है। में ही यदि आपके उपभोक्ता समूह एक वैध ऑफसेट प्रतिबद्ध कहीं नहीं है config किक (2 समर्थित ऑफसेट भंडार अब काफ्का और Zookeeper कर रहे हैं), और यह भी कि क्या उपभोक्ता की तरह आप का उपयोग पर निर्भर करता है।
auto.offset.reset

यदि आप एक उच्च-स्तरीय जावा उपभोक्ता का उपयोग करते हैं तो निम्नलिखित परिदृश्यों की कल्पना करें:

  1. आपके पास एक उपभोक्ता समूह में एक उपभोक्ता group1है जिसने 5 संदेशों का उपभोग किया है और मर गया है। अगली बार जब आप इस उपभोक्ता को शुरू करते हैं तो यह उस auto.offset.resetकॉन्फिगर का उपयोग भी नहीं करेगा और यह उस स्थान से जारी रहेगा जहां इसकी मृत्यु हुई थी क्योंकि यह केवल ऑफ़सेट स्टोरेज (काफका या जेडके जैसा कि मैंने उल्लेख किया है) से संग्रहित ऑफसेट लाएगा।

  2. आपके पास एक विषय (जैसे आप वर्णित) में संदेश हैं और आप एक नए उपभोक्ता समूह में एक उपभोक्ता शुरू करते हैं group2। कहीं भी कोई संग्रहित नहीं किया गया है और इस बार यह auto.offset.resetविन्यास तय करेगा कि विषय की शुरुआत ( earliest) या विषय के अंत से शुरू की जाए ( latest)

ऑफसेट मूल्य के अनुरूप earliestऔर प्रभावित करने वाली एक और चीज latestलॉग प्रतिधारण नीति है। कल्पना करें कि आपके पास 1 घंटे के लिए कॉन्फ़िगर किए गए अवधारण के साथ एक विषय है। आप 5 संदेशों का उत्पादन करते हैं, और फिर एक घंटे बाद आप 5 और संदेश पोस्ट करते हैं। latestऑफसेट अभी भी पिछले उदाहरण में के रूप में ही रहेगी, लेकिन earliestएक होने में सक्षम नहीं होगा 0क्योंकि काफ्का पहले से ही इन संदेशों और इस तरह जल्द से जल्द उपलब्ध ऑफसेट किया जाएगा निकाल देंगे 5

ऊपर उल्लिखित सब कुछ संबंधित नहीं है SimpleConsumerऔर हर बार जब आप इसे चलाते हैं, तो यह तय करेगा कि auto.offset.resetकॉन्फ़िगरेशन का उपयोग करना कहां से शुरू करना है ।

आप काफ्का संस्करण 0.9 से अधिक उम्र का उपयोग करते हैं, तो आप को बदलने के लिए earliest, latestके साथ smallest, largest


3
उत्तर के लिए बहुत बहुत धन्यवाद। इसलिए उच्च स्तर के उपभोक्ता के लिए, एक बार किसी उपभोक्ता ने (या तो जेडके या काफ्का में) कुछ किया है, auto.offset.resetउसके बाद उसका कोई महत्व नहीं है? उस सेटिंग का एकमात्र महत्व यह है कि जब कुछ भी प्रतिबद्ध नहीं है (और आदर्श रूप से उपभोक्ता के पहले स्टार्ट-अप पर होगा)?
आसिफ़ इक़बाल

2
जैसा कि आपने बताया
serejja

1
@serejja नमस्कार - अगर मेरे पास हमेशा 1 उपभोक्ता-प्रति-समूह है, और आपके जवाब का # 1 अंक मेरे पास होता है? क्या यह वही होगा?
21955 पर ha9u63ar

1
@ ha9u63ar ने आपके प्रश्न को काफी नहीं समझा। यदि आप अपने उपभोक्ता को उसी समूह में फिर से शुरू करते हैं, तो हाँ, यह उपयोग नहीं करेगा auto.offset.resetऔर प्रतिबद्ध ऑफसेट से जारी रहेगा। यदि आप हमेशा विभिन्न उपभोक्ता समूह का उपयोग करते हैं (जैसे उपभोक्ता को शुरू करते समय इसे उत्पन्न करते हैं), तो उपभोक्ता हमेशा सम्मान करेगाauto.offset.reset
serejja

@serejja हाँ और यह मेरे लिए काम नहीं कर रहा है। क्या आप इस पर एक नज़र डाल सकते हैं - यह मेरा मुद्दा है
ha9u63ar

82

बस एक अपडेट: काफ्का 0.9 और आगे से, काफ्का उपभोक्ता के एक नए जावा संस्करण का उपयोग कर रहा है और auto.offset.reset पैरामीटर नाम बदल गए हैं; मैनुअल से:

जब काफ़्का में कोई प्रारंभिक ऑफ़सेट नहीं होता है या क्या करना है, यदि सर्वर पर करंट ऑफ़सेट मौजूद नहीं है (जैसे कि डेटा हटा दिया गया है):

जल्द से जल्द : स्वचालित रूप से जल्द से जल्द ऑफसेट को रीसेट करें

नवीनतम : स्वचालित रूप से नवीनतम ऑफसेट को ऑफसेट रीसेट करें

कोई नहीं : उपभोक्ता के अपवाद को फेंक दें यदि उपभोक्ता के समूह के लिए कोई पिछली ऑफसेट नहीं मिली है

कुछ और: उपभोक्ता के लिए अपवाद फेंक।

मैंने स्वीकृत उत्तर की जांच करने के बाद इसे खोजने के लिए कुछ समय बिताया, इसलिए मुझे लगा कि समुदाय के लिए इसे पोस्ट करना उपयोगी हो सकता है।


9

इसके अलावा अधिक offsets.retention.minutes है। यदि अंतिम प्रतिबद्ध होने के बाद का समय> है 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. issues.apache.org/jira/browse/KAFKA-3806
साहेब

उस उत्तर ने मुझे कुछ समय के लिए डरा दिया, जब तक कि मैं इसके दस्तावेज़ीकरण की जांच नहीं करताoffsets.retention.minutes : <b> एक उपभोक्ता समूह द्वारा अपने सभी उपभोक्ताओं को खो देने के बाद (यानी खाली हो जाता है) इसके ऑफसेट को त्यागने से पहले इस अवधारण अवधि के लिए रखा जाएगा। </ b> स्टैंडअलोन के लिए उपभोक्ताओं (मैनुअल असाइनमेंट का उपयोग करते हुए), ऑफ़सेट को अंतिम प्रतिबद्ध समय के बाद इस अवधारण अवधि के बाद समाप्त किया जाएगा। (यह उस के लिए है Kafka 2.3)
जंपिंग_मोन्टेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.