कफका विषय और विभाजन को समझना


185

मैं उद्यम समाधान उद्देश्यों के लिए काफ्का सीखना शुरू कर रहा हूं।

मेरे पढ़ने के दौरान, कुछ प्रश्न मेरे दिमाग में आए:

  1. जब एक निर्माता एक संदेश का उत्पादन कर रहा है - यह उस विषय को निर्दिष्ट करेगा जिसे वह संदेश भेजना चाहता है, क्या यह सही है? क्या यह विभाजन के बारे में परवाह करता है?
  2. जब कोई सब्सक्राइबर चल रहा होता है - तो क्या वह अपने ग्रुप आईडी को निर्दिष्ट करता है ताकि वह उसी विषय के उपभोक्ताओं के समूह का हिस्सा बन सके, या कई ऐसे विषय जो उपभोक्ताओं के इस समूह में रुचि रखते हैं?
  3. क्या प्रत्येक उपभोक्ता समूह का दलाल पर एक समान विभाजन है या प्रत्येक उपभोक्ता के पास एक है?

  4. क्या ब्रोकर द्वारा विभाजन किए गए हैं, और इसलिए उपभोक्ताओं के लिए चिंता का विषय नहीं है?

  5. चूंकि यह प्रत्येक विभाजन के लिए एक ऑफसेट के साथ एक कतार है, क्या यह उपभोक्ता की जिम्मेदारी है कि वह यह निर्दिष्ट करे कि वह कौन से संदेश पढ़ना चाहता है? क्या इसके राज्य को बचाने की जरूरत है?

  6. जब कोई संदेश कतार से हटा दिया जाता है तो क्या होता है? - उदाहरण के लिए: प्रतिधारण 3 घंटे के लिए था, फिर समय बीत जाता है, दोनों तरफ से ऑफसेट को कैसे नियंत्रित किया जाता है?

जवाबों:


162

इस पोस्ट में पहले से ही उत्तर हैं, लेकिन मैं काफ्का डेफिनिटिव गाइड की कुछ तस्वीरों के साथ अपना विचार जोड़ रहा हूं

प्रत्येक प्रश्न का उत्तर देने से पहले, आइए निर्माता घटकों का अवलोकन करें:

निर्माता घटकों का अवलोकन

1. जब एक निर्माता एक संदेश का उत्पादन कर रहा है - यह उस विषय को निर्दिष्ट करेगा जिसे वह संदेश भेजना चाहता है, क्या यह सही है? क्या यह विभाजन के बारे में परवाह करता है?

निर्माता किसी भी संदेश को रखने के लिए लक्ष्य विभाजन का निर्णय करेगा, जो इस पर निर्भर करता है:

  • विभाजन आईडी, यदि यह संदेश के भीतर निर्दिष्ट है
  • कुंजी% संख्या विभाजन , यदि कोई विभाजन आईडी का उल्लेख नहीं किया गया है
  • राउंड रॉबिन अगर न तो विभाजन आईडी और न ही संदेश कुंजी संदेश में उपलब्ध हैं, जिसका अर्थ केवल मूल्य उपलब्ध है

2. जब कोई ग्राहक चल रहा होता है - तो क्या वह अपना ग्रुप आईडी निर्दिष्ट करता है ताकि वह उसी विषय के उपभोक्ताओं या कई विषयों के समूह का हिस्सा हो सके जिसमें उपभोक्ताओं का यह समूह रुचि रखता है?

आपको हमेशा group.id को कॉन्फ़िगर करना चाहिए जब तक कि आप साधारण असाइनमेंट API का उपयोग नहीं कर रहे हैं और आपको Kafka में ऑफ़सेट स्टोर करने की आवश्यकता नहीं है। यह किसी समूह का हिस्सा नहीं होगा। स्रोत

3. क्या प्रत्येक उपभोक्ता समूह का दलाल पर एक समान विभाजन है या प्रत्येक उपभोक्ता के पास एक है?

