পর্যবেক্ষণযোগ্য বনাম ফ্লোবল rxJava2


128

আমি নতুন আরএক্স জাভা 2 এর দিকে চেয়ে দেখছি এবং আমি নিশ্চিত নই যে আমি backpressureআর ধারণাটি বুঝতে পেরেছি ...

আমি সচেতন যে আমাদের আছে Observableযে backpressureসমর্থন করে না এবং Flowableএটি আছে।

সুতরাং উদাহরণের উপর ভিত্তি করে, আসুন বলতে পারি যে আমার flowableসাথে রয়েছে interval:

        Flowable.interval(1, TimeUnit.MILLISECONDS, Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                    // do smth
                }
            });

এটি প্রায় 128 টি মানের পরে ক্র্যাশ হতে চলেছে, এবং এটি স্পষ্টতই আমি আইটেমগুলি পাওয়ার চেয়ে ধীর গ্রাস করছি।

তবে তারপরেও আমাদের একই আছে Observable

     Observable.interval(1, TimeUnit.MILLISECONDS, Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                    // do smth
                }
            });

এটি মোটেও ক্রাশ হবে না, এমনকি আমি এটি ব্যবহারে কিছুটা বিলম্ব করলেও এটি কার্যকর হয়। Flowableকাজ করার জন্য আমি বলি যে আমি onBackpressureDropঅপারেটর রেখেছি , ক্রাশ চলে গেছে তবে সমস্ত মান হয় না।

সুতরাং বর্তমানে আমার মাথায় যে উত্তর প্রশ্নটি পাওয়া যায় না তা উত্তর খুঁজে পাচ্ছি না কেন আমি backpressureযখন প্লেইন ব্যবহার করতে পারি তখন কেন Observableপরিচালনা না করে সমস্ত মান পাওয়া যায় buffer? অথবা হতে পারে অন্য দিক থেকে, backpressureগ্রাহকদের পরিচালনা ও পরিচালনার পক্ষে আমাকে কী সুবিধা দেয় ?


উত্তর:


123

অনুশীলনে ব্যাকপ্রেসার যা উদ্ভাসিত করে তা বেঁধে দেওয়া বাফার হয়, Flowable.observeOnএতে 128 উপাদান রয়েছে যা ডাউনস্ট্রিম যত তাড়াতাড়ি গ্রহণ করতে পারে তত দ্রুত নিকাশিত হয়ে যায়। বার্সি উত্সটি পরিচালনা করতে আপনি স্বতন্ত্রভাবে এই বাফার আকারটি বাড়িয়ে তুলতে পারেন এবং সমস্ত ব্যাকপ্রেসার-পরিচালনা পদ্ধতিগুলি এখনও 1.x থেকে প্রযোজ্য। Observable.observeOnএকটি আনবাউন্ডেড বাফার রয়েছে যা উপাদানগুলি সংগ্রহ করে রাখে এবং আপনার অ্যাপ্লিকেশনটির স্মৃতিশক্তি কমতে পারে।

আপনি Observableউদাহরণস্বরূপ ব্যবহার করতে পারেন :

  • জিইউআই ইভেন্টগুলি পরিচালনা করছে
  • সংক্ষিপ্ত সিকোয়েন্সগুলির সাথে কাজ করা (মোট 1000 টিরও কম উপাদান)

আপনি Flowableউদাহরণস্বরূপ ব্যবহার করতে পারেন :

  • ঠান্ডা এবং অ-সময়সীমার উত্স
  • উত্স মত জেনারেটর
  • নেটওয়ার্ক এবং ডাটাবেস অ্যাক্সেসর

যেহেতু এই নিয়ে আসা হয়েছে অপর এক প্রশ্নের মধ্যে - এটা সংশোধন করে মত আরো সীমাবদ্ধ ধরনের Maybe, Singleএবং Completableপারেন সবসময় পরিবর্তে ব্যবহার করা যেতে Flowableযখন তারা শব্দার্থগতভাবে উপযুক্ত?
ডেভিড.মিহোলা

1
হ্যাঁ, Maybe, Single, এবং Completableহয় পর্যন্ত খুব backpressure ধারণার কোন প্রয়োজন আছে ছোট। কোনও প্রযোজক আইটেম সেগুলি গ্রহণের চেয়ে দ্রুত নির্গমন করার কোনও সম্ভাবনা নেই, যেহেতু 0-1 আইটেমগুলি কখনও উত্পাদিত বা গ্রাস করা হবে।
অ্যান্ড্রুএফ

সম্ভবত আমি সঠিক নই, তবে আমার জন্য প্রবাহযোগ্য এবং পর্যবেক্ষণযোগ্য উদাহরণগুলি সরিয়ে নেওয়া উচিত।
ইউরা গ্যালায়ে

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

111

ব্যাকপ্রেশারটি যখন আপনার পর্যবেক্ষক (প্রকাশক) আপনার গ্রাহকরা পরিচালনা করতে পারে তার চেয়ে বেশি ইভেন্ট তৈরি করে। সুতরাং আপনি গ্রাহকগণকে হারিয়ে যাওয়া ইভেন্টগুলি পেতে পারেন বা আপনি ইভেন্টগুলির একটি বিশাল সারি পেতে পারেন যা শেষ পর্যন্ত স্মৃতি থেকে বেরিয়ে আসে। Flowableবিবেচনায় backpressure লাগে। Observableনা. এটাই.

এটি আমাকে এমন ফানেলের কথা মনে করিয়ে দেয় যা যখন এতে খুব বেশি তরল ওভারফ্লো হয়। প্রবাহমান এমনটি না ঘটায় সহায়তা করতে পারে:

অসাধারণ ব্যাকপ্রেসার সহ:

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

তবে প্রবাহমান ব্যবহারের সাথে ব্যাকপ্রেসার অনেক কম থাকে:

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

আরএক্সজাভা 2 এর কয়েকটি ব্যাকপ্রেসার কৌশল রয়েছে যা আপনি আপনার ইউজকেসের উপর নির্ভর করে ব্যবহার করতে পারেন। কৌশল অনুসারে আমি বোঝাতে চাইছি Rxjava2 ওভারফ্লো (ব্যাকপ্রেসার) এর কারণে প্রক্রিয়াজাত হতে পারে না এমন জিনিসগুলি পরিচালনা করার জন্য একটি উপায় সরবরাহ করে।

কৌশল এখানে। আমি তাদের সকলের মধ্য দিয়ে যাব না, তবে উদাহরণস্বরূপ যদি আপনি উপচে পড়া আইটেমগুলির বিষয়ে চিন্তা না করতে চান তবে আপনি ড্রপ কৌশলটি ব্যবহার করতে পারেন:

observable.toFlowable (BackpressureStrategy.DROP)

আমি যতদূর জানি কাতারে একটি 128 আইটেম সীমা থাকা উচিত, এর পরে সেখানে একটি ওভারফ্লো (ব্যাকপ্রেসার) থাকতে পারে। এমনকি যদি এটির সংখ্যাটি 128 না হয় তবে এটি খুব কাছে। আশা করি এটি কাউকে সাহায্য করবে।

আপনার যদি বাফার আকারটি 128 থেকে পরিবর্তন করতে হয় তবে মনে হচ্ছে এটি এটির মতো করা যায় (তবে কোনও স্মৃতি সীমাবদ্ধতা দেখুন:

myObservable.toFlowable(BackpressureStrategy.MISSING).buffer(256); //but using MISSING might be slower.  

সফ্টওয়্যার বিকাশে সাধারণত ব্যাক প্রেসের কৌশল মানে আপনার প্রেরককে কিছুটা ধীর করতে বলা কারণ গ্রাহক আপনার নির্গমন ইভেন্টগুলি বেগটি পরিচালনা করতে পারে না।


আমি সবসময়ই ভাবতাম ব্যাকপ্রেসার এমন একটি পদ্ধতির পরিবারের নাম যা গ্রাহক প্রযোজককে ধীর হতে দেয় ...
kboom

কেস হতে পারে। হ্যাঁ
j2emanue

কোনও ফ্লোবেবল ব্যবহার করার জন্য কি কোনও ডাউনসাইড রয়েছে?
ইগোরগানাপলস্কি

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

1
@ j2emanue, আপনি অপারেটর এবং ফ্লোয়েবল.বফার (ইন্ট) অপারেটরের জন্য বাফার আকারটি বিভ্রান্ত করছেন। দয়া করে জাভাডোকগুলি ক্যাফেতে পড়ুন এবং সেই অনুযায়ী আপনার উত্তরটি ঠিক করুন: বিক্রিয়াএক্স.আইও
আরএক্স জাভা

15

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


হ্যাঁ আমি লক্ষ্য করেছি যে কখনও কখনও এটি কম মানগুলির পরে ভেঙে যায়, কখনও কখনও তা হয় নি। তবে আবার যদি উদাহরণস্বরূপ আমি কেবল পরিচালনা intervalনা করেই backpressureকি কিছু অদ্ভুত আচরণ বা সমস্যা আশা করব?
ব্যবহারকারী 2141889

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