2015-04-23 16 views
13

अपाचे काफ्का दस्तावेज के अनुसार, संदेशों का क्रम विभाजन में या किसी विषय में एक विभाजन के भीतर प्राप्त किया जा सकता है। इस मामले में, हम समानांतर लाभ क्या प्राप्त कर रहे हैं और यह पारंपरिक एमक्यू के बराबर है, है ना?अपाचे काफ्का कई विभाजन वाले संदेशों का क्रम

+3

यह कहने जैसा थोड़ा सा है: * यदि मैं अपने सभी कोड पर एक सिंक्रनाइज़ ब्लॉक डालता हूं, तो मल्टीथ्रेडिंग लाभ कहां है? * यदि आप अपना डेटा अच्छी तरह विभाजित करते हैं और आपको वास्तव में आवश्यकता नहीं है तो आप काफ़का के समांतरता का सबसे अधिक लाभ उठा सकते हैं आदेश। यदि आपके विशेष उपयोग-मामले के लिए आपको एक विभाजन का उपयोग करने की आवश्यकता है, तो हाँ, आप समांतरता लाभ नहीं देखेंगे, लेकिन यह कफका की कमी नहीं है - आपको अपने उपयोग-मामले को फिर से सोचने की आवश्यकता हो सकती है। मैं मानता हूं कि वास्तविक विश्व उपयोग के मामले हो सकते हैं जो कफका के लिए अच्छे उम्मीदवार नहीं हैं। – RaGe

उत्तर

32

काफ्का में समांतरता किसी विषय के लिए विभाजन की संख्या के बराबर है।

उदाहरण के लिए, मान लें कि आपके संदेशों को user_id के आधार पर विभाजित किया गया है और उपयोगकर्ता संदेशों को 1,2,3 और 4 वाले 4 संदेशों पर विचार करें। मान लीजिए कि आपके पास 4 विभाजन वाले "उपयोगकर्ता" विषय हैं।

के बाद से विभाजन user_id पर आधारित है, कि संदेश user_id 1 होने विभाजन 1 के लिए जाना जाएगा मान, संदेश होने user_id 2 इतने पर विभाजन 2 के पास जाकर होगा ..

भी मान लें कि आपके लिए 4 उपभोक्ताओं है विषय। चूंकि आपके पास 4 उपभोक्ता हैं, कफका प्रत्येक उपभोक्ता को एक विभाजन में असाइन करेगा। तो इस मामले में जैसे ही 4 संदेश धकेल दिए जाते हैं, उन्हें तुरंत उपभोक्ताओं द्वारा उपभोग किया जाता है।

यदि आपके पास 4 के बजाय विषय के लिए 2 उपभोक्ता थे, तो प्रत्येक उपभोक्ता 2 विभाजनों को संभालेगा और उपभोग करने वाला थ्रूपुट लगभग आधा होगा।

अपने प्रश्न का पूरी तरह उत्तर देने के लिए, काफ्का केवल एक विभाजन के भीतर संदेशों पर कुल आदेश प्रदान करता है, किसी विषय में अलग-अलग विभाजनों के बीच नहीं।

यानी, यदि विभाजन 2 में खपत बहुत धीमी है और भाग आयन 4 में बहुत तेज़ है, तो उपयोगकर्ता_आईडी 4 के साथ संदेश उपयोगकर्ता_आईडी 2 के साथ संदेश से पहले उपभोग किया जाएगा। इस प्रकार कफका डिज़ाइन किया गया है।

+1

हां, @ जॉन। लेकिन उपर्युक्त मामले में इस बात की कोई गारंटी नहीं है कि संदेशों को उसी क्रम में प्राप्त किया जाएगा जो भेजा जा रहा है। मैं इसका जिक्र कर रहा हूं, http://stackoverflow.com/questions/21293937/apache-kafka-message-consumption-when-partitions-outnumber-consumers –

+0

