JJUG CCC 2022 Fall に参加しました。オンライン開催。簡単に所感をまとめます。
所感
サーキットブレーカーは設定値の決め方がポイントな気がする。業務要件やメトリクスで基準があるとよさそう。あと、サーキットブレーカーみたいな仕組みは発動しないに越したことはないのよね...。
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
- NOWAIT + SKIP LOCKED でリトライ
- ロックタイムアウト時間を制限する
- Hazelcast + AtomicInteger
- あまり性能は向上しない
- AtomicInteger 側のロック待ちになりそう
コンテナ環境でのJava技術の進化
#jjug_ccc_c
- コンテナ認識
- ネイティブ化
- CRIU
- CRaC
ユーザー数100万人規模の事業成長を止めずにレガシーコードと戦う
#jjug_ccc_c
- レガシーコード
- 変更容易性
- 品質劣化はリードタイムの増加を招く
- 事業急成長 → 技術的負債を生む意思決定が起こりやすい
- QCDSのうちコスト/納期/スコープが固定される → 品質低下
- 密結合/低凝集度 → テストが書きづらい
- 認知負荷増大
- データ増によるスロークエリ発生
- 暗黙知が多い
- 半年間新規開発ストップ
- Datadog モニタリング強化
- スロークエリ改善
- index, N+1, ...
- テーブルリファクタリング
- ダブルライトして徐々に移行
- ログレベル見直し
- 重要なエラーログを見逃さないように
- 脆弱性検査
- フレームワーク移行
- 変更容易性とテスト容易性の改善
- 5つの品質特性は「保守性」に依存している
- 仕様/設計をシンプルに再構成する (PdMや事業側と調整する)
- あるべきアーキテクチャ/組織構造への変革
- 組織変革
- マッキンゼー7S
- 組織文化 (QCDS意識/ドキュメンテーション)
- 組織スキル (計画/予実管理)
- 不確実性が高いからこそ重要
5年ぶりのメジャーアップデート! Spring Framework 6 & Spring Boot 3
#jjug_ccc_b
- Jakarta EE 10
- 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