2023/06/04 (日) 開催。
オンライン参加したセッションの個人的なメモ。
別のセッション見ながら無音声で見てたりするのもある。
セッション一覧
Spring Boot 2 から 3 へバージョンアップしてみた
- Migration Guide に目を通すべし
- package
javax
->jakarta
ひたすら置換 - Spring MVC の trailing slash の問題 (マッチングの仕様変更)
- Spring Security
- 認証 Filter の dispatch type が全てが対象になる
- 認証エラーで forward したら forward した先でまた同じ Filter が適用され無限ループ
-
spring.security.filter.dispatcher-types
で指定して回避
- 複数プロジェクト間で version catalog 導入し、バージョンを統一
- Spring Boot Migrator というツールがある (gradle は当時サポートされていなかった)
サーバレス Java の今
- SnapStart
- Java コールドスタートの INIT 時間を軽減
- lifecycle hook は利用できない
- AWS Lambda Web Adapter
- Lambda Extension として動作
- Docker とかも対応
- Dockerfile に COPY を一つ書く必要がある
- SAM CLI で簡単にビルド・デプロイ可能
- API GW, Lambda Function URL, ALB からの起動みサポート。
- EventBrdige, S3 Event, SQS からのインテグレーションは未サポート
- Graal VM 注意点
- リフレクションの動的要素対応ができない。
トレースエージェントツールを使って reflect-config.json の生成が必要
- リフレクションの動的要素対応ができない。
- AWS Lambda Powertools for Java
- 構造化ログ
- カスタムメトリクス
- AWS X-Ray
- Amazon CloudWatch Embeded Metric Format (EMF)
- 標準出力の中に埋め込めるらしい
- CloudWatch Synthetics
- E2E テスト的なことできる。それをメトリクスにできる
- K6
- 負荷テストツール
SpringBoot+Kotlinで使うExposed
- JOOQ 的な感じ。DSL チックに SQL を書く
- Java から使うのは無理ぽ
Virtual Threads - 導入の背景と、効果的な使い方
- JVM が管理する軽量スレッド
- 他言語の Fiber に相当
- スループット向上
- I/O を多く含むシステムで効果的
- 応答時間はちょっとだけ悪化
- 従来のスレッドと使い方は同じ
- PlatformThread / CarrierThread
- VirtualThread
- java.lang.VirtualThread
- unmount() / mount()
- Continuation.yield(xxx); // 非公開クラス
- ユースケース
Executors#newVirtualThreadPerTaskExecutor()
Executors#newThreadPerTaskExecutor(Thread.ofVirtual().factory())
- ExecutorService は java 19 から AutoCloseable になって try-with-resource できるようになる。
- synchronized はなるべく使わないようにする
- synchronized はリソースへのアクセスを 1 つのスレッドだけに限定するという指示。
他のスレッドをブロックされてしまう。
対策:- Immutable class の利用
- 処理の受け渡しには Callable を使う
- どうしてもロックが必要なら ReentrantLock とかを使う
- synchronized はリソースへのアクセスを 1 つのスレッドだけに限定するという指示。
- ThreadLocal を使わない(えー...)
- mutable API であり、スケールしない
- ScopedValue で代用する (Java 21 Preview)
- Thread は使い回さない。使い捨てる。
- WebFlux とか R2DBC を無理して導入しなくても良さそう(感想)
コンテナ環境でのJava性能チューニング
-
-Xmx
より-XX:MaxRAMPercentage
の方が安全らしい。
JUnitテストをCI環境で並列で実行する方法とその速度,スケーラビリティ
- self-hosted runner 使え
- ./gradle test -Pshard=1/3
strategy: matrix: shard: [1/3, 2/3, 3/3] steps: run ./gardlew createTestList run ./gradlew test-Pshard=${{matrix.shard}}
- SpringTestCase のコンテキストは可能な限り再利用される。揃えた方がいい。
- GitHub の normal runner のコスパは EC2 でやるなら t3.large に相当
- Spring やめて Quarkus 使え
補足
発表スライドが公開されたらリンク追加しようと思います。