এলএমএএক্স এর ব্যাঘাতকারী প্যাটার্ন কীভাবে কাজ করে?


205

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

মনে হয় এমন এক বা একাধিক পারমাণবিক পূর্ণসংখ্যা রয়েছে যা অবস্থানগুলি ট্র্যাক করে। প্রতিটি 'ইভেন্ট' একটি অনন্য আইডি পেয়েছে বলে মনে হয় এবং এটি রিংয়ের আকার ইত্যাদির সাথে সম্পর্কিত মডুলাসটি খুঁজে পেয়ে এটির অবস্থানটি পাওয়া যায় etc.

দুর্ভাগ্যক্রমে, এটি কীভাবে কাজ করে তা সম্পর্কে আমার কাছে অন্তর্জ্ঞান নেই। আমি অনেক ট্রেডিং অ্যাপ্লিকেশন করেছি এবং অভিনেতার মডেলটি অধ্যয়ন করেছি , সেডা ইত্যাদির দিকে নজর etc.

তাদের উপস্থাপনায় তারা উল্লেখ করেছিলেন যে এই প্যাটার্নটি মূলত রাউটারগুলি কীভাবে কাজ করে; তবে রাউটারগুলি কীভাবে কাজ করে তার কোনও ভাল বর্ণনা আমি পাইনি।

আরও ভাল ব্যাখ্যার জন্য কিছু ভাল পয়েন্টার আছে?

উত্তর:


210

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

বিপর্যয়ের সহজ বর্ণনা: এটি সবচেয়ে দক্ষ পদ্ধতিতে থ্রেডের মধ্যে বার্তা প্রেরণের একটি উপায়। এটি একটি সারির বিকল্প হিসাবে ব্যবহার করা যেতে পারে তবে এটি শেদা এবং অভিনেতাদের সাথেও বেশ কয়েকটি বৈশিষ্ট্য ভাগ করে নেয়।

সারি তুলনায়:

বিপর্যয়কারী অন্য থ্রেডে বার্তা প্রেরণ করার ক্ষমতা সরবরাহ করে, প্রয়োজনে তা জাগ্রত করার (ব্লকিংকুইয়ের মতো)। তবে, 3 স্বতন্ত্র পার্থক্য রয়েছে।

  1. বিপর্যয়কারী ব্যবহারকারী নির্ধারণ করে যে কীভাবে বার্তাগুলি এন্ট্রি ক্লাস প্রসারিত করে এবং পূর্বনির্ধারণের জন্য একটি কারখানা সরবরাহ করে সংরক্ষণ করা হয়। এটি মেমরির পুনঃব্যবহার (অনুলিপি করা) বা এন্ট্রিতে অন্য কোনও অবজেক্টের রেফারেন্স থাকতে পারে allows
  2. বিপর্যয়কারীদের মধ্যে বার্তা স্থাপন 2-ফেজ প্রক্রিয়া, প্রথমে রিং বাফারে একটি স্লট দাবি করা হয়, যা ব্যবহারকারীকে এন্ট্রি সরবরাহ করে যা উপযুক্ত ডেটা দিয়ে পূরণ করা যায়। তারপরে অবশ্যই প্রবেশ প্রতিশ্রুতিবদ্ধ হতে হবে, উপরে উল্লিখিত মেমরিটির নমনীয় ব্যবহারের অনুমতি দেওয়ার জন্য এই 2-পর্বের পদ্ধতির প্রয়োজন। এটি প্রতিশ্রুতিবদ্ধ যা বার্তাটি গ্রাহক থ্রেডগুলিতে দৃশ্যমান করে।
  3. রিং বাফার থেকে গ্রাহকৃত বার্তাগুলি ট্র্যাক করা ভোক্তার দায়িত্ব। এই দায়িত্বটি রিং বাফার থেকে দূরে সরিয়ে নিয়ে যাওয়া প্রতিটি লেখার নিজস্ব কাউন্টার বজায় রাখার ফলে লেখার বিতর্কতার পরিমাণ হ্রাস করতে সহায়তা করে।

