बहुत ही उपयोगी स्वीकृत उत्तर के अलावा मैं कुछ और विवरण जोड़ना चाहूंगा
विभाजन
डिफ़ॉल्ट रूप से, काफ्का उस विषय के विभाजन का चयन करने के लिए संदेश की कुंजी का उपयोग करता है जिसे वह लिखता है। यह कुछ इस तरह से किया जाता है
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
। प्रलेखन के अनुसार "लॉग कंपैशन यह सुनिश्चित करता है कि काफ्का एक विषय विभाजन के लिए डेटा लॉग के भीतर प्रत्येक संदेश कुंजी के लिए कम से कम अंतिम ज्ञात मान हमेशा बनाए रखेगा।"
यह अच्छी और सहायक सेटिंग बिना किसी कुंजी के उपलब्ध नहीं होगी।
कुंजी का उपयोग
वास्तविक जीवन में उपयोग के मामलों में, काफ्का संदेश की कुंजी आपके प्रदर्शन और आपके व्यावसायिक तर्क की स्पष्टता पर भारी प्रभाव डाल सकती है।
उदाहरण के लिए एक कुंजी आपके डेटा के विभाजन के लिए स्वाभाविक रूप से उपयोग की जा सकती है। जैसा कि आप अपने उपभोक्ताओं को विशेष विभाजन से पढ़ने के लिए नियंत्रित कर सकते हैं यह एक कुशल फिल्टर के रूप में काम कर सकता है। इसके अलावा, कुंजी संदेश के वास्तविक मूल्य पर कुछ मेटा डेटा शामिल कर सकती है जो आपको बाद के प्रसंस्करण को नियंत्रित करने में मदद करती है। कुंजी आमतौर पर छोटे होते हैं और फिर मान पूरे मान के बजाय कुंजी को पार्स करना अधिक सुविधाजनक होता है। उसी समय, आप सभी क्रमबद्धता और स्कीमा पंजीकरण लागू कर सकते हैं जैसा कि आपके मूल्य के साथ कुंजी के साथ भी किया जाता है।
नोट के रूप में, हेडर की अवधारणा भी है जिसका उपयोग सूचनाओं को संग्रहीत करने के लिए किया जा सकता है, देखें प्रलेखन ।