Gözlemlenebilir vs Akışkan rxJava2


128

Yeni rx java 2'ye bakıyordum ve backpressureartık fikrini anladığımdan pek emin değilim ...

Sahip olduğumuz farkındayım Observableo yok backpressuredestek ve Flowableo var.

Örneğin dayalı Yani, söylüyorlar sağlar flowableile 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
                }
            });

Bu yaklaşık 128 değerden sonra çökecek ve bu oldukça açık ki, öğeleri almaktan daha yavaş tüketiyorum.

Ama sonra aynı şeye sahibiz 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
                }
            });

Bu, tüketmeye biraz gecikme koysam bile hala işe yarıyor. İş yapmak için operatörü Flowablekoyduğumu söyleyelim onBackpressureDrop, çökme gitti ama tüm değerler de gönderilmiyor.

Yani şu anda kafamda cevabını bulamadığım temel soru, neden backpressuresade kullanabileceğimi umursamalıyım , Observableyine de tüm değerleri yönetmeden buffer? Ya da belki diğer taraftan, backpressuretüketiciyi yönetme ve idare etme lehine bana ne gibi avantajlar sağlıyor ?


Yanıtlar:


123

Geri Flowable.observeOnbasıncın pratikte ortaya çıkardığı şey sınırlı tamponlardır, dowstream'in alabildiği kadar hızlı boşaltılan 128 elemanlı bir tampona sahiptir. Bursty kaynağı işlemek için bu tampon boyutunu ayrı ayrı artırabilirsiniz ve tüm geri basınç yönetimi uygulamaları 1.x'ten itibaren hala geçerlidir. Observable.observeOnöğeleri toplamaya devam eden sınırsız bir arabelleğe sahiptir ve uygulamanızın belleği yetersiz kalabilir.

ObservableÖrneğin şunları kullanabilirsiniz :

  • GUI olaylarını işleme
  • kısa dizilerle çalışma (toplam 1000 öğeden az)

FlowableÖrneğin şunları kullanabilirsiniz :

  • soğuk ve zamanlanmamış kaynaklar
  • kaynaklar gibi jeneratör
  • ağ ve veritabanı erişimcileri

Bu gelip sahip olduğundan başka bir soru - bu gibi o daha kısıtlı türlerini düzeltmek olduğunu Maybe, Singleve Completableolabilir hep yerine kullanılabilecek Flowableonlar anlam mülk zaman?
david.mihola

1
Evet, Maybe, Singleve Completablevardır uzakta çok küçük geri-basınç kavramının herhangi bir ihtiyaç için. Bir üreticinin eşyaları tüketilebileceklerinden daha hızlı yayma şansı yoktur, çünkü 0-1 ürün üretilecek veya tüketilecektir.
AndrewF

Belki haklı değilim, ama benim için Akışkan ve Gözlemlenebilir Örnekleri değiştirilmeli.
Yura Galavay

Soruda Flowable'a sağlamamız gereken geri basınç stratejisini kaçırdığını düşünüyorum, bu eksik geri basınç istisnasının neden atıldığını açıklıyor ve bu istisnanın .onBackpressureDrop () uygulandıktan sonra neden ortadan kalktığını da açıklıyor. Ve Gözlemlenebilir için, bu stratejiye sahip olmadığı ve sağlanamayacağı için, daha sonra OOM
Haomin

111

Geri basınç, gözlemlenebilir (yayıncınız) abonenizin idare edebileceğinden daha fazla olay oluşturmasıdır. Böylece abonelerin olayları kaçırmasını sağlayabilir veya sonunda hafızanın bitmesine neden olan büyük bir olay kuyruğu elde edebilirsiniz. Flowablegeri basıncı dikkate alır. Observabledeğil. Bu kadar.

bana çok fazla sıvı taştığı zaman huniyi hatırlatıyor. Flowable, bunun gerçekleşmemesine yardımcı olabilir:

muazzam geri tepme basıncı ile:

görüntü açıklamasını buraya girin

ancak akışkan kullanımla çok daha az karşı basınç oluşur:

görüntü açıklamasını buraya girin

Rxjava2, kullanım durumunuza bağlı olarak kullanabileceğiniz birkaç geri basınç stratejisine sahiptir. Strateji ile demek istiyorum ki, Rxjava2, taşma (geri basınç) nedeniyle işlenemeyen nesneleri işlemek için bir yol sağlar.

işte stratejiler. Hepsini gözden geçirmeyeceğim, ancak örneğin, taşan öğeler için endişelenmek istemiyorsanız, bunun gibi bir bırakma stratejisi kullanabilirsiniz:

observable.toFlowable (BackpressureStrategy.DROP)

Bildiğim kadarıyla kuyrukta 128 öğe limiti olmalı, bundan sonra bir taşma (geri basınç) olabilir. 128 olmasa bile bu sayıya yakın. Umarım bu birine yardımcı olur.

arabellek boyutunu 128'den değiştirmeniz gerekirse, şu şekilde yapılabilir gibi görünür (ancak herhangi bir bellek kısıtlamasına dikkat edin:

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

Yazılım geliştirmede genellikle geri basınç stratejisi, yayıcıya, yayıcı olaylarınızın hızıyla başa çıkamayacağı için biraz yavaşlamasını söylemeniz anlamına gelir.


Her zaman geri
basıncın

Durum olabilir. Evet
j2emanue

Flowable kullanmanın herhangi bir dezavantajı var mı?
IgorGanapolsky

Bu görüntüler bana yalan söylüyor. Olayları iptal etmek, altta "daha fazla para" ile bitmez.
EpicPandaForce

1
@ j2emanue, operatörler ve Flowable.buffer (int) operatörü için arabellek boyutunu karıştırıyorsunuz. Lütfen javadocları dikkatlice okuyun ve cevabınızı buna göre düzeltin: reactivex.io/RxJava/2.x/javadoc/io/reactivex/Flowable.html
tomek

15

Geri Flowablebasınç işleme olmadan 128 değer gönderdikten sonra çökmeniz, tam olarak 128 değerden sonra her zaman çökeceği anlamına gelmez: bazen 10'dan sonra çökecek ve bazen hiç çarpmayacaktır. Örneği denediğinizde olanın bu olduğuna inanıyorum Observable- geri basınç yoktu, bu yüzden kodunuz normal çalıştı, bir dahaki sefere çalışmayabilir. RxJava 2'deki fark, artık s'de geri basınç kavramının Observableolmaması ve bunun üstesinden gelmenin bir yolu olmamasıdır. Muhtemelen açık geri basınç işleme gerektirecek reaktif bir sekans tasarlıyorsanız - o zaman Flowableen iyi seçiminiz budur.


Evet, bazen daha az değerden sonra kırıldığını, bazen bozulmadığını gözlemledim. Ama yine, örneğin sadece intervalonsuz backpressurebaşa çıkıyorsam, bazı tuhaf davranışlar veya sorunlar bekler miyim?
user2141889

Belirli bir Gözlemlenebilir dizide geri basınç sorunlarının meydana gelmeyeceğinden eminseniz - o zaman geri basıncı göz ardı etmenin bir sakıncası yok sanırım.
Egor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.