-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
バッチアプリケーションの起動時間短縮 #340
Comments
GraalVMの動作検証大元のURL:https://spring.pleiades.io/spring-boot/docs/current/reference/html/native-image.html GraalVMの利用方法・Dockerを用いたやり方 GraalVMを用いたネイティブアプリ化・GraalVMに対応したJDKのダウンロード |
現時点での評価軸起動時間メモリ使用量環境・VSCode上で動作するか ・追加のインストール作業が必要ではないか |
ネイティブイメージのlog4j2のLoggerが対応していない問題の対応策を調査している ①log4j2 → java.util.loggerへの代替mybatisが java.util.loggerに対応していないため動作しないことが判明 ②graalVMのコンパイル時にlog4j-coreのjarファイルをクラスパスに追加以下のようにlog4j-coreをクラスパスに追加 configurations {
myConfiguration
}
dependencies {
.....
myConfiguration files('C:/Maia/maia/samples/web-csr/dressca-backend/batch/libs/log4j-core-2.23.1.jar')
myConfiguration sourceSets.main.runtimeClasspath
}
graalvmNative {
binaries {
main {
javaLauncher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(17)
vendor = JvmVendorSpec.matching("Oracle Corporation")
}
mainClass = 'com.dressca.batch.BatchApplication'
}
}
}
def myFatJar = tasks.register("myFatJar", Jar) {
dependsOn 'compileJava', 'processResources', ':infrastructure:jar', ':application-core:jar', 'compileAotJava', 'processAotResources', 'processAot'
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
from {
configurations.myConfiguration.collect { it.isDirectory() ? it : zipTree(it) }
}
manifest {
attributes(
'Main-Class': 'com.dressca.batch.BatchApplication',
'Class-Path': configurations.myConfiguration.files.collect { it.absolutePath }.join(' ')
)
}
}
tasks.named("nativeCompile") {
classpathJar = myFatJar.flatMap { it.archiveFile }
} しかし、エラー内容に変わりはなかった。 ③一部ライブラリを動的にコンパイルするreflection-config.jsonによる動作log4j2を動的にコンパイルするorg.apache.log4j.loggerのライブラリを動的コンパイルすることはできているが、 logbackに変更し、動的にコンパイルする
一度log4j2からlogbackへ変更しながら動作確認を実行 mybatis のloggerが動作しない問題reflect-config.jsonにmybatisのロガークラスを動的コンパイルで実行するよう設定
MapperScanアノテーションによって設定していたMapperクラスが正常に読み取れないエラーが発生
build.gradle上にタスクを定義し、nativeCompile時にreflcet-config.jsonに記載するよう設定する方法が有効か調査中。 |
GraalVMを利用したネイティブイメージの実装方法GraalVM JDKのインストール・設定
上記URLを参考にGraalVMのセッティングを行います。 Spring Boot プロジェクトの実装propertiesファイルの編集
// build.gradle (batch)
plugins {
id 'org.graalvm.buildtools.native' version "${graalvmVersion}"
}
repositories {
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
}
dependencies {
implementation supportDependencies.mybatis_spring_native
}
graalvmNative {
binaries {
main {
javaLauncher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(17)
vendor = JvmVendorSpec.matching("Oracle Corporation")
}
mainClass = 'com.dressca.batch.BatchApplication'
}
}
} // dependencies.gradle
ext {
graalvmVersion = "0.9.28"
mybatisNativeVersion = '0.1.0-SNAPSHOT'
supportDependencies = [
mybatis_spring_native : "org.mybatis.spring.native:mybatis-spring-native-core:$mybatisNativeVersion",
]
} Mybatis Spring Native のエラー対応
[
{
"name" : "org.mybatis.spring.boot.autoconfigure.SpringBootVFS",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true,
"methods" : [
{ "name" : "<init>", "parameterTypes" : [] }
]
},
{
"name" : "com.dressca.applicationcore.order.Address",
"allDeclaredConstructors" : true,
"allPublicConstructors" : true,
"allDeclaredMethods" : true,
"allPublicMethods" : true
}
] lombokの@valueのアノテーションはビルド時に読み込まれないようで、reflect-config.jsonでコンパイルする必要があるとの報告あり(https://stackoverflow.com/questions/74870429/spring-boot-3-native-with-lombok-immutable-value)。 ネイティブコンパイルとexeファイルの実行 |
調査が必要な内容ネイティブイメージのテスト方法
起動時間やビルド時間の高速が有効かどうか |
ビルド時間方法Windows PowerShellで以下のコマンドを実行 計測結果
実行時間方法Windows PowerShellで以下のコマンドを実行 計測結果exeファイルの初回起動のみ時間がかかるよう、それ以降は0.2秒程度。
メモリ使用量方法Ubuntu環境を構築し、メモリ使用量を計測する以下のコマンドを実行 計測結果./gradlew による起動の場合
exeファイルによる起動の場合
|
バッチ処理バッチ処理とはバッチ処理は、一連のタスクやプログラムを自動的に実行する処理方法です。 バッチ処理の種類オンバッチオンバッチは、ユーザーの任意のタイミングで実行されるバッチ処理です。 オンバッチはユーザーの操作に応じた柔軟な実行が特徴であることから、後述する定期バッチと比較して複雑なバッチ処理を実行できるメリットがあります。 定期バッチ定期バッチは、あらかじめ設定された一定の間隔で自動的に実行されるバッチ処理です。 定期バッチは、あらかじめ設定されたリソースを利用して実行されるため、リソースを効率的に管理することができます。 バックエンドアプリケーションでのバッチ処理前述したとおり、大量で反復的なデータを処理するバッチ処理を行う場合、システムの負荷が高く非効率となる場合があります。 このような場合、以下の方法で解決できます。 クラウドのリソースを利用してバッチ処理をスケジューリングするクラウドサービスを利用してバッチ処理を自動的に実行するようスケジューリングすることで、以下のメリットがあります。 効率性 高速化 リソースの削減 バッチ処理を行う際のシステムの負荷が問題となっている場合、バックエンドアプリケーションをクラウドのリソース上に配置して、システムの負荷低減を図ることを考慮してください。 @scheduledアノテーションを用いた実行クラウドのサービスを利用しない場合、バッチ処理を高速に実行するために Spring Boot アプリケーションの機能のみで対処する必要があります。 実装方法については、以下を参照してください。 基本的には上記2つによる解決を推奨しますが、開発における制約上既存のアプリケーションコードは変更できないが処理の高速化や実行時のリソースを削減を実現したい場合があります。 GraalVM の利用GraalVM は、 Oracle 社が開発した高パフォーマンスの JDK です。 実装方法については、以下を参照してください。 ??? note "GraalVMを利用する際の注意点"
|
概要
Spring Batchでバッチアプリケーションを実装した際、起動時のBean初期化処理などでどうしても数秒以上の時間がかかってしまう。
実行時間の制約がシビアなバッチにおいてはこれが問題になることもあるので、そのようなケースでの対処方法について検討する。
詳細 / 機能詳細(オプション)
基本は概要に記載した通り。
一つの対策としてBeanの遅延初期化設定を入れることが考えられるが、別プロジェクトにてこの対策を実施した際は大きな改善には繋がらなかった。
Spring Batch 5から対応したGraalVMを用いたネイティブアプリ化を行えば大幅な起動時間の短縮につながると期待されるが、実装や動作環境などに対して特別な考慮は必要ないか調査する必要がある。
上記が現実的でない場合、Spring Batch以外の実装方法の候補はあるかも調査する。
完了条件
起動時間の短いバッチアプリケーションの実装方法が示されている。
The text was updated successfully, but these errors were encountered: