JJUG CCC 2022 Fall に行ってきた #jjug_ccc

JJUG CCC 2022 Fall に参加しました。オンライン開催。簡単に所感をまとめます。

jjug.doorkeeper.jp

所感

サーキットブレーカーは設定値の決め方がポイントな気がする。業務要件やメトリクスで基準があるとよさそう。あと、サーキットブレーカーみたいな仕組みは発動しないに越したことはないのよね...。

SELECT FOR UPDATE でロックするのはよくあるけど、ロックよりアプリケーション側でリトライする方がコントロールしやすいのかなと思いました。その点、Cloud Spanner とかはそういう思想になってるっぽいので腹落ちしたような気がする。

コンテナについてはまだまだ知らないことが多い。知らないと性能を十分に生かせなかったりハマったりすることが多そうなのでちゃんと勉強しないと...。

ビズリーチの話は共感するところが多くてよかったです。負債解消やシステムのリアーキだけじゃなくて、組織構造まで考えてたり、仕様や設計をシンプルに再構成するために PdM や事業側と調整するのが特にいいと思いました。あと、不確実性の高いことが多いからこそ、計画や予実管理するスキルが重要という話が刺さりました。

Spring Framework, Spring Boot のメジャーバージョンアップは5年ぶりなんですね。Spring 標準がいろいろな機能をサポートすることで依存ライブラリが減らせるのがよさそう。

サイボウズの kintone チームの話は、改善活動をプロジェクト制にして組織的に進めてるのがよさそうでした。組織の活動にすることでビジネスサイドに説得しやすいし優先度判断で迷うことが減りそうでよさそう。

セッションの資料とアーカイブはこちらにまとめられています。ありがたい。

以下、メモから抜粋。

Javaで実現するフォールトトレランス 〜Resilience4jを使ったサーキットブレーカーの実装〜

#jjug_ccc_b

  • サーキットブレーカーパターン
    • カスケード障害への対策
    • 障害を検知したサービスへのリクエストを遮断する
    • システム全体に障害が波及しないように
  • Resilience4j
    • サーキットブレーカー
    • リトライ
    • 流量制限
  • vavr (依存ライブラリ)
  • サーキットブレーカーOPEN
    • RabbitMQ にメッセージ送信している (リトライあり)
    • あとでバッチ同期
  • 設定値はシステム要求仕様に合わせる
  • タイムアウトの温度感
    • ユーザーから見えるところは短めに
    • バックグランドは長めに/リトライ多めに

カード決済基幹システム レガシーの克服と無停止更改の挑戦

#jjug_ccc_d

  • 必要以上にDBアクセスが多い
  • SELECT FOR UPDATE によるレコードロック待ち
  • SQL実行の長時間化
  • インメモリDBによるスループット向上
    • Hazelcast
    • im-memory data grid
    • クラスタリング
    • ロードバランサがあるわけではない
    • いずれかのノードがプライマリになっているはず
  • 生存期間の短いデータを RDB で扱うのは非効率
  • イベントリスナ
    • 業務処理の一部を Hazelcast に実装
  • カナリアリリース
    • 並行稼動中は新システムは RDB と Hazelcast を見るように
    • 新システムのログはすべて見る
    • 旧システムの性能が劣化していないか
  • SELECT FOR UPDATE
  • Hazelcast + AtomicInteger
    • あまり性能は向上しない
    • AtomicInteger 側のロック待ちになりそう

コンテナ環境でのJava技術の進化

#jjug_ccc_c

  • コンテナ認識
    • Java自身がコンテナで動作していることを認識する必要があるか
    • エルゴノミクス機能
      • ヒープサイズ自動設定
      • ForkJoinPool 並行度
        • 論理CPU数-1
    • cgroup の情報を利用してコンテナを認識している
    • ヒープは物理メモリの 1/4 を割り当てる
    • OverlayFS
  • ネイティブ化
    • Project Leyden #jjug_ccc #jjug_ccc_c
    • ネイティブイメージの標準化
    • GraalVM は OpenJDK プロジェクトではない (標準ではない)
      • (追記) GraalVM CE は OpenJDK に移管される予定
  • CRIU
    • Linux プロジェクト (experimental)
    • プロセスごとにスナップショットが取れる
      • ヒープメモリ分もスナップショットを取る
    • プロセスの状態をディスクに保存
    • データからプロセスをリストア
    • コンテナのライブマイグレーション
      • 入れ替わったコンテナですぐに再開できるようにするため?
  • CRaC
    • CRIU を Java から簡単に利用する
    • 起動性能改善
    • チェックポイント前やリストア後に任意の処理ができるように (JDBC 再接続とか)
      • Resource#beforeCheckpoint
      • Resource#afterRestore
    • 1つのチェックポイントから複数コンテナ起動可

ユーザー数100万人規模の事業成長を止めずにレガシーコードと戦う

#jjug_ccc_c

  • レガシーコード
  • 変更容易性
  • 品質劣化はリードタイムの増加を招く
  • 事業急成長 → 技術的負債を生む意思決定が起こりやすい
  • QCDSのうちコスト/納期/スコープが固定される → 品質低下
  • 密結合/低凝集度 → テストが書きづらい
  • 認知負荷増大
  • データ増によるスロークエリ発生
  • 暗黙知が多い
  • 半年間新規開発ストップ
  • Datadog モニタリング強化
  • スロークエリ改善
  • ログレベル見直し
    • 重要なエラーログを見逃さないように
  • 脆弱性検査
  • 変更容易性とテスト容易性の改善
    • 5つの品質特性は「保守性」に依存している
    • 仕様/設計をシンプルに再構成する (PdMや事業側と調整する)
  • あるべきアーキテクチャ/組織構造への変革
    • 組織は戦略に従う
    • コンウェイの法則
    • コンウェイ戦略
    • 成果をあげる構造を作り出すために目的/戦略から考える
    • 境界づけられたコンテキストでシステムを分離する
      • APIを通してほかチームとコミュニケーションする
      • コミュニケーションパスを設計する
        • 最低限のコミュニケーションになるように
      • ストラングラーパターン
  • 組織変革

5年ぶりのメジャーアップデート! Spring Framework 6 & Spring Boot 3

#jjug_ccc_b

  • Jakarta EE 10
    • javax.*jakarta.*
    • Servlet API に依存するコードやライブラリは要注意
    • EE 9 runtime でも動作可
  • Micrometer 1.10
    • metrics + trace が同時に計測可
    • カーディナリティが高い Tag は trace のみに送られる
  • Java Interface Client
    • interface 定義のみで HTTP Client が使える
    • WebClient ベース (non-blocking)
    • デフォルトは reactor-netty の HttpClient
      • reactor-netty を exclude して標準の HttpClient に差し替え可
    • RFC 7807: Problem Details for HTTP APIs
  • AOT & Native Support
  • proxyBeanMethods = false
  • Mockito は netive 対応していない

組織と技術の両輪で開発を加速させるkintoneチームの取り組み

#jjug_ccc_a

  • LeSS
    • 開発速度低下
    • チーム体制のモノリス
      • コミュニケーションコスト増
      • 認知負荷増
  • チームトポロジー
    • インタラクションモード
  • 領域専任チーム体制
    • フィーチャーチーム
    • 担当領域を明確に → 認知負荷を下げる
    • クロスファンクショナル
    • コンウェイ戦略
    • 機能ごとにパッケージ分割
  • プロジェクト制
    • 探求時間
      • バックログ開発以外の改善活動など
      • 状況に合わせて割合は変える (だいたい2割くらい)
    • 目的/ゴールを説明して承認を得る
      • プロジェクト憲章テンプレート
  • JUnit テストの並列実行
  • IntelliJ IDEA Type migration
  • DateTimeFormatter
    • ResolverStyle.STRICT
    • 存在しない日付を丸めずにエラーにする
  • Google Closure Tools
  • semgrep