JJUG Java生誕25周年記念イベントに行ってきた #jjug

先日、JJUG Java生誕25周年記念イベントに参加しました。今回はオンライン開催。簡単に所感をまとめます。

jjug.doorkeeper.jp

所感

JJUG CCC 2020 Spring が中止になり、代わりに開催されたイベントです。Java 生誕25周年。セッションは総会を含めて5本でしたが、幅広い内容で面白かったです。

しかし、IDEの位置付けについてここまで深く考えられるもんなんですね。納得感のある内容でした。今のプロジェクトで使ってる Eclipse めっちょ古いからバージョンアップしなければ...。まずはバージョンアップできるようにプラグインとか周辺のツールを整理するところから。

Jakarta EE はパッケージ名の変更がインパクト大きそうだけど、YouTube のコメントを見てると意外とマイグレーションツールが提供されるっぽい?

あと、キャッシュの更新検知はプロダクト任せになるのかな。Infinispan は通知してくれるみたいだけど。結局、セッションにはユーザー情報とか更新頻度が低いものを入れるのがよさそう。

YouTube の URL はこちら。

youtu.be

以下、メモから抜粋。

Java 14 新機能を軽くまとめてみた

  • Java 14
    • 16 JEPs
    • non-LTS (パッチは15リリースまで)
  • 言語機能の標準化は3段階
  • Incubator
    • ライブラリ
    • incubator モジュールとして import する必要あり
  • Experimental
    • JVM 機能
    • Standard ではなく Production
      • JVM 機能は Java の標準ではなく実装ごとの機能のため
  • Text Blocks (Preview 2)
    • 15 で Standard になる予定
    • 改行のエスケープ (\)
    • スペース文字 (\s)
  • Switch Expressions (Standard)
    • case 句に複数のラベルが指定可 (ステートメントも同様)
    • アローを使うと break は記述不要
    • 値を返すときは yield を使う
    • yield はキーワードではない (型名には使えない)
  • Records (Preview)
    • データをやり取りするための型, 名前付きタプル
    • Record は特別なクラスなので自分のコードでは継承不可
    • invokedynamic で実行時に処理コードが生成される
      • 新バージョンで実装が最適化された場合、旧バージョンでコンパイルしたコードも新しい実装で動く
    • ほぼ enum と同じ扱い?と考えてよい
  • Sealed Classes (Java 15 で Preview)
    • 継承するクラス/インタフェースを限定できる
    • Switch 式で default が不要になる
      • すべての case を処理したことをコンパイラ側で検知できるため
  • Pattern Matching for instanceof (Preview)
    • スマートキャスト
    • if (obj instanceof String s) {...} って文法として微妙な気がするのは自分だけだろうか...
    • 今のところバイトコードには無駄なところが多い模様
  • Pattern with Switch
    • switch でパターンマッチ
    • 近いうちに入るかも?
  • Deconstruction
    • switch の case で Record を分解する
    • 今のところ入る予定なし
  • JFR Event Streaming
    • ファイルにダンプしたデータはストリーミングで見るには不便
    • Event Streaming ではイベントとして処理できる
    • 監視に使いやすい
    • JFR はそろそろ OpenJDK 8 にパックポートされる模様
  • Foreign Memory Access API (Incubator)
    • ヒープ外のメモリを扱う
    • これまでは Unsafe が使われていた
  • @PreviewFeature
    • これまでは PreviewAPI には @Deprecated が使われていた
    • @PreviewFeatureAPI を使う場合は --enable-preview が必要
    • ※資料には --enable-feature と書かれてますが、正しくは --enable-preview です (確認済)
  • Packaging Tool (Incubator)
    • ランタイムを含むアプリケーションパッケージ
      • アプリケーションを使う側は事前に Java をインストールする必要なし
    • パッケージングは jpackage コマンドを使う
    • インストーラ/アンインストーラ
    • ランタイムをコンパクトにする場合は jlink でカスタムランタイムを作成
    • これからはランタイムは開発側が責任をもって提供する
  • https://qiita.com/nowokay/items/ec85d97a7cecaaac8123

