কাফকার কাছে বার্তা প্রেরণের অংশ হিসাবে কীটি প্রয়োজনীয়?


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

বর্তমানে, কীড বার্তাগুলির অংশ হিসাবে আমি কোনও কী ছাড়াই বার্তা পাঠাচ্ছি, এটি কি এখনও কাজ করবে delete.retention.ms? বার্তার অংশ হিসাবে আমার কী কী পাঠাতে হবে? এই বার্তার অংশ হিসাবে কী তৈরি করা ভাল?

উত্তর:


184

আপনার যদি কোনও কীটির জন্য দৃ order় আদেশের প্রয়োজন হয় এবং রাষ্ট্রীয় মেশিনের মতো কিছু বিকাশ করা হয় তবে কীগুলি বেশিরভাগই দরকারী / প্রয়োজনীয়। আপনার যদি একই কী (উদাহরণস্বরূপ, একটি অনন্য আইডি) সহ বার্তাগুলি প্রয়োজন হয় তবে সর্বদা সঠিক ক্রমে দেখা যায়, বার্তাগুলির সাথে একটি কী সংযুক্তি নিশ্চিত করা হবে যে একই কী সহ বার্তাগুলি সর্বদা একটি বিষয়ের একই বিভাগে যাবে। কাফকা একটি পার্টিশনের মধ্যে অর্ডারের গ্যারান্টি দেয় তবে কোনও বিষয়ে পার্টিশন জুড়ে নয়, তাই বিকল্পভাবে কোনও কী সরবরাহ না করে - যার ফলে পার্টিশনগুলিতে গোল-রবিন বিতরণ হবে - এই জাতীয় ক্রমটি বজায় রাখবে না।

স্টেট মেশিনের ক্ষেত্রে, লোগুলিএল.সিএনর দিয়ে কীগুলি একই কী সহ এন্ট্রিগুলি নকল করতে সক্ষম। সেক্ষেত্রে, কাফকা অনুমান করে যে আপনার অ্যাপ্লিকেশনটি কেবলমাত্র একটি প্রদত্ত কীটির সাম্প্রতিকতম দৃষ্টান্তের বিষয়ে চিন্তা করে এবং লগ ক্লিনারটি যদি কোনও শর্তটি ফাঁকা না হয় তবেই প্রদত্ত কীটির পুরানো নকল মুছে ফেলা হয়। লগ কমপ্যাক্টের এই ফর্মটি log.cleaner.delete.retention সম্পত্তি দ্বারা নিয়ন্ত্রিত হয় এবং কীগুলি প্রয়োজন।

বিকল্পভাবে, আরও সাধারণ সম্পত্তি লগ.আর্টেন্ট.হাউসগুলি , যা ডিফল্টরূপে সক্ষম হয়, লগের সম্পূর্ণ বিভাগগুলিকে মুছে ফেলার মাধ্যমে কাজ করে যা পুরানো । এই ক্ষেত্রে কীগুলি সরবরাহ করতে হবে না। কাফকা প্রদত্ত ধরে রাখার সময়কালের চেয়ে পুরানো লগের অংশগুলি কেবল মুছে ফেলবে।

এগুলি বলার জন্য, আপনি যদি লগ কমপ্যাকশন সক্ষম করে থাকেন বা একই কী সহ বার্তাগুলির জন্য কঠোর অর্ডার প্রয়োজন হয় তবে অবশ্যই আপনার কীগুলি ব্যবহার করা উচিত। অন্যথায়, নাল কীগুলি আরও ভাল বিতরণ সরবরাহ করতে পারে এবং সম্ভাব্য হট স্পটিং সমস্যাগুলি প্রতিরোধ করতে পারে যেখানে কিছু কী অন্যের চেয়ে বেশি প্রদর্শিত হতে পারে।


আমি কাফকার কাছে নতুন, এ কারণেই এতো প্রশ্ন জিজ্ঞাসা করা হচ্ছে: এ নিয়ে বেশ কয়েকটি প্রশ্ন রয়েছে: প্রথম প্রশ্ন, আমরা কী ভিত্তিতে এই বার্তাটি গ্রাস করতে পারি, বর্তমানে আমি মেসাগ্যান্ড এবং মেটাডাটা মিমি থেকে বার্তা গ্রহণ করছি। বা বার্তা গ্রহণের সময় কীটি উপেক্ষা করা ঠিক আছে I আমি হিগ স্তরের গ্রাহক এপি ব্যবহার করছি।
গৌরব

