2
0

More than 1 year has passed since last update.

JJUG CCC 2023 Spring 個人メモ

Last updated at Posted at 2023-06-04

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 とかを使う
    • 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 使え

補足

発表スライドが公開されたらリンク追加しようと思います。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0