কাফকা গ্রাহক অফসেট কী নির্ধারণ করে?


169

আমি কাফকার তুলনায় তুলনামূলকভাবে নতুন। আমি এটি নিয়ে কিছুটা পরীক্ষা-নিরীক্ষা করেছি, তবে গ্রাহক অফসেট সম্পর্কে আমার কাছে কিছু জিনিস অস্পষ্ট। আমি এতক্ষণ যা বুঝতে পেরেছি, যখন থেকে কোনও গ্রাহক শুরু করেন, এটি অফসেটটি পড়া শুরু করবে তা কনফিগারেশন সেটিংস দ্বারা নির্ধারিত হয় auto.offset.reset(আমি ভুল হলে আমাকে সংশোধন করি)।

এখন উদাহরণস্বরূপ বলুন যে বিষয়টিতে 10 টি বার্তা রয়েছে (0 থেকে 9 টি অফসেট), এবং কোনও গ্রাহক সেটির 5 টি গ্রাস করার আগেই তা নেমে যাওয়ার আগে (বা আমি ভোক্তাকে হত্যা করার আগে)। তারপরে বলুন যে আমি সেই ভোক্তা প্রক্রিয়া পুনরায় চালু করব। আমার প্রশ্নগুলি হ'ল:

  1. যদি auto.offset.resetসেট করা থাকে smallest, এটি কি সর্বদা অফসেট 0 থেকে গ্রাস করা শুরু করবে?

  2. যদি auto.offset.resetসেট করা থাকে largest, এটি অফসেট 5 থেকে গ্রাস করা শুরু করবে?

  3. এই ধরণের পরিস্থিতি সম্পর্কিত আচরণ কি সর্বদা নির্বিচারক?

যদি আমার প্রশ্নে কিছু অস্পষ্ট হয় তবে মন্তব্য করতে দ্বিধা করবেন না। আগাম ধন্যবাদ.

উত্তর:


260

আপনার বর্ণনার চেয়ে এটি কিছুটা জটিল। একমাত্র যদি আপনার ভোক্তা গ্রুপ একটি বৈধ অফসেট অঙ্গীকারবদ্ধ কোথাও নেই কনফিগ কিক (2 সমর্থিত অফসেট স্টোরেজ এখন কাফকা এবং Zookeeper হয়), এবং এটা কি ভোক্তা সাজানোর আপনি ব্যবহার উপর নির্ভর করে।
auto.offset.reset

আপনি যদি উচ্চ-স্তরের জাভা ব্যবহার করেন তবে নিম্নলিখিত পরিস্থিতিগুলি কল্পনা করুন:

  1. আপনার একটি গ্রাহক গ্রুপে একজন গ্রাহক group1রয়েছে যা 5 টি বার্তা গ্রহন করেছে এবং মারা গেছে। পরের বার আপনি এই ভোক্তা শুরু করবেন এটি এমনকি এই auto.offset.resetকনফিগারেশনটি ব্যবহার করবে না এবং এটি মারা যাওয়ার জায়গা থেকে চালিয়ে যাবে কারণ এটি কেবল অফসেট স্টোরেজ থেকে সঞ্চিত অফসেটটি আনবে (কাফকা বা জেডকে আমি যেমন উল্লেখ করেছি)।

  2. আপনার একটি বিষয়ে বার্তাগুলি রয়েছে (যেমন আপনি বর্ণনা করেছেন) এবং আপনি একটি নতুন গ্রাহক গোষ্ঠীতে গ্রাহক শুরু করেন group2। এখানে কোথাও কোনও অফসেট সঞ্চিত নেই এবং auto.offset.resetএবার কনফিগারটি সিদ্ধান্ত নেবে যে বিষয় ( earliest) এর শুরু থেকে শুরু করা হবে বা বিষয়টির শেষ থেকে ( latest)

আরও একটি জিনিস যা অফসেট মানটির সাথে কী earliestএবং latestকনফিগারগুলির সাথে মিল রাখে তা প্রভাবিত করে তা হ'ল লগ ধরে রাখা নীতি। কল্পনা করুন যে আপনার কাছে আট ঘন্টা ধরে কনফিগার করা একটি বিষয় রয়েছে। আপনি 5 টি বার্তা উত্পাদন করেন এবং তারপরে এক ঘন্টা পরে আপনি আরও 5 টি বার্তা পোস্ট করেন। latestঅফসেট এখনও পূর্ববর্তী উদাহরণ হিসাবে একই থাকবে কিন্তু earliestএক হতে পারবে না 0কারণ কাফকা ইতিমধ্যে এই বার্তাগুলি এবং এইভাবে নিকটতম প্রাপ্তিসাধ্য অফসেট হতে হবে সরাবে 5

উপরে উল্লিখিত সমস্ত SimpleConsumerকিছুর সাথে সম্পর্কিত নয় এবং প্রতিবার এটি চালানোর পরে auto.offset.resetকনফিগার ব্যবহারটি কোথা থেকে শুরু করবেন তা সিদ্ধান্ত নেবে ।

আপনি কাফকা সংস্করণ 0.9 চেয়ে পুরোনো ব্যবহার করেন, তাহলে প্রতিস্থাপন আছে earliest, latestসঙ্গে smallest, largest