4
@কুজো আমি ধরে নিচ্ছি যে এই ডি-ডুপ্লিকেশনটি কেবল লগ এন্ট্রিগুলির জন্যই হয়, এটি প্রয়োজনীয়ভাবে কোনও বিষয়ের সারিতে বার্তা ডি-সদৃশ করে না?
ব্যবহারকারী1658296

4
অ-আদর্শিক আপডেটগুলি পরিচালনা করার জন্য @ ব্লাবিওনগুলি একই পার্টিশনে যথাযথভাবে বার্তা থাকা গুরুত্বপূর্ণ, যেমন গ্রাহক ডেলিভারির তারিখ (একটি বার্তা) নির্বাচন করে তবে পরে মন পরিবর্তন করে (দ্বিতীয় বার্তা)। যদি বার্তাগুলি বিভিন্ন পার্টিশনে যেতে হয় তবে বার্তাটি প্রথম / শেষ যেমন প্রতিটি পার্টিশন থেকে ২ জন গ্রাহক গ্রাহক নিয়ে প্রক্রিয়া করা যেতে পারে। যদি একই ডেলিভারি সম্পর্কিত উভয় বার্তা একই বিভাগে চলে যায় তবে তাদের সঠিক চূড়ান্ত বিতরণের তারিখ দিয়ে প্রথমে প্রসেস করা হবে।
কুণাল

4
অর্ডার গ্যারান্টিগুলি কী থেকে আসে না তবে একই পার্টিশনে থাকা বার্তাগুলি থেকে আসে। পার্টিশনগুলিতে বার্তাগুলির রাউটিংয়ে কী-ভিত্তিক হওয়া দরকার না। একটি তৈরি করার সময় আপনি স্পষ্টভাবে একটি পার্টিশন নির্দিষ্ট করতে পারেনProducerRecord
মাল্ট