অভিনেতাদের তুলনায়

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

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

সেদা তুলনায়

এলএমএএক্স একটি এসইডিএ ভিত্তিক পদ্ধতির প্রতিস্থাপনের জন্য বিঘ্নকারী প্যাটার্নটি তৈরি করেছিল।

  1. এটি এসইডিএর মাধ্যমে যে প্রধান উন্নতি দিয়েছে তা ছিল সমান্তরালে কাজ করার দক্ষতা। এটি করতে ব্যাঘাতকারী একাধিক গ্রাহককে একই বার্তাগুলি (একই ক্রমে) বহু-কাস্টিং সমর্থন করে। এটি পাইপলাইনে কাঁটাচামচ পর্যায়ের প্রয়োজনীয়তা এড়ায়।
  2. আমরা গ্রাহকদের তাদের মধ্যে আর একটি স্থির বিন্দু না রেখে অন্য গ্রাহকদের ফলাফলের জন্য অপেক্ষা করার অনুমতি দিই। কোনও গ্রাহক কেবল নির্ভর করে এমন কোনও গ্রাহকের ক্রম সংখ্যাটি দেখতে পারেন যে এটি নির্ভর করে। এটি পাইপলাইনে পর্যায়ে যোগদানের প্রয়োজনীয়তা এড়ায়।

স্মৃতি বাধা তুলনায়

এ সম্পর্কে ভাবার আরেকটি উপায় হ'ল কাঠামোগত, আদেশযুক্ত মেমোরি বাধা হিসাবে। যেখানে উত্পাদক বাধা লেখার বাধা তৈরি করে এবং গ্রাহক বাধা হ'ল পঠন বাধা।


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

আমার এখনও প্রশ্ন রয়েছে: (1) 'প্রতিশ্রুতিবদ্ধ' কীভাবে কাজ করে? (২) রিং বাফার পূর্ণ হলে নির্মাতারা কীভাবে সনাক্ত করতে পারেন যে সমস্ত গ্রাহক ডেটা দেখেছেন যাতে প্রযোজক পুনরায় এন্ট্রি ব্যবহার করতে পারেন?
কিওয়ারটি

@ কিওয়ার্টি, সম্ভবত একটি নতুন প্রশ্ন পোস্ট করা উপযুক্ত।
মাইকেল বার্কার

1
" শেডা " পড়ার পরিবর্তে শেডার তুলনায় শেষ বুলেট পয়েন্টের প্রথম সংখ্যাটি (সংখ্যা 2) হওয়া উচিত নয় "আমরা গ্রাহকদের তাদের মধ্যে" পাঠ্য "এর মধ্যে আরও একটি সারি স্তর স্থাপন করার সাথে অন্যান্য গ্রাহকদের ফলাফলের জন্য অপেক্ষা করার অনুমতি দিই আমরাও অনুমতি দিই গ্রাহকরা তাদের মধ্যে আরও একটি কাতারে পর্যায় না রেখেই অন্যান্য গ্রাহকদের ফলাফলের জন্য অপেক্ষা করতে হবে "(অর্থাত" "সাথে" "" ছাড়া "প্রতিস্থাপন করা উচিত)?
রানেকস

@ রুনিক্স, হ্যাঁ এটি করা উচিত।
মাইকেল বার্কার

135

প্রথমে আমরা এটির প্রস্তাবিত প্রোগ্রামিং মডেলটি বুঝতে চাই।

এক বা একাধিক লেখক রয়েছেন। এক বা একাধিক পাঠক রয়েছে। পুরানো থেকে নতুন পর্যন্ত পুরোপুরি অর্ডার করা এন্ট্রিগুলির একটি লাইন রয়েছে (বাম থেকে ডানে চিত্রিত)। লেখকরা ডান প্রান্তে নতুন এন্ট্রি যুক্ত করতে পারেন। প্রতিটি পাঠক বাম থেকে ডানে ধারাবাহিকভাবে এন্ট্রি পড়েন। স্পষ্টতই, পাঠকরা অতীতের লেখকগুলি পড়তে পারেন না।

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

