2016-11-11 13 views
6

मुझे कफका में लोड संतुलन के साथ एक प्रश्न का सामना करना पड़ा। इसलिए, मैंने 10 विभाजन के साथ एक विषय बनाया और 2 उपभोक्ताओं को बनाया। 10 विभाजनों को विभाजित किया गया था और इन उपभोक्ताओं को सौंपा गया था (5 विभाजन पहले और 5 से दूसरे तक) और यह ठीक काम करता है। कभी-कभी पहले उपभोक्ता काम करता है, कभी-कभी दूसरा।कैसे कफका विभाजन विभाजन को संतुलित करता है?

लेकिन एक पल में हम एक स्थिति का सामना कर सकते हैं जब उदाहरण के लिए दूसरे उपभोक्ता को एक संदेश प्राप्त होता है और इस संदेश को संभालने में समय लगता है (उदाहरण के लिए 10 मिनट)।

तो, मेरा सवाल यह है कि कैसे कफका निर्णय लेगा कि कौन सा विभाजन संदेश संग्रहीत करता है?

इस मामले में राउंड रॉबिन मुझे लगता है कि यह एक अच्छा विचार नहीं है, क्योंकि दूसरे उपभोक्ता द्वारा प्रबंधित किए गए विभाजन में संदेश तब तक संभाले नहीं जाएंगे जब तक कि दूसरा उपभोक्ता लंबे काम को पूरा नहीं कर लेता।

अपडेटेड!

@ मिलन बरन के जवाब के अनुसार, लोड निर्माता के पक्ष में संतुलित है। लेकिन इस मामले में, भले ही हम कस्टम Partitioner प्राप्ति प्रदान करते हैं, फिर भी यह वही समस्या होगी जो कि संदेश में संग्रहीत संदेश जो लंबे समय तक काम कर रहे उपभोक्ता को सौंपा गया था, इस उपभोक्ता तक संसाधित नहीं किया जाएगा अपने दीर्घकालिक काम को खत्म करता है।

हो सकता है कि अतिरिक्त लोड बैलेंसर कहीं और हो?

+0

आप और अधिक उपभोक्ताओं को क्यों नहीं चलाते? यदि आप 10 उपभोक्ताओं को शुरू करते हैं तो जब कोई लंबे समय तक व्यस्त रहता है तो आपके पास अभी भी 9 अन्य विभाजनों में डेटा को प्रोसेस करना पड़ता है। –

+0

लेकिन 10 के विभाजन में सभी संदेश संसाधित होने तक संसाधित नहीं होते हैं। समस्या –

+0

क्या आप एक कस्टम विभाजनकर्ता लिख ​​सकते हैं जो लंबे समय तक चलने वाले संदेशों को समर्पित विभाजन में रखता है ताकि शेष छोटे हिस्सों को विभाजन और शेष विभाजन में संसाधित किया जा सके? –

उत्तर

2

सहायता के लिए सभी को धन्यवाद। लेकिन मुझे अपने प्रश्न का उत्तर मिला।

  1. उपभोक्ताओं "राउंड रोबिन" या "रेंज" एल्गोरिदम उपयोग किया जाता है के लिए विभाजन सौंपने के लिए: तो सब से पहले, वहाँ कम से कम 3 स्थानों पर जहां काफ्का लोड संतुलन कर रहे हैं। इसे partition.assignment.strategy संपत्ति सेट करके कॉन्फ़िगर किया जा सकता है। डिफ़ॉल्ट सीमा से प्रयोग किया जाता है।
  2. निर्माता स्तर पर संदेश संग्रहीत करने के लिए विभाजन का चयन करने के लिए एक रणनीति लागू की जा सकती है। यह partitioner.class
  3. और मेरे प्रश्न का उत्तर द्वारा किया जा सकता है। यदि एक उपभोक्ता लंबे समय तक संदेश संदेश संसाधित करता है, तो काफ़का सोचता है कि यह उपभोक्ता मर चुका है और अन्य उपभोक्ताओं के बीच विभाजन को पुन: असाइन करता है। तो जब उपभोक्ता द्वारा लंबे समय तक नौकरी की जाती है, तो इसमें कोई विभाजन नहीं दिया जाता है। जब उपभोक्ता लंबे समय तक काम करता है तो विभाजन विभाजन को पर फिर से सौंपा जाएगा। और कोई संदेश लंबित नहीं होगा।