4
আমার বোঝা নির্মাতারা ক্লায়েন্টটি পার্টিশন ( kafka.apache.org/docamentation.html#design_loadbalancing ) বাছাই করার জন্য দায়বদ্ধ , যা মূল ভিত্তিতে বা নাও থাকতে পারে। তাহলে আপনি কেন বলছেন অর্ডার দেওয়ার জন্য কীগুলি প্রয়োজনীয়?
lfk

11

অত্যন্ত সহায়ক গৃহীত উত্তর ছাড়াও আমি আরও কয়েকটি বিশদ যুক্ত করতে চাই

বিভাজন

ডিফল্টরূপে, কাফকা বার্তাটির কীটি ব্যবহার করে এতে লেখা বিষয়টির বিভাজন নির্বাচন করে। এটি দ্বারা করা DefaultPartitionerহয়

kafka.common.utils.Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;

যদি কোনও কী সরবরাহ করা হয় না, তবে কাফকা একটি বৃত্তাকার রবিন ফ্যাশনে এলোমেলোভাবে ডেটা ভাগ করবে।

কাফকার ক্ষেত্রে Partitionerক্লাস বাড়িয়ে নিজের পার্টিশনার তৈরি করা সম্ভব । এর জন্য, আপনাকে partitionস্বাক্ষরযুক্ত পদ্ধতিটি ওভাররাইড করতে হবে :

int partition(String topic, 
              Object key,
              byte[] keyBytes,
              Object value,
              byte[] valueBytes,
              Cluster cluster)

সাধারণত, কাফকা বার্তার কীটি পার্টিশন নির্বাচন করতে ব্যবহৃত হয়। কোনও কী না থাকলে আপনাকে সেই মানটির উপর নির্ভর করতে হবে যা প্রক্রিয়া করার জন্য আরও জটিল হতে পারে।

অর্ডার দিচ্ছে

প্রদত্ত উত্তরে যেমন বলা হয়েছে, কাফকার কেবলমাত্র পার্টিশন পর্যায়ে বার্তাগুলি অর্ডার করার নিশ্চয়তা রয়েছে।

ধরা যাক আপনি দুটি গ্রাহকদের সাথে কাফকা বিষয়ে আপনার গ্রাহকদের জন্য আর্থিক লেনদেন সঞ্চয় করতে চান। বার্তাগুলি দেখতে দেখতে (কী: মান)

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 বিভাজনে সমস্ত বার্তা পড়ছিল বলে।

একটি বোধগম্য কী (গ্রাহকআইডের মতো) দিয়ে এড়ানো যায় কারণ পার্টিশনিংটি এরকম হবে:

// 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ডকুমেন্টেশন অনুসারে "লগ কমপ্যাকশন নিশ্চিত করে যে কাফকা সর্বদা একটি টপিক পার্টিশনের জন্য ডেটা লগের মধ্যে প্রতিটি বার্তা কীটির জন্য কমপক্ষে সর্বশেষ জ্ঞাত মান বজায় রাখে।"

এই দুর্দান্ত এবং সহায়ক সেটিংটি কোনও কী ছাড়াই উপলব্ধ হবে না।

কীগুলির ব্যবহার

বাস্তব জীবনের ব্যবহারের ক্ষেত্রে, কাফকা বার্তার মূল কী আপনার কার্যকারিতা এবং আপনার ব্যবসায়ের যুক্তির সুস্পষ্টতার উপর বিশাল প্রভাব ফেলতে পারে।

উদাহরণস্বরূপ একটি কী আপনার ডেটা বিভাজনের জন্য প্রাকৃতিকভাবে ব্যবহার করা যেতে পারে। যেহেতু আপনি আপনার ভোক্তাদের নির্দিষ্ট পার্টিশন থেকে পড়তে নিয়ন্ত্রণ করতে পারেন এটি একটি দক্ষ ফিল্টার হিসাবে পরিবেশন করতে পারে। এছাড়াও, কীটিতে বার্তার আসল মূল্য সম্পর্কে কিছু মেটা ডেটা অন্তর্ভুক্ত থাকতে পারে যা আপনাকে পরবর্তী প্রক্রিয়াজাতিকে নিয়ন্ত্রণ করতে সহায়তা করে। কীগুলি সাধারণত মানগুলির চেয়ে ছোট হয় এবং তাই পুরো মানের পরিবর্তে একটি কী পার্স করা আরও সুবিধাজনক। একই সাথে, আপনি সমস্ত সিরিয়ালাইজেশন এবং স্কিমা রেজিস্ট্রেশন আপনার মান সহ কী হিসাবেও প্রয়োগ করতে পারেন।

একটি নোট হিসাবে, শিরোনামের ধারণাটিও রয়েছে যা তথ্য সঞ্চয় করতে, ডকুমেন্টেশন দেখুন


0

একটি বার্তা সহ কীটি মূলত একটি নির্দিষ্ট ক্ষেত্রের জন্য বার্তাটি অর্ডার করার জন্য প্রেরণ করা হয়।

  • যদি কী = নাল হয় তবে ডেটাগুলি গোল-রবিন প্রেরণ করা হয় (বিতরণ করা partitionভির মধ্যে একটি পৃথক পার্টিশন এবং ভিন্ন ব্রোকারের কাছে এবং অবশ্যই একই বিষয়ে))।
  • যদি কোনও কী প্রেরণ করা হয়, তবে সেই কীটির জন্য সমস্ত বার্তা সর্বদা একই পার্টিশনে যাবে।

ব্যাখ্যা এবং উদাহরণ

  • কী কোনও স্ট্রিং বা পূর্ণসংখ্যা ইত্যাদি হতে পারে ইত্যাদি ..
  • সুতরাং এমালিআইআইডি 123 সর্বদা বিভাজন 0-এ যাবে, কর্মচারী_আইডি 345 সর্বদা পার্টিশন 1 এ যাবে This এটি কী হ্যাশিং অ্যালগরিদম দ্বারা সিদ্ধান্ত নেওয়া হয়েছে যা পার্টিশনের সংখ্যার উপর নির্ভর করে।
  • আপনি যদি কোনও কী না প্রেরণ করেন তবে বার্তাটি রাউন্ড-রবিন কৌশলটি ব্যবহার করে যে কোনও বিভাগে যেতে পারে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.