एक उपभोक्ता समूह में, प्रत्येक विभाजन को केवल एक उपभोक्ता द्वारा संसाधित किया जाएगा । ये संभावित परिदृश्य हैं

  • उपभोक्ताओं की संख्या इससे कम है संख्या विषय विभाजन की संख्या तो समूह में कई विभाजनों में से एक को उपभोक्ता को सौंपा जा सकता है विषय विभाजन से कम उपभोक्ताओं की संख्या
  • उपभोक्ताओं की संख्या समान विषय विभाजन की संख्या के रूप में, तो विभाजन और उपभोक्ता मानचित्रण, नीचे की तरह हो सकता है विषय विभाजन की संख्या के समान उपभोक्ताओं की संख्या
  • उपभोक्ताओं की संख्या विषय विभाजन की संख्या से अधिक है , फिर विभाजन और उपभोक्ता मानचित्रण को नीचे देखा जा सकता है, प्रभावी नहीं, उपभोक्ता की जाँच करें 5 विषय विभाजन की संख्या से अधिक उपभोक्ताओं की संख्या

4. ब्रोकर द्वारा बनाए गए विभाजन के रूप में, इसलिए उपभोक्ताओं के लिए चिंता का विषय नहीं है?

उपभोक्ता को विभाजन की संख्या के बारे में पता होना चाहिए , जैसा कि प्रश्न 3 में चर्चा की गई थी।

5. चूंकि यह प्रत्येक विभाजन के लिए एक ऑफसेट के साथ एक कतार है, क्या यह उपभोक्ता की जिम्मेदारी है कि वह यह बताए कि वह कौन से संदेश पढ़ना चाहता है? क्या इसके राज्य को बचाने की जरूरत है?

Kafka (विशिष्ट समूह समन्वयक होने के लिए ) आंतरिक __consumer_offsets विषय पर एक संदेश का उत्पादन करके ऑफ़सेट स्थिति का ध्यान रखता है , यह व्यवहार मैन्युअल रूप से और साथ ही सेटिंग द्वारा कॉन्फ़िगर किया जा सकता enable.auto.commitहै false। उस स्थिति में consumer.commitSync()और consumer.commitAsync()ऑफसेट के प्रबंधन के लिए सहायक हो सकता है।

समूह समन्वयक के बारे में अधिक जानकारी :

  1. यह काफ्का सर्वर साइड से क्लस्टर में चुने गए ब्रोकर में से एक है।
  2. उपभोक्ताओं ने ऑफसेट और प्राप्त अनुरोधों के लिए समूह समन्वयक के साथ बातचीत की।
  3. उपभोक्ता समूह समन्वयक को समय-समय पर दिल की धड़कन भेजता है।

6. जब कतार से कोई संदेश हटा दिया जाता है तो क्या होता है? - उदाहरण के लिए: प्रतिधारण 3 घंटे के लिए था, फिर समय बीत जाता है, दोनों तरफ से ऑफसेट को कैसे नियंत्रित किया जाता है?

यदि कोई भी उपभोक्ता अवधारण अवधि के बाद शुरू होता है, तो संदेशों को auto.offset.resetकॉन्फ़िगरेशन के अनुसार खपत किया जाएगा जो हो सकता है latest/earliest। तकनीकी रूप से यह latest(नए संदेशों को संसाधित करना शुरू) है क्योंकि उस समय तक सभी संदेश समाप्त हो गए थे और अवधारण विषय स्तर कॉन्फ़िगरेशन है।


5
नमस्ते ! मैं स्वीकृत उत्तर का लेखक हूं, लेकिन मुझे लगता है कि आपका वास्तव में बहुत अच्छा है, विशेष रूप से बिंदु संख्या 3 पर जहां चित्र 200% स्पष्ट करते हैं! क्या आपको लगता है कि हमें विलय करना चाहिए?
C4stor