3
উত্তরের জন্য অনেক ধন্যবাদ। সুতরাং উচ্চ স্তরের গ্রাহক হিসাবে, একবার কোনও গ্রাহকের কিছু প্রতিশ্রুতিবদ্ধ হয়ে যায় (জেডকে বা কাফকার মধ্যে), তার auto.offset.resetপরে এর কোনও তাত্পর্য নেই? সেই সেটিংয়ের একমাত্র তাৎপর্য হ'ল যখন কোনও প্রতিশ্রুতিবদ্ধ না থাকে (এবং আদর্শভাবে এটি গ্রাহকের প্রথম প্রারম্ভের সময় হবে)?
আসিফ ইকবাল

2
আপনি বর্ণনা ঠিক হিসাবে
serejja

1
@serejja হ্যালো - আমার কাছে প্রতি গ্রুপে সর্বদা 1 জন ভোক্তা থাকলে এবং আপনার উত্তরটির 1 নম্বর পরিস্থিতি আমার জন্য কীভাবে হয়? এটা কি একই হবে?
ha9u63ar

1
@ ha9u63ar আপনার প্রশ্নটি বেশ বোঝেনি। আপনি যদি আপনার গ্রাহকটিকে একই গোষ্ঠীতে পুনরায় চালু করেন তবে হ্যাঁ, এটি auto.offset.resetপ্রতিশ্রুতিবদ্ধ অফসেট থেকে ব্যবহার করবে না এবং চালিয়ে যাবে না । আপনি যদি সর্বদা পৃথক গ্রাহক গোষ্ঠী ব্যবহার করেন (যেমন গ্রাহক শুরু করার সময় এটি তৈরি করুন), তবে গ্রাহক সর্বদা শ্রদ্ধা করবেauto.offset.reset
serejja

@ সেরেজা হ্যাঁ এবং এটি আমার পক্ষে কাজ করছে না। আপনি কটাক্ষপাত করা খুশি পারে এই - এই আমার সমস্যা
ha9u63ar

82

কেবলমাত্র একটি আপডেট: কাফকা ০.৯ এবং তারপরে, কাফকা গ্রাহকের একটি নতুন জাভা সংস্করণ ব্যবহার করছে এবং Auto.offset.reset প্যারামিটারের নাম পরিবর্তন হয়েছে; ম্যানুয়াল থেকে:

কাফকার কোনও প্রাথমিক অফসেট না থাকলে বা সার্ভারে বর্তমান অফসেটটি আর উপস্থিত না থাকলে কী করবেন (উদাহরণস্বরূপ যে ডেটা মুছে ফেলা হয়েছে):

শীঘ্রই : স্বয়ংক্রিয়ভাবে অফসেটটিকে আদিতম অফসেটে পুনরায় সেট করুন

সর্বশেষ : স্বয়ংক্রিয়ভাবে অফসেটটি সর্বশেষতম অফসেটে পুনরায় সেট করুন

কোনওটি নয় : গ্রাহকের গ্রুপের জন্য পূর্ববর্তী কোনও অফসেট পাওয়া না গেলে গ্রাহককে ব্যতিক্রম করুন throw

অন্য কিছু: গ্রাহক ব্যতিক্রম নিক্ষেপ।

আমি গ্রহণযোগ্য উত্তরটি যাচাই করার পরে এটি খুঁজতে কিছুটা সময় ব্যয় করেছি, তাই আমি ভেবেছিলাম এটি পোস্ট করা সম্প্রদায়ের পক্ষে এটি দরকারী useful


9

আরও আরও রয়েছে অফসেটস.রিটেনশন.মিনিটস। শেষ প্রতিশ্রুতি থেকে সময় যদি হয়> offsets.retention.minutesতবে auto.offset.resetকিক ইন


1
এটি লগ ধরে রাখার সাথে অপ্রয়োজনীয় বলে মনে হচ্ছে না? অফসেট রিটেনশন লগ ধরে রাখার উপর ভিত্তি করে করা উচিত?
mike01010

@ mike01010 ঠিক আছে। এটি লগ ধরে রাখার উপর ভিত্তি করে হওয়া উচিত, এটি টিকিটের প্রস্তাবিত সমাধানগুলির মধ্যে একটি। Prolong default value of offsets.retention.minutes to be at least twice larger than log.retention.hours. ইস্যু.পাছে.আর.আগা.আর.আগ্রা.আর
সাহেব

এই উত্তরটি আমাকে কিছুদিনের জন্য ভয় না হওয়া পর্যন্ত আমি যাচাই ডকুমেন্টেশন এর offsets.retention.minutes। এই <b> পর ভোক্তা গ্রুপ তার ভোক্তাদের (অর্থাত খালি হয়ে) তার অফসেট বাতিল পেয়ে আগে এই স্মৃতিশক্তি সময়ের জন্য রাখা হবে হারায় করুন </ b> স্বতন্ত্র জন্য গ্রাহকরা (ম্যানুয়াল অ্যাসাইনমেন্ট ব্যবহার করে), অফসেটগুলি শেষ প্রতিশ্রুতিবদ্ধ প্লাস এই ধারণার সময়কালের পরে শেষ হয়ে যাবে। (এটি এর জন্য Kafka 2.3)
জাম্পিং_মোনকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.