मैं कुछ महीनों से काफ्का का उपयोग कर रहा हूं, और मैंने महसूस किया कि कुछ मूल अवधारणाएं मेरे लिए अभी तक स्पष्ट नहीं हैं। मेरा संदेह उपभोक्ता आईडी, समूह आईडी और ऑफसेट के बीच संबंध से संबंधित है। हमारे आवेदन में हमें प्रकाशित-सदस्यता प्रतिमान का उपयोग करके काम करने के लिए काफ्का की आवश्यकता है, इसलिए हम प्रत्येक उपभोक्ता के लिए अलग-अलग समूह आईडी का उपयोग करते हैं, जो बेतरतीब ढंग से उत्पन्न होते हैं।

मैं सोचता था कि सेटिंग auto.offset.reset = latest मेरे उपभोक्ताओं को हमेशा वे संदेश प्राप्त होंगे जो उन्हें अभी तक प्राप्त नहीं हुए हैं, लेकिन हाल ही में मैंने सीखा है ऐसा नहीं है। यह तभी काम करता है जब उपभोक्ता ने अभी तक ऑफसेट नहीं किया है। किसी भी अन्य मामले में, उपभोक्ता को उसके द्वारा किए गए अंतिम ऑफ़सेट से अधिक ऑफ़सेट वाले संदेश प्राप्त होते रहेंगे।

चूंकि मैं हमेशा यादृच्छिक समूह आईडी के साथ नए उपभोक्ता बनाता हूं, मुझे एहसास हुआ कि मेरे उपभोक्ताओं के पास "कोई स्मृति नहीं है", वे नए उपभोक्ता हैं और उनके पास कभी भी ऑफसेट प्रतिबद्ध नहीं होगा, इसलिए auto.offset.reset = latest नीति हमेशा लागू होगी। और यहीं से मेरी शंका शुरू होती है। निम्न परिदृश्य मान लें:

  1. मेरे पास दो क्लाइंट एप्लिकेशन, ए और बी हैं, प्रत्येक एक उपभोक्ता के साथ, प्रकाशन में काम कर रहा है - सदस्यता लें (इस प्रकार, विभिन्न समूह आईडी के साथ)। दोनों उपभोक्ता my-topic विषय के सदस्य हैं। दोनों उपभोक्ताओं के लिए auto.offset.resetसेटिंग latest है।
  2. कुछ निर्माता (या निर्माता) my-topic विषय पर संदेश M1, M2 और M3 प्रकाशित करते हैं।
  3. A और B दोनों को M1, M2 और M3 प्राप्त होता है।
  4. अब मैंने एप्लिकेशन बी को बंद कर दिया है।
  5. निर्माता संदेश M4 और M5 का उत्पादन करते हैं।
  6. एप्लिकेशन A को M4 और M5 संदेश प्राप्त होते हैं।
  7. अब मैं एप्लिकेशन बी को पुनरारंभ करता हूं। याद रखें, groupId यादृच्छिक है, और मैं कोई उपभोक्ता आईडी सेट नहीं कर रहा हूं, इसका मतलब है कि यह एक नया उपभोक्ता है (दाएं?) एप्लिकेशन बी को कोई संदेश नहीं मिलता है।
  8. निर्माता संदेश M6 और M7 प्रकाशित करते हैं।
  9. A और B दोनों एप्लिकेशन M6 और M7 संदेश प्राप्त करते हैं।

तो, संक्षेप में, यदि मैं गलत नहीं हूं, तो A को सभी संदेश प्राप्त होते हैं लेकिन B ने M4 और M5 को याद किया है। मैंने इसे kafka-console-consumer.sh के साथ आजमाया है और यह इस तरह से व्यवहार करता है।

तो, मैं एप्लिकेशन बी को बंद होने के दौरान प्रकाशित संदेशों को कैसे प्राप्त कर सकता हूं? मैं अब अगर मैं इसे उसी समूह आईडी को असाइन करना शुरू करता हूं जब इसे मूल रूप से शुरू किया गया था, तो यह संदेश एम 4 और एम 5 पढ़ेगा, लेकिन वह समूह आईडी सेट कर रहा है। क्या उपभोक्ता आईडी भी सेट करना संभव है, और वही व्यवहार प्राप्त करना संभव है?

या दूसरे तरीके से कहें तो, एक ही उपभोक्ता को फिर से शुरू करने से क्या समझा जाता है? दो उपभोक्ता एक ही उपभोक्ता हैं यदि उनके पास एक ही समूह आईडी, एक ही उपभोक्ता आईडी, दोनों हैं?

वैसे, ConsumerId और संपत्ति client.id समान हैं?

4
joanlofe 16 मई 2019, 19:15

2 जवाब

सबसे बढ़िया उत्तर

दो उपभोक्ता एक ही समूह में हैं यदि उनकी group.id सेटिंग समान है।

मुझे पूरा यकीन नहीं है कि consumerId से आपका क्या मतलब है। काफ्का 2.2 के अनुसार, उपभोक्ता विन्यास में ऐसा कोई क्षेत्र मौजूद नहीं है।

यदि आप client.id के बारे में बात कर रहे हैं, तो इस सेटिंग का कोई कार्यात्मक प्रभाव नहीं है, इसका उपयोग केवल अनुरोधों को टैग करने के लिए किया जाता है ताकि जरूरत पड़ने पर ब्रोकर के लॉग में उनका मिलान किया जा सके।

जब आप किसी उपभोक्ता को auto.offset.reset=latest के साथ चलाते हैं, यदि कोई प्रतिबद्ध ऑफसेट मौजूद नहीं है, तो उपभोक्ता लॉग के अंत से उपभोग करना शुरू कर देगा। तो यह केवल उन संदेशों को प्राप्त करेगा जो इसके प्रारंभ होने के बाद उत्पन्न होते हैं। तो आपके परिदृश्य में, आप सही हैं, यह कभी भी M4 और M5 प्राप्त नहीं करेगा।

यदि आप सभी संदेशों का उपभोग करना चाहते हैं, तो आपको वही group.id रखना होगा। उस स्थिति में, auto.offset.reset केवल पहली बार उपभोक्ता के शुरू होने पर ही लागू होगा। इस तरह, जब आपका उपभोक्ता पुनरारंभ होता है, तो वह वहीं से शुरू होगा जहां वह रुका था।

8
Mickael Maison 16 मई 2019, 18:05

ऐसा इसलिए है क्योंकि आप auto.offset.reset = latest . सेट कर रहे हैं

उपभोक्ता के दौरान भेजा गया कोई भी संदेश जो चालू नहीं है और उपभोक्ता द्वारा संसाधित नहीं किया जाएगा।

तो बी दो संदेशों को याद करेगा

0
Arunasalam Govindasamy 30 अक्टूबर 2020, 11:15