मेरा मतलब था कि मैं (या आप) अपने जवाब के तत्वों को खान में शामिल कर सकता हूं, ताकि उन्हें अधिक दृश्यता मिल सके और (वर्तमान में) शीर्ष उत्तर में सुधार हो सके। लेकिन मैं यह आपके समझौते के बिना नहीं होगा!
C4stor

एक विभाजन के लिए मल्टी कंज्यूमर को मैप क्यों नहीं किया जा सकता है? संदेश सुनिश्चित करने के लिए सिर्फ एक बार के लिए प्रक्रिया? अपने उत्तर के लिए Thx।
g10guang

1
@ g10guang: यह ऑफ़सेट रखरखाव में कठिनाई के कारण है ।
श्रीनिवास

1
एक और परिदृश्य। आपके पास एक विभाजन हो सकता है और MULTIPLE उपभोक्ता इसे सब्सक्राइब / असाइन कर सकते हैं। दलाल केवल पहले पंजीकृत उपभोक्ता को रिकॉर्ड वितरित करेगा। लेकिन मान लें कि पहले उपभोक्ता को मतदान के अंतराल की तुलना में कार्य को संसाधित करने में अधिक समय लगता है। रिकॉर्ड की खपत ब्रोकर को नहीं दी जाती है। दलाल समझता है कि उपभोक्ता ने बाहर लटका दिया। इस स्थिति में, ब्रोकर अपने सभी उपभोक्ताओं को नए असाइन किए गए विभाजन भेजने के लिए एक रिबैलेंसिंग चलाता है। यह संदेश किसी अन्य उपभोक्ता द्वारा फिर से उपभोग किया जाता है, भले ही यह अभी भी C1 द्वारा संसाधित किया जा रहा हो। सावधान रहे।
रुबेन दद्दारियो

127

चलो उन आदेश में ले :)

1 - जब एक निर्माता एक संदेश का उत्पादन कर रहा है - यह उस विषय को निर्दिष्ट करेगा जिसे वह संदेश भेजना चाहता है, क्या यह सही है? क्या यह विभाजन के बारे में परवाह करता है?

डिफ़ॉल्ट रूप से, निर्माता विभाजन के बारे में परवाह नहीं करता है। आपके पास बेहतर नियंत्रण के लिए अनुकूलित पार्टीशनर का उपयोग करने का विकल्प है, लेकिन यह पूरी तरह से वैकल्पिक है।


2 - जब कोई ग्राहक चल रहा होता है - तो क्या वह अपना ग्रुप आईडी निर्दिष्ट करता है ताकि वह एक ही विषय के उपभोक्ताओं या कई विषयों के समूह का हिस्सा हो सके जिसमें उपभोक्ताओं का यह समूह रुचि रखता है?

हां, उपभोक्ताओं को लोड साझा करने के लिए एक उपभोक्ता समूह में शामिल (या यदि वे अकेले हैं) बनाते हैं। एक ही समूह के दो उपभोक्ता कभी भी एक ही संदेश प्राप्त नहीं करेंगे।


3 - क्या प्रत्येक उपभोक्ता समूह का दलाल पर एक समान विभाजन है या प्रत्येक उपभोक्ता के पास एक है?

न तो। एक उपभोक्ता समूह में सभी उपभोक्ताओं को दो शर्तों के तहत विभाजन का एक सेट सौंपा गया है: एक ही समूह में दो उपभोक्ताओं के पास कोई भी विभाजन नहीं है - और एक पूरे के रूप में उपभोक्ता समूह को हर मौजूदा विभाजन सौंपा गया है।


4 - क्या ब्रोकर द्वारा विभाजन किए गए हैं, इसलिए उपभोक्ताओं के लिए चिंता का विषय नहीं है?

वे नहीं हैं, लेकिन आप 3 से देख सकते हैं कि मौजूदा विभाजन की तुलना में अधिक उपभोक्ताओं के लिए यह पूरी तरह से बेकार है, इसलिए यह उपभोग के लिए आपका अधिकतम समानता स्तर है।


