काफ्का की कुंजी / मूल्य जोड़ी-आधारित संदेश का उद्देश्य क्या है? [बन्द है]


97

सब के सब उदाहरण के काफ्का | उत्पादकों को दिखाने के ProducerRecordकेवल एक ही प्रकार (सभी उदाहरणों से पता चलता जा रहा है के रूप में नहीं के मुख्य / मान जोड़े <String,String>), लेकिन एक ही मूल्य । उदाहरण के लिए:

producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));

लेकिन काफ्का डॉक्स में, मैं यह नहीं जान सकता कि कुंजी / मूल्य अवधारणा (और इसका अंतर्निहित उद्देश्य / उपयोगिता) कहां है। पारंपरिक मैसेजिंग (ActiveMQ, RabbitMQ, आदि) में मैंने हमेशा एक विशेष विषय / कतार / एक्सचेंज में एक संदेश निकाल दिया है। लेकिन काफ्का पहला ब्रोकर है जिसे सिर्फ एक रेग्युलर 'ओले स्ट्रिंग मैसेज' के बजाय की / वैल्यू पेयर की जरूरत लगती है।

तो मैं पूछता हूं: केवी जोड़े भेजने के लिए उत्पादकों की आवश्यकता का उद्देश्य / उपयोगिता क्या है?

जवाबों:


95

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

कुंजी का उपयोग उस लॉग के भीतर विभाजन को निर्धारित करने के लिए किया जाता है, जिसमें संदेश को जोड़ा जाता है। जबकि मूल्य संदेश का वास्तविक पेलोड है। इस संबंध में उदाहरण वास्तव में बहुत "अच्छे" नहीं हैं; आमतौर पर आपके पास मूल्य के रूप में एक जटिल प्रकार होता है (जैसे टपल-टाइप या JSON या समान) और आप कुंजी के रूप में एक फ़ील्ड निकालेंगे।

देखें: http://kafka.apache.org/intro#intro_topics और http://kafka.apache.org/intro#intro_producers

सामान्य तौर पर कुंजी और / या मान भी हो सकता nullहै। यदि कुंजी nullएक यादृच्छिक विभाजन है तो चयनित किया जाएगा। यदि मान ऐसा nullहै, तो किसी विषय ( http://kafka.apache.org/documentation#compaction ) के लिए लॉग-रिटेंशन पॉलिसी के बजाय लॉग-कंपैशन को सक्षम करने पर विशेष "डिलीट" शब्दार्थ हो सकता है ।


2
और विशेष रूप से, चाबियां काफ्का के स्ट्रीमिंग एपीआई में एक प्रासंगिक भूमिका निभाती हैं, KStreamऔर KTable- यहां देखें ।
REIM

12
कुंजी का उपयोग विभाजन को निर्धारित करने के लिए किया जा सकता है, लेकिन यह सिर्फ निर्माता की एक डिफ़ॉल्ट रणनीति है। अंततः, यह निर्माता है जो चयन करता है कि किस विभाजन का उपयोग करना है।
gvo

@gvo कुंजी अधिक उपयोग करता है?
leoconco

1
इसका उपयोग प्रति कुंजी संदेश के केवल एक उदाहरण को रखने के लिए किया जा सकता है, जैसा कि लॉग संघनन लिंक में बताया गया है। मैं अन्य उपयोग-मामलों के बारे में नहीं जानता।
ग्वो

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

17

देर से जोड़ ... कुंजी को निर्दिष्ट करना ताकि एक ही कुंजी पर सभी संदेश एक ही विभाजन पर जाएं संदेश प्रसंस्करण के उचित आदेश के लिए बहुत महत्वपूर्ण है यदि आपके पास किसी विषय पर एक उपभोक्ता समूह में कई उपभोक्ता होंगे।

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


-1

एक और दिलचस्प उपयोग मामला

हम उपयोगकर्ता_आईडी भेजने के लिए काफ्का विषयों में प्रमुख विशेषता का उपयोग कर सकते हैं और फिर उपभोक्ता में स्ट्रीमिंग इवेंट (मूल्य विशेषताओं में संग्रहीत घटनाएँ) लाने के लिए प्लग इन कर सकते हैं। यह आपको अपने मशीन लर्निंग मॉडल में फीचर बनाने के लिए उपयोगकर्ता ईवेंट सीक्वेंस के किसी भी अधिकतम-इतिहास को संसाधित करने की अनुमति दे सकता है।

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

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