簡體   English   中英

RxJava:從 NoSql DB 異步保存和檢索數據的推薦發射器是什么(即反應式方法)

[英]RxJava: what is the recommended emitter for saving and retrieving data from NoSql DB asynchronously (i.e. reactive approach)

背景:這是我第一次使用 RxJava。

當使用 RxJava 編碼 (1) select 文檔從 NoSql DB 和 (2) 插入到 NoSql (ex. MongoDb) 中的反應是什么?

例如,我通常應該更喜歡使用 Flowable 來閱讀,而使用 Single 來保存嗎?

此代碼可以完美地保存從 Kafka 主題收到的消息到 MongoDb 但我想知道 io.reactivex.Single 是否真的是完成它的最佳方法。

import com.mongodb.client.result.InsertOneResult
import com.mongodb.reactivestreams.client.MongoClient
import com.mongodb.reactivestreams.client.MongoCollection
import io.micronaut.configuration.kafka.annotation.KafkaKey
import io.micronaut.configuration.kafka.annotation.KafkaListener
import io.micronaut.configuration.kafka.annotation.OffsetReset
import io.micronaut.configuration.kafka.annotation.Topic
import io.micronaut.messaging.annotation.Body
import io.reactivex.Observable
import io.reactivex.Single
import javax.inject.Inject
import io.reactivex.functions.Function

@KafkaListener(offsetReset = OffsetReset.EARLIEST)
class DebitConsumer {

    @Inject
    lateinit var mongoClient: MongoClient

    @Topic("debit")
    fun receive(@KafkaKey key: String, name: String) {

        save(key.toInt(), name)

    }

    private fun save( id: Int?,name: String?) {
        val debitMessage =  DebitMessage(id, name)
        Single
                .fromPublisher(getCollection().insertOne(debitMessage))
                .map<DebitMessage>(Function<InsertOneResult, DebitMessage> { debitMessage })
                .subscribe()
    }

    private fun getCollection(): MongoCollection<DebitMessage?> {
        return mongoClient
                .getDatabase("mydb")
                .getCollection("mycollection", DebitMessage::class.java)
    }
}

我來自 Spring 數據,這在反應性世界中有點直截了當,因為與此問題無關的原因,我不會使用 Spring,我正在尋找在反應性/無阻塞/背壓世界上寫入/讀取數據時的最佳實踐.

你的代碼看起來不錯。 Single對保存有意義,因為您只會得到一個結果。 Flowable對閱讀有意義,但實際上選擇取決於您和您的應用程序。 您想通過Change Streams監聽數據庫更改嗎? 然后您將不得不使用Flowable ,以便您可以對 stream 中的多個更新做出反應。 使用Flowable可能是一個好習慣,即使目前您不收聽多個更新,但您認為將來可能會這樣做。

如果您確定您只想處理 1 個事件,請使用Single 它將為您在處理多個事件的可能性的應用程序代碼中節省一些精力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM