2016-10-29 10 views
64

मैं नए rx जावा 2 को देखकर किया गया है और मैं काफी यकीन है कि मैं अब और backpressure के विचार को समझ में नहीं हूँ ...प्रत्यक्ष बनाम flowable rxJava2

मुझे पता है कि हम Observable है कर रहा हूँ कि backpressure नहीं है समर्थन और Flowable जिसमें यह है।

इसलिए उदाहरण के आधार पर, मान लीजिए कि मैं flowableinterval साथ:

 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 मूल्यों के बाद दुर्घटना करने जा रहा है, और thats बहुत स्पष्ट मैं हो रही वस्तुओं की तुलना में धीमी लेने वाली हूँ।

लेकिन फिर हम एक ही 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 क्या फायदे उपभोग करने के प्रबंधन और प्रबंधन के पक्ष में देते हैं?

उत्तर

61

अभ्यास में कौन सा बैकप्रेसर प्रकट होता है बफर बाध्य होता है, Flowable.observeOn में 128 तत्वों का एक बफर होता है जो डॉवस्ट्रीम इसे जितना तेज़ कर सकता है उतना तेज़ हो जाता है। आप विस्फोट स्रोत को संभालने के लिए व्यक्तिगत रूप से इस बफर आकार को बढ़ा सकते हैं और सभी बैकप्रेसर-प्रबंधन प्रथाएं अभी भी 1.x से लागू होती हैं। Observable.observeOn में एक असंबद्ध बफर है जो तत्वों को एकत्र करता रहता है और आपका ऐप स्मृति से बाहर हो सकता है।

उदाहरण के लिए आप Observable उपयोग कर सकते हैं:

:

  • निपटने जीयूआई घटनाओं
  • कम दृश्यों (कम 1000 से कुल तत्वों)

के साथ काम कर उदाहरण के लिए आप Flowable उपयोग कर सकते हैं

  • ठंड और गैर-समय वाले स्रोत
  • जनरेटर सूत्रों
  • नेटवर्क और डेटाबेस की तरह पहुंचकर्ता
+0

चूंकि यह आया है [दूसरे प्रश्न में] (http://stackoverflow.com/questions/42525623/rxjava-2-x-should-i-use-flowable-or-single - अपूर्ण) - क्या यह सही है कि 'होवर',' सिंगल 'और' कॉम्प्लेटेबल 'जैसे अधिक प्रतिबंधित प्रकार * फ्लोवेबल' के बजाय * हमेशा * उपयोग किए जा सकते हैं जब वे अर्थात् उपयुक्त हैं? –

8

तथ्य यह है कि अपने Flowable backpressure से निपटने के बिना 128 मूल्यों उत्सर्जन के बाद दुर्घटनाग्रस्त हो गया मतलब यह नहीं है यह हमेशा बिल्कुल 128 मूल्यों के बाद दुर्घटना देगा: कभी कभी यह 10 के बाद दुर्घटना होगा, और कभी कभी यह बिल्कुल क्रैश नहीं करेंगे। मेरा मानना ​​है कि यह तब हुआ जब आपने Observable के साथ उदाहरण की कोशिश की - कोई बैकप्रेस नहीं हुआ, इसलिए आपका कोड सामान्य रूप से काम करता था, अगली बार ऐसा नहीं हो सकता था। आरएक्सजेवा 2 में अंतर यह है कि Observable एस में बैकप्रेसर की कोई अवधारणा नहीं है, और इसे संभालने का कोई तरीका नहीं है। यदि आप एक प्रतिक्रियाशील अनुक्रम तैयार कर रहे हैं जिसे शायद स्पष्ट बैकप्रेसर हैंडलिंग की आवश्यकता होगी - तो Flowable आपकी सबसे अच्छी पसंद है।

+0

हाँ मैं देखा है कि कभी कभी यह कम मूल्यों के बाद तोड़ दिया, कभी कभी ऐसा नहीं हुआ। लेकिन फिर अगर उदाहरण के लिए मैं 'बैकप्रेसर' के बिना केवल 'अंतराल' को संभालने में सक्षम हूं, तो क्या मुझे कुछ अजीब व्यवहार या मुद्दों की उम्मीद होगी? – user2141889

+0

यदि आप सुनिश्चित हैं कि बैकप्रेस समस्या किसी विशिष्ट पर्यवेक्षण अनुक्रम में नहीं हो सकती है - तो मैं अनुमान लगाएं बैकप्रेसर को अनदेखा करना ठीक है। – Egor

26

Backpressure है जब आपके नमूदार (प्रकाशक) अधिक घटनाओं की तुलना में अपने ग्राहक संभाल कर सकते हैं पैदा कर रही है। तो आप ग्राहकों को घटनाओं को याद कर सकते हैं, या आप घटनाओं की एक बड़ी कतार प्राप्त कर सकते हैं जो अंततः स्मृति से बाहर निकलता है। Flowable बैप्रप्रेस को ध्यान में रखता है। Observable नहीं करता है। बस।

यह मुझे एक फनल की याद दिलाता है, जब इसमें बहुत अधिक तरल अतिप्रवाह होता है।

जबरदस्त backpressure साथ

: flowable नहीं कि ऐसा साथ मदद कर सकते हैं

enter image description here

Rxjava2 में कुछ है:

enter image description here

लेकिन flowable उपयोग करने के साथ, वहाँ बहुत कम backpressure है बैकप्रेसर रणनीतियों का उपयोग आप अपने उपयोगकेस के आधार पर कर सकते हैं। रणनीति से मेरा मतलब है कि आरएक्सजेवा 2 उन वस्तुओं को संभालने का एक तरीका प्रदान करता है जिन्हें अतिप्रवाह (बैकप्रेस) के कारण संसाधित नहीं किया जा सकता है।

here are the strategies. मैं अभ्यस्त उन सब के माध्यम से जाना है, लेकिन उदाहरण के लिए यदि आप आइटम है कि आप इस तरह एक बूंद रणनीति का उपयोग कर सकते overflowed कर रहे हैं के बारे में चिंता नहीं करना चाहते हैं:

observable.toFlowable (BackpressureStrategy.DROP)

जहां तक ​​मुझे पता है कि कतार पर 128 आइटम सीमा होनी चाहिए, उसके बाद एक ओवरफ्लो (बैकप्रेसर) हो सकता है। यहां तक ​​कि अगर 128 उस संख्या के करीब नहीं है। उम्मीद है कि यह किसी की मदद करता है।

अगर आप 128 ऐसा लगता है कि इसे इस तरह किया जा सकता है से बफर आकार बदलने के लिए (लेकिन घड़ी किसी भी स्मृति की कमी की जरूरत है:

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

मैंने हमेशा सोचा था कि बैकप्रेस एक तंत्र के परिवार के लिए नाम है जो उपभोक्ता को धीमा करने के लिए निर्माता को सूचित करेगा ... – kboom

+0

मामला हो सकता है। हां – j2emanue

+0

क्या फ़्लोएबल का उपयोग करने के लिए कोई डाउनसाइड्स है? –

संबंधित मुद्दे