क्या काफ्का को संदेश भेजने के लिए आवश्यक है?


93
KeyedMessage<String, byte[]> keyedMessage = new KeyedMessage<String, byte[]>(request.getRequestTopicName(), SerializationUtils.serialize(message)); 
producer.send(keyedMessage);

वर्तमान में, मैं किसी भी कुंजी के बिना संदेश भेज रहा हूं किन्स्ड संदेशों के हिस्से के रूप में, क्या यह अभी भी साथ काम करेगा delete.retention.ms? क्या मुझे संदेश के भाग के रूप में एक कुंजी भेजने की आवश्यकता है? क्या संदेश का हिस्सा बनाने के लिए यह अच्छा है?

जवाबों:


172

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

राज्य मशीन के मामले में, चाबियों का उपयोग log.cleaner.en के साथ किया जा सकता है । उस स्थिति में, काफ्का मानता है कि आपका आवेदन केवल किसी दिए गए कुंजी के सबसे हालिया उदाहरण के बारे में परवाह करता है और लॉग क्लीनर किसी दिए गए कुंजी के पुराने डुप्लिकेट को हटा देता है यदि कुंजी शून्य नहीं है। लॉग संघनन का यह रूप log.cleaner.delete.retention संपत्ति द्वारा नियंत्रित किया जाता है और कुंजी की आवश्यकता होती है।

वैकल्पिक रूप से, अधिक सामान्य प्रॉपर्टी log.retention.hours , जो डिफ़ॉल्ट रूप से सक्षम है, लॉग के पूर्ण खंडों को हटाकर काम करता है जो पुराने हैं। इस मामले में चाबियाँ प्रदान करने की आवश्यकता नहीं है। कफ़्का बस उस लॉग के विखंडू को हटा देगा जो दिए गए अवधारण अवधि से अधिक पुराना है।

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


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

1
@ कुजू मैं इस डी-डुप्लिकेट को केवल लॉग प्रविष्टियों के लिए मान रहा हूं, यह जरूरी नहीं है कि विषय पंक्ति पर संदेशों को डी-डुप्लिकेट किया जाए?
user1658296

2
@oblivion संदेशों को एक ही पार्टीशन में जाना क्रमिक रूप से नॉन-इम्प्लिमेंट्री अपडेट्स को हैंडल करने के लिए महत्वपूर्ण है, जैसे ग्राहक डिलीवरी की तारीख (एक संदेश) का चयन करता है, लेकिन बाद में (दूसरा संदेश) मन बदल देता है। यदि संदेश अलग-अलग विभाजनों में जाने थे तो प्रत्येक विभाजन से उपभोग करने वाले 2 उपभोक्ताओं के साथ या तो संदेश को पहले / अंतिम रूप से संसाधित किया जा सकता है। यदि समान वितरण से संबंधित दोनों संदेश समान विभाजन में जाते हैं, तो उन्हें सही अंतिम डिलीवरी की तारीख देते हुए पहले-पहले-बाहर संसाधित किया जाता है।
कुणाल

3
आदेश की गारंटी कुंजी से नहीं बल्कि संदेशों से उसी विभाजन में आती है। संदेशों को विभाजनों में बदलने के लिए कुंजी-आधारित होना आवश्यक नहीं है। ProducerRecord
Malt

2
मेरी समझ यह है कि निर्माता क्लाइंट विभाजन ( kafka.apache.org/documentation.html#design_loadbalancing ) को चुनने के लिए जिम्मेदार है , जो कुंजी पर आधारित हो भी सकता है और नहीं भी। तो आप क्यों कहते हैं कि ऑर्डर करने के लिए चाबियां जरूरी हैं?
lfk

5

बहुत ही उपयोगी स्वीकृत उत्तर के अलावा मैं कुछ और विवरण जोड़ना चाहूंगा

विभाजन

डिफ़ॉल्ट रूप से, काफ्का उस विषय के विभाजन का चयन करने के लिए संदेश की कुंजी का उपयोग करता है जिसे वह लिखता है। यह कुछ इस तरह से किया जाता है

hash(key) % number_of_partitions

यदि कोई कुंजी प्रदान नहीं की जाती है, तो काफ्का राउंड-रॉबिन फैशन में डेटा को यादृच्छिक रूप से विभाजित करेगा।

आदेश

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

मान लें कि आप अपने ग्राहकों के लिए दो भागों के साथ एक काफ़्का विषय में वित्तीय लेनदेन करना चाहते हैं। संदेश जैसे दिख सकते हैं (कुंजी: मान)

null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": -1337}
null:{"customerId": 1, "changeInBankAccount": +200}

जैसा कि हमने एक कुंजी को परिभाषित नहीं किया है दो विभाजन निश्चित रूप से दिखेंगे

// partition 0
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}

// partition 1
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": -1337}

उस विषय को पढ़ने वाला आपका उपभोक्ता आपको यह बता सकता है कि किसी विशेष समय में खाते पर शेष राशि 600 है, हालांकि ऐसा कभी नहीं हुआ था! सिर्फ इसलिए कि यह विभाजन 1 के संदेशों से पहले विभाजन 0 के सभी संदेशों को पढ़ रहा था।

एक समझदार कुंजी के साथ (जैसे customerId) इससे बचा जा सकता है क्योंकि विभाजन इस तरह होगा:

// partition 0
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": -1337}
1:{"customerId": 1, "changeInBankAccount": +200}

// partition 1
2:{"customerId": 2, "changeInBankAccount": +100}

लॉग का संघनन

आपके संदेशों के भाग के रूप में एक कुंजी के बिना, आप विषय कॉन्फ़िगरेशन cleanup.policyको सेट करने में सक्षम नहीं होंगे compactedप्रलेखन के अनुसार "लॉग कंपैशन यह सुनिश्चित करता है कि काफ्का एक विषय विभाजन के लिए डेटा लॉग के भीतर प्रत्येक संदेश कुंजी के लिए कम से कम अंतिम ज्ञात मान हमेशा बनाए रखेगा।"

यह अच्छी और सहायक सेटिंग बिना किसी कुंजी के उपलब्ध नहीं होगी।

कुंजी का उपयोग

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

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

नोट के रूप में, हेडर की अवधारणा भी है जिसका उपयोग सूचनाओं को संग्रहीत करने के लिए किया जा सकता है, देखें प्रलेखन

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