2

निर्णय जो विभाजन का उपयोग किया जाना चाहिए, कफका तक नहीं है, लेकिन निर्माता को संदेश भेजने का निर्णय लेना है। https://kafka.apache.org/documentation#producerconfigs

देखें कि आप किस विभाजन को चुनने के लिए एक विभाजन वर्ग प्रदान कर सकते हैं।

partitioner.class
विभाजनर वर्ग कि विभाजनर इंटरफ़ेस लागू करता है। org.apache.kafka.clients.producer.internals.DefaultPartitioner

DefaultPartitioner रणनीति

/** 
* The default partitioning strategy: 
* <ul> 
* <li>If a partition is specified in the record, use it 
* <li>If no partition is specified but a key is present choose a partition based on a hash of the key 
* <li>If no partition or key is present choose a partition in a round-robin fashion 
*/ 
+0

आपका उत्तर अच्छा है, लेकिन मुझे लगता है कि कुछ अतिरिक्त जगह है जहां लोड संतुलित है। आपके उत्तर के अनुसार ऐसा लगता है कि विभाजन में संग्रहीत संदेश को संसाधित करने का कोई तरीका नहीं है जो कि उपभोक्ता को सौंपा गया था जो दीर्घकालिक कार्य कर रहा है। –

+0

आपका दीर्घकालिक कार्य क्या था? क्या आपने उपभोक्ताओं के लिए अलग समूह.आईडी सेट की है? या उपभोक्ता पढ़ने के रूप में आप उसी थ्रेड में संदेशों को संसाधित करते हैं। उदाहरण के लिए आपको fast_msg, fast_msg, fast_msg, slow_msg, fast_msg प्राप्त होगा और आप slow_msg पर फंस जाएंगे और अगले fast_msg नहीं प्राप्त कर सकते हैं? यदि यह मामला इन संदेशों या अक्का-धाराओं को संसाधित करने के समानांतरता का उपयोग करता है। –

+0

संदेशों को प्राप्त करने और संसाधित करने के लिए विभिन्न धागे का उपयोग करने से अतिरिक्त समस्या होगी: मेरे पास slow_msg fast_msg1 fast_msg2 fast_msg3 है, धीमी_एमएसजी अभी भी प्रसंस्करण होने पर स्थिति का सामना कर सकता है लेकिन fast_msg1 और fast_msg2 सफलतापूर्वक संसाधित हो जाते हैं और फिर जेवीएम क्रैश हो जाता है। पुनरारंभ करने के बाद मेरे उपभोक्ता को fast_msg3 पर इंगित किया जाएगा, और slow_msg खो जाएगा। –

2

का कोई वर्णन नहीं है ऐसा लगता है कि तुम क्या जरूरत है एक कतार है। एक विभाजन मल्टीप्ले उपभोक्ताओं द्वारा उपभोग किया जाता है। प्रत्येक उपभोक्ता विभाजन से एक रिकॉर्ड प्राप्त करता है, इसे संसाधित करता है, और एक और प्राप्त करता है। यदि एक उपभोक्ता रिकॉर्ड को संसाधित करने में बहुत अधिक समय लेता है, तो अन्य लोग विभाजन से (अलग) रिकॉर्ड प्राप्त कर सकते हैं।

हालांकि, काफ्का इसका समर्थन नहीं करता है। प्रत्येक विभाजन केवल उपभोक्ता समूह में एक उपभोक्ता द्वारा उपभोग किया जा सकता है।

एक शब्द में, आपको RabbitMQ जैसे लक्ष्य को प्राप्त करने के लिए कुछ और चाहिए।

संबंधित मुद्दे