Open2
雑記
Question
build.gradle の dependencies
における testImplementation
と testFixturesImplementation
の違いは?
Answer
それぞれどのフェーズでその依存ライブラリを利用するかが異なる。testImplementation
の場合はテストのコンパイルと実行時に依存ライブラリが利用され、testFixturesImplementation
はテストフィクスチャ(テストの設定やテストデータの準備)に依存ライブラリが利用される。
Link
Spring Modulith
-
どのようなシステムを独立管理したいか?
- 開発メンバーの人数が大規模な場合
- 開発メンバーを少なくするとそれに応じてシステムの規模を小さくする必要がある。
- コード行数が多すぎて CI/CD に時間がかかる。
- 開発言語など利用する技術を機能に応じて変更したい場合
- 基本は Java で開発するけど機械学習関連のロジックは Python で開発したい
- 機能ごとに非機能要求を変更する必要がある場合
- それぞれの機能において SLA が違う場合とか
- 開発メンバーの人数が大規模な場合
-
マイクロサービスの欠点
- トランザクション管理が難しい
- マイクロサービス間で通信が発生する
-
Spring Modulith
- できること
- モジュールの分割
- イベント連携
- 気を付けるべき点
- モジュールの境界線を決める難しさ
- 設計難易度は上がる
- 自動テストは随時動かしておく必要あり
- イベント連携
- 連携方法の種類
- 同期イベント連携
- EventListener
- 非同期イベント連携
- ApplicationModuleListener -> Modulith が提供
- 同期イベント連携
- 気を付ける点
- 同期・非同期は使い分ける必要あり
- 非同期イベントは順序を制御できない
- DBの定義について検討が必要
- 連携方法の種類
- できること
-
まとめ
- モジュラモノリス・マイクロサービスは組み合わせていい
- モジュールの境界線の設計が一番重要
- 境界線を決めたら頑張って守る
- テストは随時動かす
- APIの呼び出し(そのまま呼び出す・同期イベント・非同期イベント)はよく検討して方法を決める。
-
Java9 の jigsaw でもモジュール分割可能。Kotlin は言語の機能でモジュール分割可能。ただし今回は Spring 使ってたら Modulith を採用した。
リビルド
- 発端
- CoreWebVitals の指標が他社に比べて悪かったので刷新の機運が高まっていた。
- リビルドの手法
- ストラングラーパターン
- 個々の機能を少しずつ新しい方に移していき、全て移行したら初めて移行が完成する。
- 実現方法
- プロキシサーバで条件に一致したリクエストのみ新しい方にプロキシする。
- 画面単位ではなく機能単位で刷新。
- ストラングラーパターン
- リビルド後よくなった点
- CI/CD
- オートスケール可能になった
- Blue/Green デプロイメントが実現した。
- Infra as Code
- クリーンアーキテクチャ
- ArcUnit によるレイヤーの依存関係が問題ないかどうかの検証
- 静的解析ツール: SonarQube
- PR 作成時に自動に違反箇所を検出
- リビルドの進め方で良かった点
- ストラングラーパターンを採用したによって旧環境の切り戻しが容易だった
- 障害にどうやって気づくか
- Datadog -> ログやメトリクスの可視化。トレーシング機能も有効利用。
- 関係部署とのコミュニケーションラインを気づく。
- 予期せぬエラーが発生した場合は旧環境へリダイレクトするように設定。
- リビルドの進め方の反省点
- 初期メンバーのアサイン
- 最初はドメイン知識やコード読める人をアサインした方が良い。
- Docker化をもっと早い段階でした方が良かった。
- オートスケールできるようになったのが遅いタイミングだった。
- BE はダークローンチを検討した方が良かった。-> ユーザに影響しない形で機能を提供すること。新しい環境は旧環境とは別のDBに登録し、その後2つのDBを比較してデータ内容が問題ないことを確認する。
- 初期メンバーのアサイン
- 質問事項
- ストラングラーパターンで進めていく中でビジネス要件で機能追加が必要になった場合は新旧どちらの環境も改修を行った。
- 年単位のプロジェクトだったので、アーキテクチャについては適宜専門チームが見直しをを行っていた。
Spring 新機能
- 3系でサポートされた機能
- Observability
- Graal VM Native Image
- Java Interface Client
- Checkpoint Restore(CRaC)
- Virtual Thread
- Service Connection
- データベースへの接続情報を抽象化。
- ConnectionDetails インターフェース
- プロパティから直接設定とってこなくてもテスト用の設定を設定することが可能。
- メリット
- Integration Test の容易化
- SSL Bundle
- Trust Store の設定が容易になった。
- RestClient, RestTemplate もサポート
- ホットリロード機能もあるので証明書が更新された場合も自動的に読み込まれる。Kubernetes では CertManager で自動配布を行っている。Lets's encrypt は 90日くらいで失効する
- Trust Store の設定が容易になった。
- Class Data Sharing
- アプリケーションの起動時間を短縮できる機能
- 一旦 SpringBoot を起動させて Bean に登録されたオブジェクトのスナップショットを作成し、起動時にそれを利用して起動時間を短縮させる。
- アプリケーションの起動時間を短縮できる機能