সাধারণত পাঠকরা একযোগে এবং স্বতন্ত্রভাবে পড়তে পারেন। তবে আমরা পাঠকদের মধ্যে নির্ভরতা ঘোষণা করতে পারি। পাঠক নির্ভরতা নির্বিচারে অ্যাসাইক্লিক গ্রাফ হতে পারে। পাঠক বি যদি পাঠকের উপর নির্ভর করে তবে পাঠক বি অতীত পাঠক এ পড়তে পারবেন না A.

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

এটি প্রকৃতপক্ষে একটি আকর্ষণীয় প্রোগ্রামিং মডেল। পারফরম্যান্স নির্বিশেষে, একা মডেলটি প্রচুর অ্যাপ্লিকেশনগুলিতে উপকৃত হতে পারে।

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

আবর্জনা সংগ্রহের ব্যয় হ্রাস করার জন্য প্রবেশের বিষয়গুলি পূর্ব বরাদ্দ করা হয় এবং চিরকাল বেঁচে থাকে। আমরা নতুন এন্ট্রি অবজেক্টগুলি সন্নিবেশ করি না বা পুরানো এন্ট্রি অবজেক্টগুলি মুছব না, পরিবর্তে, কোনও লেখক প্রাক-বিদ্যমান প্রবেশের জন্য জিজ্ঞাসা করে, এর ক্ষেত্রগুলি জনবসতিযুক্ত করে এবং পাঠকদের অবহিত করে। এই আপাত 2-পর্বের ক্রিয়াটি সত্যই কেবল একটি পারমাণবিক ক্রিয়া

setNewEntry(EntryPopulator);

interface EntryPopulator{ void populate(Entry existingEntry); }

প্রাক-বরাদ্দ করা এন্ট্রিগুলি সংলগ্ন মেমরি কোষগুলিতে সংলগ্ন এন্ট্রিগুলি (খুব সম্ভবত) চিহ্নিত করাও বোঝায় এবং পাঠকরা ধারাবাহিকভাবে এন্ট্রিগুলি পড়েন, সুতরাং এটি সিপিইউ ক্যাশে ব্যবহার করা গুরুত্বপূর্ণ।

এবং লক, সিএএস, এমনকি মেমরি বাধা এড়াতে প্রচুর প্রচেষ্টা (যেমন শুধুমাত্র একজন লেখক থাকলে একটি অ-উদ্বায়ী ক্রম পরিবর্তনশীল ব্যবহার করুন)

পাঠকদের বিকাশকারীদের জন্য: লেখার যুক্তি এড়ানোর জন্য বিভিন্ন মন্তব্যকারী পাঠকদের বিভিন্ন ক্ষেত্রে লিখতে হবে। (প্রকৃতপক্ষে তাদের বিভিন্ন ক্যাশে লাইনে লিখতে হবে)) একটি মন্তব্যকারী পাঠকের এমন কিছু স্পর্শ করা উচিত নয় যা অন্য নির্ভরশীল পাঠকদের পড়তে পারে। এই জন্যই আমি এই পাঠকদের বলে annotate পরিবর্তে এন্ট্রি পরিবর্তন এন্ট্রি।


2
আমার কাছে ঠিক আছে। আমি টীকাটি ব্যবহার করতে পছন্দ করি।
মাইকেল বার্কার

21
+1 এটিই একমাত্র উত্তর যা বিঘ্নকারী প্যাটার্নটি বাস্তবে কীভাবে কাজ করে তা বর্ণনা করার চেষ্টা করে, যেমন ওপি বলেছিল।
জি-উইজ

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

1
@irreputable আপনি কি লেখকের পক্ষে একই ব্যাখ্যা লিখতে পারেন?
বুচি

