web-dev-qa-db-ja.com

最高のSpringバッチスケーリング戦略

正常に機能している単純なバッチプロセスがあります。最近、レポートを生成するための新しいバッチプロセスを実装するための新しい要件があります。このレポートを作成するために読み取るデータのソースは異なります。具体的には、レポートごとに1つのビューがある場合があります。

ここで、このプロセスをスケーリングして、できるだけ早くスケーリングして完了することができるようにします。

私はマルチスレッドステップに精通していますが、他の戦略(リモートチャンクとパーティションステップ)と、どちらをいつ使用するかについてはよくわかりません。

私たちの場合、処理+ファイルへの書き込みは、読み取りよりも多くのリソースインセンティブです。

そのような場合、どちらのアプローチが最も適しています。

または、dbからのデータの読み取りが、ファイルへの書き込み+処理と同じリソースインセンティブであることがわかった場合、このプロセスを改善/スケーリングするための最良のオプションは何ですか。

12
user509755

TLDR;

あなたの説明に基づいて、処理と書き込みはステップのより高価な部分であると述べているので、同期リーダーを使用したマルチスレッドステップを試すことができると思います。

ただし、リーダーはデータベースであるため、パーティション化されたステップを構成して機能させることは非常に有益だと思います。セットアップにはもう少し作業が必要ですが、長期的には拡張性が向上します。

マルチスレッドステップ

用途:

  • 個々のステップをスピードアップ
  • リーダー(JMSまたはAMQPなど)で負荷分散を処理できる場合
  • 読み取られるデータを手動で分割するカスタムリーダーを使用する場合

使用しないでください:

  • ステートフルアイテムリーダー

マルチスレッドステップは、Spring Batchで採用されている チャンク指向の処理 を利用します。ステップをマルチスレッド化すると、Spring Batchがそれ自体のスレッドでチャンク全体を実行できるようになります。これは、データのチャンクの読み取り-プロセス-書き込みサイクル全体が並行して発生することを意味することに注意してください。これは、データを処理するための保証された順序がないことを意味します。また、これはnotステートフルItemReadersで機能することにも注意してください( JdbcCursorItemReader および JdbcPagingItemReader は両方ともステートフルです)。

同期リーダーを使用したマルチスレッドステップ

用途:

  • 個々のステップの処理と書き込みを高速化
  • 読書がステートフルな場合

使用しないでください:

  • 読書のスピードアップ

ステートフルアイテムリーダーでマルチスレッドステップを使用できないという制限を回避する方法が1つあります。あなたは彼らのread()メソッドをsynchronizeすることができます。これにより、基本的に読み取りが連続して発生しますが(ただし、順序は保証されません)、処理と書き込みを並行して実行できます。これは、読み取りがボトルネックではなく、処理または書き込みがボトルネックである場合に適したオプションです。

パーティショニング

用途:

  • 個々のステップをスピードアップ
  • 読書がステートフルな場合
  • 入力データを分割できる場合

使用しないでください:

  • 入力データを分割できない場合

ステップのパーティション化は、マルチスレッドステップとは少し異なる動作をします。パーティション化されたステップを使用すると、実際には完全に異なる StepExecutions があります。各StepExecutionは、データの独自のパーティションで機能します。このように、各リーダーはデータの特定のスライスのみを参照しているため、リーダーは同じデータの読み取りに問題がありません。この方法は非常に強力ですが、マルチスレッドステップよりもセットアップが複雑です。

リモートチャンキング

用途:

  • 個々のステップの処理と書き込みを高速化
  • ステートフルリーダー

使用しないでください:

  • 読書のスピードアップ

リモートチャンクは非常に高度なSpringBatchの使用法です。メッセージを送受信するには、何らかの形式の耐久性のあるミドルウェア(JMSまたはAMQPなど)が必要です。リモートチャンクを使用すると、読み取りは引き続きシングルスレッドですが、各チャンクが読み取られると、処理のために別のJVMに送信されます。実際には、これはマルチスレッドステップの動作と非常に似ていますが、リモートチャンクは複数のthreadではなく、複数のprocessを利用できます。つまり、リモートチャンクを使用すると、アプリケーションを垂直方向にスケーリングするのではなく、水平方向にスケーリングできます。 (TBHリモートチャンクの実装を検討している場合は、Hadoopのようなものを検討することを検討する必要があると思います。)

並列ステップ

用途:

  • 全体的なジョブ実行の高速化
  • 相互に依存しない独立したステップがある場合

使用しないでください:

  • ステップ実行の高速化
  • 依存する手順

並列ステップは、独立して実行できるステップが1つ以上ある場合に役立ちます。 Spring Batchを使用すると、ステップを別々のスレッドで簡単に並行して実行できます。

29
FGreg