5 - चूंकि यह प्रत्येक विभाजन के लिए एक ऑफसेट के साथ एक कतार है, क्या यह उपभोक्ता की जिम्मेदारी है कि वह यह निर्दिष्ट करे कि वह कौन से संदेश पढ़ना चाहता है? क्या इसके राज्य को बचाने की जरूरत है?

हां, उपभोक्ता प्रति विषय प्रति ऑफसेट एक बचत करते हैं। यह पूरी तरह से काफ्का द्वारा संचालित है, इसके बारे में कोई चिंता नहीं है।


6 - जब कतार से कोई संदेश हटा दिया जाता है तो क्या होता है? - उदाहरण के लिए: प्रतिधारण 3 घंटे के लिए था, फिर समय बीत जाता है, दोनों तरफ से ऑफसेट को कैसे नियंत्रित किया जाता है?

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


3
Sry :) यह पूरी तरह से 500 वर्णों के बक्से में कफ़्का प्रक्रिया को समझाने के लिए कठिन है, मैं सुझाव देता हूं कि kafka.apache.org/documentation.html#theconsumer (और शायद अनुभाग 4 के बाकी हिस्से, कफ़्का नहरों के बारे में) पढ़ें। मूल रूप से: उपभोक्ता ऑफ़सेट सहेजने का अनुरोध करते हैं, लेकिन वे कहीं और सहेजे जाते हैं।
C4stor

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

20

काफ्का टॉपिक गर्भाधान का उपयोग करता है जो संदेश प्रवाह में आदेश लाने के लिए आता है।

लोड को संतुलित करने के लिए, एक विषय को कई विभाजनों में विभाजित किया जा सकता है और दलालों में दोहराया जा सकता है।

विभाजन का आदेश दिया जाता है, संदेशों के अपरिवर्तनीय अनुक्रम जो लगातार जोड़े जाते हैं यानी एक कमिट लॉग।

विभाजन में संदेशों में क्रमिक आईडी संख्या होती है जो विभाजन के भीतर प्रत्येक संदेश को विशिष्ट रूप से पहचानती है।

विभाजन एक विषय के लॉग को एक आकार से परे स्केल करने की अनुमति देता है जो एकल सर्वर (एक दलाल) पर फिट होगा और समानता की इकाई के रूप में कार्य करेगा।

किसी विषय के विभाजन को काफ्का समूह में दलालों के ऊपर वितरित किया जाता है, जहाँ प्रत्येक दलाल विभाजन के एक हिस्से के लिए डेटा और अनुरोधों को संभालता है।

प्रत्येक विभाजन को दलालों के एक विन्यास संख्या में भर दिया जाता है ताकि गलती सहनशीलता का बीमा किया जा सके।

इस लेख में अच्छी तरह से समझाया गया है: http://codeflex.co/what-is-apache-kafka/


क्या विभाजन केवल विषय भार संतुलन के लिए है?
g10guang

1
@ g10guang: विभाजन संदेश को समानांतर में भी संसाधित करने में मदद करता है।
मृगिनिवास

कृपया मुझे सही करें अगर मैं गलत हूं, जब एक निर्माता द्वारा एक संदेश भेजा जाता है और जब यह विषय में आता है, तो यह इसे कॉन्फ़िगरेशन के अनुसार विभाजन में कॉपी करता है और फिर उपभोक्ता इसका उपभोग करता है। सही?
अतुल

1
@ संदेश वर्तमान विभाजनकर्ता कॉन्फ़िगरेशन के अनुसार उस विषय के लिए विभाजन के 1 में संलग्न हो जाएगा (संदेश कुंजी के हैश को डिफ़ॉल्ट रूप से निर्धारित करता है कि संदेश किस विभाजन में जाता है), और हां, एक उपभोक्ता संदेश को उठाएगा। यह उस विभाजन के संदेशों का उपभोग करता है
केविन हुक

@ केविन हुक, स्पष्टीकरण के लिए धन्यवाद और मेरी समझ को साफ करने के लिए।
अतुल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.