IDE起点で2020年代の開発環境を眺めてみる

  • たくさんのツールを使うのは高コスト
  • ツールを組み合わせると取りこぼすものがある
    • これらをシームレスに使えるようにするためにIDEがある
  • いろいろなツールを使うことより開発そのものにリソースを割きたい
  • 開発で使うツールは開発を邪魔するものであってはならない
    • ただし、ツールを蔑ろにしていいわけではない
  • IDEの役割は開発を容易にすること
  • IDEは開発者のためにある
  • 開発対象のアプリケーションがIDEに依存してはいけない
  • IDEはビルドツールの設定を読み込んで使う
    • IDEはビルドツールに依存させる
  • IDEの独立性を高める☆
    • IDEはなんでもいいというところまで持っていく
  • アプリケーションに影響を与えるものはIDEに設定しない
    • JDKのバージョン, ライブラリ管理, フォルダ構成, など
    • IDEの設定を変えたからサービスが停止したということはあってはならない
  • IDEからビルドツールを使うときにIDEバンドルのJDKは使わない
    • アプリケーションに影響を与えるから☆
  • IDEを使うならエラーを出したまま放置しない
    • IDEが出している警告も個人的には残したくない...
  • いざというときにプリミティブなツールが使えると安心
  • IDEの新規プロジェクト作成とかクラスパス設定とかは今はやらない
  • フォーマッタを切り離したい
    • 言語にフォーマッタが付いてるといい
  • IDEのバージョンアップは積極的にするべき☆
    • IDEがバージョンアップできない状況にしない
    • IDEが独立していれば問題なくできるはず

Jakarta EE / MicroProfile を利用したクラウドネイティブアプリの開発

www.slideshare.net

システムのモダナイズ 落ちても良いアプリの作り方

www.slideshare.net

  • スケールアウトしたのに負荷が偏る
  • スケールインで情報を持っていたノードが消えた
  • システムの可能性を高めるには
    • 耐障害性向上
    • スケールアウト
  • クラウドを使っているとそれ以上耐障害性を上げられなかったり
  • ステートレスなアプリケーション ⇒ スケールアウト
  • ステートフルなアプリケーション ⇒ ?
  • ステートの取り扱い
    • DB/インメモリに読み書き
    • 透過的に使う ⇒ HTTPセッション
  • なぜHTTPセッションを使うのか☆
  • HTTPセッションに入れていいもの☆
  • Connection や Thread は Serializable ではない
    • 同一のアプリに接続している場合はたまたま動く
    • 実装の参照がそのまま使えるから? (シリアライズした情報ではなく参照を使う)
    • アプリをまたぐ場合にシリアライズされる ⇒ NG
  • ステートはどのように保持されるか☆
    • ファイル(共有ストレージなど)/DBに置く場合、複数のアプリでステートを共有できる
  • アプリがステートを持つメリデメ☆
    • ステート数が増加してヒープを逼迫するとGCによる停止時間が増えてレスポンス遅延に
  • ファイル/DBがステートを持つメリデメ☆
  • ステートフルで可能性を担保するために重要なこと☆
    • ステートをどこで持つか
    • リクエストをどう振り分けるか
  • セッション外部化
    • DBにステートを持たせる
    • 全体はステートレスになるもののレスポンスは遅い
    • 外部ストアの性能劣化にはニアキャッシュを使う
  • ニアキャッシュ
    • よく使うセッション情報をアプリ上にキャッシュする
    • ネットワークやディスクアクセスを減らす
  • スティッキーセッション
    • アプリが落ちるとセッションは消える (運用で落とす場合も同様)
      • オートスケールできない?
    • 負荷が偏る可能性あり ⇒ 時間を短くして分散しやすいように
  • DBにゴミデータ残らないか?
    • セッションの有効期限を設定する
  • セッションには変更されない情報を入れるのが現実的?☆
  • キャッシュの更新は?
    • HttpSession の実装による
    • Infinispan では無効になったときに通知してくれる
    • Infinispan は同じ JVM プロセスの中で動く
    • Hazelcast も同様?
    • WebSphere では JSESSIONID の Cookie にキャッシュのバージョンが入っていてニアキャッシュと毎回比較している