আমি এটি পছন্দ করি কিন্তু আমি এটি পেয়েছি "একজন লেখক পূর্ব-বিদ্যমান প্রবেশের জন্য জিজ্ঞাসা করেছেন, এর ক্ষেত্রগুলিকে জনপ্রিয় করুন এবং পাঠকদের অবহিত করুন apparent এই 2-পর্যায়ের ক্রিয়াটি আসলেই কেবল একটি পারমাণবিক ক্রিয়া" বিভ্রান্তিকর এবং সম্ভবত ভুল? কোন "অবহিত" আছে না? এছাড়াও এটি পারমাণবিক নয় এটি কেবল একটি কার্যকর / দৃশ্যমান লেখা, সঠিক? দারুণ উত্তর কি দ্বিধাহীন?
0:30


17

আমি নিখুঁত কৌতূহলের বাইরে প্রকৃত উত্স অধ্যয়নের জন্য সময় নিয়েছি এবং এর পিছনে ধারণাটি বেশ সহজ। এই পোস্টটি লেখার সময় সবচেয়ে সাম্প্রতিক সংস্করণটি 3.2.1।

প্রাক-বরাদ্দ ইভেন্টগুলি এমন একটি বাফার সংরক্ষণ করছে যা গ্রাহকদের পড়ার জন্য ডেটা ধারণ করবে।

বাফারকে তার দৈর্ঘ্যের এক ধরণের পতাকা (পূর্ণসংখ্যার অ্যারে) দ্বারা ব্যাক করা হয় যা বাফার স্লটের উপলব্ধতা বর্ণনা করে (বিশদ জন্য আরও দেখুন)। অ্যারেটি একটি জাভা # অ্যাটমিকিন্টেজার অ্যারে এর মতো অ্যাক্সেস করা হয়, সুতরাং এই ব্যাখ্যাটির উদ্দেশ্যে আপনি এটিকে এক হিসাবে ধরে নিতে পারেন।

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

(যদি অনেক ভোক্তা থাকে তবে সর্বনিম্ন আইডি সহ কলটি চুসেন হয়))

এই আইডিগুলি তখন তুলনা করা হয়, এবং যদি উভয়ের মধ্যে পার্থক্য বাফার পার্শ্বের চেয়ে কম হয় তবে নির্মাতাকে লেখার অনুমতি দেওয়া হয়।

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

প্রযোজককে তার কল আইডের ভিত্তিতে বাফারে স্লট বরাদ্দ করা হয় (যা প্রডুসারক্যালআইডি মডুলো বাফারসাইজ হয়, তবে যেহেতু বাফারসাইজ সর্বদা 2 এর শক্তি (বাফার তৈরির ক্ষেত্রে সীমাবদ্ধ করা হয়), তাই ব্যবহৃত প্রকৃত অপারেশনটি প্রযোজকক্যালআইডি এবং (বাফারসাইজ - 1 ))। তারপরে that স্লটে ইভেন্টটি পরিবর্তন করা বিনামূল্যে free

(আসল অ্যালগরিদমটি আরও জটিল, সাম্প্রতিক গ্রাহককে ক্যাশে জড়িত optim অনুকূলকরণের উদ্দেশ্যে পৃথক পারমাণবিক রেফারেন্সে)

ইভেন্টটি সংশোধন করা হলে, পরিবর্তনটি "প্রকাশিত" হয়। পতাকা অ্যারেতে সম্পর্কিত স্লট প্রকাশের সময় আপডেট হওয়া পতাকাটি পূর্ণ হয়। পতাকা মানটি লুপের সংখ্যা (প্রফেসরক্যালআইডি আইটি বাফারসাইজ দ্বারা বিভক্ত (আবার যেহেতু বাফারসাইজ 2 পাওয়ার, প্রকৃত ক্রিয়াকলাপটি ডান শিফট))।

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

(একইভাবে যদি প্রযোজকক্যালআইডি এমনকি ভোক্তা কলআইডের মতো হয় তবে তার অর্থ ব্যারটি খালি এবং গ্রাহক অপেক্ষা করতে বাধ্য হয় waiting বিঘ্ন সৃষ্টিকারী সময়ে ওয়েটস্ট্রেজি দ্বারা অপেক্ষা করার পদ্ধতিটি সংজ্ঞায়িত করা হয়))

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

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

যদি একদল গ্রাহক একসাথে (শেয়ার আইডি জেনারেটর সহ) পড়ে থাকেন তবে প্রত্যেকে কেবল একটিই কলআইডি নেয় এবং কেবলমাত্র সেই একক কল আইডির স্লটটি পরীক্ষা করে ফিরে আসে।


7

এই নিবন্ধ থেকে :

বিঘ্নকারী প্যাটার্নটি একটি ব্যাচিংয়ের সারি যা একটি বৃত্তাকার অ্যারে দ্বারা ব্যাক আপ করা হয় (অর্থাত্ রিং বাফার) প্রাক বরাদ্দ স্থানান্তর বস্তুতে ভরা থাকে যা ক্রমগুলির মাধ্যমে উত্পাদক এবং ভোক্তাদের সুসংগত করতে মেমরি-বাধা ব্যবহার করে uses

স্মৃতি-প্রতিবন্ধকতাগুলি ব্যাখ্যা করা একরকম কঠিন এবং ত্রিশার ব্লগটি এই পোস্টের সাথে আমার মতে সেরা চেষ্টা করেছে: http://mechanitis.blogspot.com/2011/08/dissecting-disruptor-why-its-so-fast। এইচটিএমএল

তবে আপনি যদি নিম্ন-স্তরের বিশদটিতে ডুব দিতে না চান তবে আপনি কেবল জানতে পারবেন যে জাভাতে মেমরি-বাধাগুলি volatileকীওয়ার্ডের মাধ্যমে বা এর মাধ্যমে প্রয়োগ করা হয়েছে java.util.concurrent.AtomicLong। বিঘ্নকারী প্যাটার্ন সিকোয়েন্সগুলিAtomicLong এবং লকগুলির পরিবর্তে মেমোরি-বাধার মাধ্যমে প্রযোজক এবং গ্রাহকদের মাঝে এবং সামনে যোগাযোগ করা হয়।

আমি সহজে কোড মাধ্যমে একটি ধারণা বুঝতে, তাই নিচের কোড একটি সহজ এটি helloworld থেকে CoralQueue , একটি disruptor প্যাটার্ন CoralBlocks যা দিয়ে আমি সম্বন্ধযুক্ত করছি দ্বারা সম্পন্ন বাস্তবায়ন যা। নীচের কোডটিতে আপনি দেখতে পারেন যে বিঘ্নকারী প্যাটার্ন কীভাবে ব্যাচিং প্রয়োগ করে এবং কীভাবে রিং-বাফার (অর্থাত্ বিজ্ঞপ্তি অ্যারে) দুটি থ্রেডের মধ্যে আবর্জনামুক্ত যোগাযোগের অনুমতি দেয়:

package com.coralblocks.coralqueue.sample.queue;

import com.coralblocks.coralqueue.AtomicQueue;
import com.coralblocks.coralqueue.Queue;
import com.coralblocks.coralqueue.util.MutableLong;

public class Sample {

    public static void main(String[] args) throws InterruptedException {

        final Queue<MutableLong> queue = new AtomicQueue<MutableLong>(1024, MutableLong.class);

        Thread consumer = new Thread() {

            @Override
            public void run() {

                boolean running = true;

                while(running) {
                    long avail;
                    while((avail = queue.availableToPoll()) == 0); // busy spin
                    for(int i = 0; i < avail; i++) {
                        MutableLong ml = queue.poll();
                        if (ml.get() == -1) {
                            running = false;
                        } else {
                            System.out.println(ml.get());
                        }
                    }
                    queue.donePolling();
                }
            }

        };

        consumer.start();

        MutableLong ml;

        for(int i = 0; i < 10; i++) {
            while((ml = queue.nextToDispatch()) == null); // busy spin
            ml.set(System.nanoTime());
            queue.flush();
        }

        // send a message to stop consumer...
        while((ml = queue.nextToDispatch()) == null); // busy spin
        ml.set(-1);
        queue.flush();

        consumer.join(); // wait for the consumer thread to die...
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.