Spring MVC アプリケーションの動作を再考しています。データベースからデータをプルする(Java8 ストリーム) か、データベースにデータをプッシュ(リアクティブ/オブザーバブル) させ、バックプレッシャーを使用して量を制御する方がよいかどうかです。
現在の状況:
User
最新の 30 件の記事をリクエストするService
データベース クエリを実行し、30 個の結果をList
Jackson
を繰り返し処理しList
、JSON 応答を生成します
なぜ実装を切り替えるのですか?
これらの 30 個のオブジェクトを常にメモリに保持しているため、かなりメモリを消費します。アプリケーションは一度に 1 つのオブジェクトを処理するため、これは必要ありません。ただし、アプリケーションは1 つのオブジェクトを取得して処理し、破棄して次のオブジェクトを取得できる必要があります。
Java8 ストリーム? (引く)
これjava.util.Stream
は非常に簡単です。は、バックグラウンドでデータベース カーソルを使用する をService
作成します。の 1 つの要素の JSON 文字列を書き込むStream
たびに、次の要素を要求し、データベース カーソルをトリガーして次のエントリを返します。Jackson
Stream
RxJava / リアクティブ / オブザーバブル? (押す)
ここでは逆のシナリオがあります。データベースはエントリごとにプッシュする必要があり、メソッドが呼び出されるJackson
まで各要素の JSON 文字列を作成する必要があります。onComplete
つまり、Controller
は にService
:をくださいObservable<Article>
。次にJackson
、処理できる限り多くのデータベース エントリを要求できます。
相違点と懸念事項:
次のデータベース エントリを要求してから取得/処理するまでにStreams
は、常に多少の遅延があります。これにより、ネットワーク接続が遅い場合、または応答を満たすために大量のデータベース要求を行う必要がある場合、JSON 応答時間が遅くなる可能性があります。
そこを使用RxJava
すると、常に処理可能なデータが必要になります。また、それが多すぎる場合は、バックプレッシャーを使用して、データベースからアプリケーションへのデータ転送を遅くすることができます。最悪のシナリオでは、バッファ/キューには要求されたすべてのデータベース エントリが含まれます。次に、メモリ消費量は、List
.
なぜ私は尋ねているのですか / 私は何を求めているのですか?
私は何を取りこぼしたか?他に長所/短所はありますか?
各データベース要求/応答間に常に (短い) 遅延がある場合、(特に) Spring Data Team
Stream
がデータベースからの応答をサポートするように API を拡張したのはなぜですか? これにより、要求されたエントリが大量になると、顕著な遅延が発生する可能性があります。RxJava
このシナリオでは (または他のリアクティブな実装) を使用することをお勧めしますか? または、欠点を見逃しましたか?