কেউ কি সরল পদে ব্যাখ্যা করতে পারেন যে বিঘ্নকারী প্যাটার্নটি কী?


33

আমি চাই আপনি যদি আমাকে সরল উপায়ে ব্যাখ্যা করতে পারেন তবে কীভাবে বিঘ্নকারী প্যাটার কাজ করে। এই ধারণাটি জানা হিসাবে আমার কাছে অধরা ছিল।

সম্ভবত আপনার সহায়তায় আমি এটি বুঝতে পারি।


উত্তর:


33

জালিয়া ধারা প্রদানকারীর একটি ভাল কার্তুজ, এবং এই ব্যাখ্যা:

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

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

এখানে চিত্র বর্ণনা লিখুন

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


9

সম্পর্কে এই নিবন্ধ থেকে CoralQueue :

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

সুতরাং উত্পাদক এবং গ্রাহকরা তাদের সম্পর্কিত অনুক্রমগুলি পরীক্ষা করে বিজ্ঞপ্তি অ্যারের ভিতরে একে অপরের দিকে পদক্ষেপ না করেন । এবং তাদের ক্রমগুলি একে অপরের সাথে যোগাযোগ করার জন্য তারা মেমোরি-বাধা ব্যবহার করে লকের পরিবর্তে ব্যবহার করে। এটি যোগাযোগের জন্য এটি দ্রুততম লক-ফ্রি উপায়।

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

package com.coralblocks.coralqueue.sample.queue;

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

public class Basics {

    public static void main(String[] args) {

        final Queue<StringBuilder> queue = new AtomicQueue<StringBuilder>(1024, new Builder<StringBuilder>() {
            @Override
            public StringBuilder newInstance() {
                return new StringBuilder(1024);
            }
        });

        Thread producer = new Thread(new Runnable() {

            private final StringBuilder getStringBuilder() {
                StringBuilder sb;
                while((sb = queue.nextToDispatch()) == null) {
                    // queue can be full if the size of the queue
                    // is small and/or the consumer is too slow

                    // busy spin (you can also use a wait strategy instead)
                }
                return sb;
            }

            @Override
            public void run() {

                StringBuilder sb;

                while(true) { // the main loop of the thread

                    // (...) do whatever you have to do here...

                    // and whenever you want to send a message to
                    // the other thread you can just do:
                    sb = getStringBuilder();
                    sb.setLength(0);
                    sb.append("Hello!");
                    queue.flush();

                    // you can also send in batches to increase throughput:
                    sb = getStringBuilder();
                    sb.setLength(0);
                    sb.append("Hi!");

                    sb = getStringBuilder();
                    sb.setLength(0);
                    sb.append("Hi again!");

                    queue.flush(); // dispatch the two messages above...
                }
            }
        }, "Producer");

        Thread consumer = new Thread(new Runnable() {

            @Override
            public void run() {

                while (true) { // the main loop of the thread

                    // (...) do whatever you have to do here...

                    // and whenever you want to check if the producer
                    // has sent a message you just do:

                    long avail;
                    while((avail = queue.availableToPoll()) == 0) {
                        // queue can be empty!
                        // busy spin (you can also use a wait strategy instead)
                    }

                    for(int i = 0; i < avail; i++) {
                        StringBuilder sb = queue.poll();
                        // (...) do whatever you want to do with the data
                        // just don't call toString() to create garbage...
                        // copy byte-by-byte instead...
                    }
                    queue.donePolling();
                }
            }
        }, "Consumer");

        consumer.start();
        producer.start();
    }
}

দাবি অস্বীকার : আমি কোরাল কিউয়ের অন্যতম বিকাশকারী।


1
আপনি যে সফ্টওয়্যারটি বর্ণনা করেছেন তার সাথে আপনার সংযুক্তিটি বিবরণ দিতে ভাল লাগবে।
হরিণ হান্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.