正常に機能している単純なバッチプロセスがあります。最近、レポートを生成するための新しいバッチプロセスを実装するための新しい要件があります。このレポートを作成するために読み取るデータのソースは異なります。具体的には、レポートごとに1つのビューがある場合があります。
ここで、このプロセスをスケーリングして、できるだけ早くスケーリングして完了することができるようにします。
私はマルチスレッドステップに精通していますが、他の戦略(リモートチャンクとパーティションステップ)と、どちらをいつ使用するかについてはよくわかりません。
私たちの場合、処理+ファイルへの書き込みは、読み取りよりも多くのリソースインセンティブです。
そのような場合、どちらのアプローチが最も適しています。
または、dbからのデータの読み取りが、ファイルへの書き込み+処理と同じリソースインセンティブであることがわかった場合、このプロセスを改善/スケーリングするための最良のオプションは何ですか。
TLDR;
あなたの説明に基づいて、処理と書き込みはステップのより高価な部分であると述べているので、同期リーダーを使用したマルチスレッドステップを試すことができると思います。
ただし、リーダーはデータベースであるため、パーティション化されたステップを構成して機能させることは非常に有益だと思います。セットアップにはもう少し作業が必要ですが、長期的には拡張性が向上します。
用途:
使用しないでください:
マルチスレッドステップは、Spring Batchで採用されている チャンク指向の処理 を利用します。ステップをマルチスレッド化すると、Spring Batchがそれ自体のスレッドでチャンク全体を実行できるようになります。これは、データのチャンクの読み取り-プロセス-書き込みサイクル全体が並行して発生することを意味することに注意してください。これは、データを処理するための保証された順序がないことを意味します。また、これはnotステートフルItemReadersで機能することにも注意してください( JdbcCursorItemReader および JdbcPagingItemReader は両方ともステートフルです)。
用途:
使用しないでください:
ステートフルアイテムリーダーでマルチスレッドステップを使用できないという制限を回避する方法が1つあります。あなたは彼らのread()
メソッドをsynchronize
することができます。これにより、基本的に読み取りが連続して発生しますが(ただし、順序は保証されません)、処理と書き込みを並行して実行できます。これは、読み取りがボトルネックではなく、処理または書き込みがボトルネックである場合に適したオプションです。
用途:
使用しないでください:
ステップのパーティション化は、マルチスレッドステップとは少し異なる動作をします。パーティション化されたステップを使用すると、実際には完全に異なる StepExecutions があります。各StepExecutionは、データの独自のパーティションで機能します。このように、各リーダーはデータの特定のスライスのみを参照しているため、リーダーは同じデータの読み取りに問題がありません。この方法は非常に強力ですが、マルチスレッドステップよりもセットアップが複雑です。
用途:
使用しないでください:
リモートチャンクは非常に高度なSpringBatchの使用法です。メッセージを送受信するには、何らかの形式の耐久性のあるミドルウェア(JMSまたはAMQPなど)が必要です。リモートチャンクを使用すると、読み取りは引き続きシングルスレッドですが、各チャンクが読み取られると、処理のために別のJVMに送信されます。実際には、これはマルチスレッドステップの動作と非常に似ていますが、リモートチャンクは複数のthreadではなく、複数のprocessを利用できます。つまり、リモートチャンクを使用すると、アプリケーションを垂直方向にスケーリングするのではなく、水平方向にスケーリングできます。 (TBHリモートチャンクの実装を検討している場合は、Hadoopのようなものを検討することを検討する必要があると思います。)
用途:
使用しないでください:
並列ステップは、独立して実行できるステップが1つ以上ある場合に役立ちます。 Spring Batchを使用すると、ステップを別々のスレッドで簡単に並行して実行できます。