हां इस तरह की कोई गारंटी नहीं है। उस स्थिति में आपको अपने विषय के लिए एक विभाजन का उपयोग करना होगा और आप समानांतर करने की क्षमता खो देंगे। आपको हाथ में समस्या के बारे में पुनर्विचार करना पड़ सकता है। –

+2

@ RajanR.G मुझे लगता है कि उन्हें उत्पादन करते समय आपको अपने संदेशों को सही ढंग से विभाजित करना चाहिए। उदाहरण के लिए आप user_id द्वारा विभाजन कर सकते हैं और फिर विशिष्ट user_id के लिए आपके संदेश एक विशिष्ट विभाजन (जो हमेशा समान होंगे) तक पहुंच जाएंगे और इस प्रकार गारंटी देंगे कि उस user_id के सभी संदेश क्रम में बने रहेंगे। आपको अलग-अलग user_ids के बीच ऑर्डर को सुरक्षित रखने की आवश्यकता नहीं है, है ना? – serejja

12

मैंने अपनी टिप्पणी को एक अलग उत्तर में स्थानांतरित करने का फैसला किया क्योंकि मुझे लगता है कि ऐसा करने के लिए यह समझ में आता है।

जबकि जॉन ने जो लिखा है उसके बारे में 100% सही है, तो आप अपनी समस्या पर पुनर्विचार करने पर विचार कर सकते हैं। क्या आपको वास्तव में रहने के लिए सभी संदेशों की आवश्यकता है? या क्या आपको क्रम में रहने के लिए विशिष्ट user_id (या जो कुछ भी) के लिए सभी संदेशों की आवश्यकता है?

यदि पहला है, तो आप ऐसा नहीं कर सकते हैं, तो आपको 1 विभाजन का उपयोग करना चाहिए और सभी समांतरता क्षमता खोना चाहिए।

लेकिन यदि दूसरा मामला है, तो आप अपने संदेशों को कुछ कुंजी से विभाजित करने पर विचार कर सकते हैं और इस प्रकार उस कुंजी के सभी संदेश एक विभाजन तक पहुंच जाएंगे (यदि आप विषय का आकार बदलते हैं तो वे वास्तव में किसी अन्य विभाजन पर जा सकते हैं, लेकिन यह एक अलग मामला है) और इस प्रकार गारंटी होगी कि उस कुंजी के सभी संदेश क्रम में हैं।

+0

आपकी टिप्पणियों के लिए धन्यवाद। आइए डेटाबेस अपडेट का उदाहरण लें, जिसे अनुक्रमिक होने की आवश्यकता है यदि हम संदेशों को अन्य सिस्टम में स्थानांतरित करते हैं। इस मामले में, तब काफ्का केवल लॉग ट्रांसफर के लिए उपयोग किया जा सकता है, न कि वास्तविक समय लेनदेन संदेश प्रणाली के लिए, है ना? अन्यथा हमें उपभोक्ता http://www.enterpriseintegrationpatterns.com/Resequencer.html पर ReSequencer बनाना होगा। इसके बजाय हम RabbitMQ या अन्य एमक्यू का उपयोग कर सकते हैं? –

+0

क्षमा करें, मेरे पास अन्य एमक्यू में कोई विशेषज्ञता नहीं है क्योंकि मैं केवल कफका से परिचित हूं। वैसे भी मुझे लगता है कि यह उस डेटा पर निर्भर करता है जो आप डेटा के साथ करना चाहते हैं। यह एक मामला हो सकता है जब आपको काफ्का के बजाय अन्य समाधानों की जांच करनी चाहिए। – serejja

2

एक ही कुंजी के साथ काफ्का संदेश में, एक ही निर्माता से, उपभोक्ता के लिए आदेश

एक और बात में उस के शीर्ष पर दिया जाता है है, एक विभाजन के भीतर डाटा में आदेश में संग्रहीत किया जाएगा जिसे लिखा गया है, विभाजन से पढ़ने वाले डेटा को उस विभाजन के लिए पढ़ा जाएगा

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

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

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