かなり単純な Springbatch タスクレットをスケールアップしようとしています。状況は次のとおりです。
- HibernatePagingItemReader
- カスタム プロセッサ: HibernatePagingItemReader からのデータに基づいて Web サービス クエリを実行します。
- カスタムライター
Web サービスのクエリは遅く、簡単に並列化できるため、ボトルネックは私のプロセッサです。
タスクレットにタスク エグゼキュータ (org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor) を追加しましたが、直線的にスケーリングしません。5 スレッドを超えると、合計実行時間は同じになります。
Spring docs によると、リーダーはすぐに使用できるスケーラブルではありませんが、私のニーズははるかに単純です。リーダーによってフェッチされたすべてのレコードは独立しているため、リーダーを並行して実行できます。
私の質問は次のとおりです。
- リーダーはマルチスレッド コンテキストでどのように実行されますか? それらは並列化されていますか、それとも並列化されたリーダーにデータを配布していますか?
- リーダーが並列化されている場合、これらのレコードをプロセッサに配布するには、レコードの量を減らす (maxItemCount を設定する) 必要があると思います
それをスケールアップするための他のアイデアはありますか?