Slide 1

Slide 1 text

目指せ kotlin-module 2.16 !? jackson-module-kogera の紹介 1

Slide 2

Slide 2 text

スライドについて marp-vscode で作っています Markdown で簡単に書けてコードが綺麗に出るのでオススメ PDF で落として頂けば、スライド内のリンクは開けます 2

Slide 3

Slide 3 text

自己紹介 宮田 木織 株式会社justInCaseTechnorogiesバックエンドエンジニア 業務ではここ1年程 Kotlin で Spring WebFlux している アウトプットしているアカウント Qiita: @wrongwrong GitHub: k163377 3

Slide 4

Slide 4 text

今日話すこと 1/15に公開した ProjectMapK/jackson-module-kogera について プロジェクトの概要 プロジェクトの目的と現状 プロジェクトの今後 4

Slide 5

Slide 5 text

プロジェクトの概要 5

Slide 6

Slide 6 text

このプロジェクトは何? jackson-module-kotlin のリライトプロジェクト 現状は JitPack.io で成果物を公開中( gradle や Maven から利用可能) ProjectMapK / jackson-module-kogera まだ alpha 版 ただし、 jackson-module-kotlin から移植したテストは基本的に成功する 現状では jackson-module-kotlin の単純置換で利用可能 パッケージ・モジュール名は jackson-module-kotlin に合わせている 一応 Spring による自動構成が動く所までは確認済み (ただしパッケージ・モジュール名の変更予定あり) 6

Slide 7

Slide 7 text

kogera の由来 そのまま日本語のコゲラから コゲラは日本最小のキツツキ 「 小鳥 ん!小さくてかわいい!」なライブラリを目指したかった K から始まるなるべく小さい鳥の名前にしたかった 7

Slide 8

Slide 8 text

プロジェクトの目的と現状 8

Slide 9

Slide 9 text

理想的な jackson-module-kotlin を示したい jackson-module-kotlin は1年ほどメンテナ不在の状況だった メンテナが居た2年前も、正直活動は低調だった 「こんなことができそう」と分かっても、実際には取り込んで貰えなかった jackson-module-kotlin が劣っているように見えるのが歯がゆかった moshi や kotlinx.serialization に比べるとコード・性能共に劣って見えた 「 Spring では第一候補な扱いなのにこれでいいの?」と感じた 「こうなっていれば理想的!」というコードを示したかった そのためには破壊的変更を厭わずにできるプロジェクトが必要だった 9

Slide 10

Slide 10 text

具体的にやっていること kotlin-reflect の置き換え 高性能・低負荷化 value class サポートを含む高機能化 10

Slide 11

Slide 11 text

kotlin-reflect の置き換え kotlin-reflect を kotlinx-metadata-jvm と Java Reflection で置き換える kotlin-reflect は3MBのサイズを持つ巨大なライブラリ これを kotlinx-metadata-jvm (1MB)と Java Reflection で置き換える kotlinx-metadata-jvm は Kotlin の Metadata を読み出すライブラリ Jackson のユースケースに最適化した処理を実装するイメージ 置き換えによって2MB程の軽量化とメソッド数の削減が行われる kogera にて実装済み 11

Slide 12

Slide 12 text

kotlin-reflect を置き換える意義 サーバーサイド kotlin-reflect によるコールドブート時の大きな負荷が低減される Spring でも kotlin-reflect の置き換えが検討されている Android ( Android 周り詳しくないので補足頂けると非常に嬉しいです) 64K問題の回避が容易になる kotlin-reflect は 16,000 以上のメソッド(@2017年)を持つ アプリの容量軽減に繋がる 12

Slide 13

Slide 13 text

高性能・低負荷化 デシリアライズの高速化 コンストラクタ/ファクトリ関数呼び出しの最適化 kotlin-reflect がやっていた処理を最適化するもの ユースケースによっては3倍程の高速化を達成 strictNullChecks オプション有効化時の挙動の最適化 非 null が指定されている Collection をバリデーションするオプション 現状では実装が非常に非効率で、デフォルトでは off になっている 局所的なベンチマークを見る限り大幅に高速化しているはず 13

Slide 14

Slide 14 text

高性能・低負荷化 リフレクションキャッシュの効率化・最適化 初期化・継続実行に関するベンチマークを見て調整する メモリ使用量の割に高速化していない内容の整理 Jackson 側にキャッシュされているパターン キャッシュする程効果が無いパターン メモリ消費量の低減 キャッシュ設定の非効率な部分の整理 現時点では消すだけ消して様子見の段階(調整はこれから) 特に初期化時しか参照しない内容を解放出来るようにしたい 14

Slide 15

Slide 15 text

value class サポートを含む高機能化 jackson-module-kotlin は value class サポートが未開拓 デシリアライズはほぼ完全に未サポート シリアライズもサポート出来ていない点が沢山有る kogera の実装状況 シリアライズ: サポートが困難なものを除き全機能動くはず デシリアライズ: 一部はサポート済み、鋭意開発中 他にもissueから良さげなものが有れば対応予定 15

Slide 16

Slide 16 text

プロジェクトの今後 16

Slide 17

Slide 17 text

beta 版への移行について 以下を達成したら beta 版へ移行予定 value class サポート 「現実的に無理」以外はサポート予定 Kotlin 1.6 以下のサポート(現状は 1.7 を利用している) CI のグリッドテストを整備したい Java バージョン毎の検証も整備したい パッケージ・モジュール名の変更 移行時に Maven Central への公開を検討中 リポジトリの扱いなど含めて Jackson のメンテナの方と調整したい 17

Slide 18

Slide 18 text

更に未来の話 jackson-module-kotlin 2.16 になるかも(最新は2.14) Jackson のメンテナの方とやり取りしていく 移行に当たって Spring のコミッタの方からもサポート頂けるかも kogera の成果や移行に向けた準備は順次本体に反映予定 自分が jackson-module-kotlin のメンテナになるかも jackson-module-kotlin は1年以上メンテナ不在の状況だった メンテナ不在で変更を進めるのは不可能ということで立候補した 18

Slide 19

Slide 19 text

終わりに 19

Slide 20

Slide 20 text

終わりに ProjectMapK/jackson-module-kogera について紹介しました jackson-module-kotlin を始め界隈に結構影響の有る話だと思います というか影響の有る話にしていきたいです! スターや使ってみた報告お待ちしています! 特に意図せぬ破壊的変更が入っていないか気になっています 20