Upgrade to Pro — share decks privately, control downloads, hide ads and more …

広告システムの生産性向上への試み〜100以上のマイクロサービスのモノレポ化〜

CyberAgent
December 15, 2021

 広告システムの生産性向上への試み〜100以上のマイクロサービスのモノレポ化〜

広告配信システムはマイクロサービスアーキテクチャを採用し、100以上ものマイクロサービスで構築されています。

サービス提供開始から5年が経ち、様々な機能追加、機能改修が行われ、保守するソースコードレポジトリは100に上ります。

次第に、機能改修、共通ロジックの抽出、依存ライブラリバージョンアップ、セキュリティパッチの適用などを行う際、複数のレポジトリにまたがって変更を行う必要があり、開発スピードが大きく低下していました。

これらの問題を解決するためにモノレポに移行しました。

今回はどのようにモノレポ移行したのかを説明し、開発フローの改善への取り組みについて説明します。

https://developer.abema.io/2021/sessions/QXlcQUxHjJ/?utm_medium=social&utm_source=slideshare

CyberAgent

December 15, 2021
Tweet

More Decks by CyberAgent

Other Decks in Technology

Transcript

  1. アーキテクチャ DMP VOD リニア GKE トランス コーダ 広告入稿シ ステム Batch

    Tracking Server DMP 配信システ ム GKE トランス コーダ 広告入稿シ ステム Tracking Server 保証型広告配信システム 非保証型広告配信システム
  2. マイクロサービス × マルチレポ y proto D component E component F

    component x proto A component B component C component
  3. ビルドツールの選定 モノレポ導入当初 Bazel を使用 • どれほどビルドに時間がかかるか把握できなかった • 差分ビルドを行うために導入 • Go,

    Docker イメージのビルドのみに使っていた 結果: 各ツールを使いビルドするよう変更 • Bazel のビルドと各ツールのビルド時間にそれほど差がなかった • Goのビルドが通るがBazelのビルドが通らないことが時折発生 • メインの言語はGoのみでBazelの機能を活かしきれていなかった
  4. CI/CDについて CI • Github Actions を採用 • 設定ファイルのテンプレート化 • 変更があったディレクトリごと実行するワークフローを分け、必要なCIのみ実行する

    ように CD • ArgoCDを採用 • GitOpsを採用 • Kubernetesのマニフェストを変更することでデプロイできるワークフローを用意
  5. ブランチ戦略 feature ブランチによる長期開発との相性が悪い 長期開発を行なってしまうと feature ブランチと master ブランチに差分が発生してしまい、 デグレなどが起きてしまう →

    トランクベースの開発を行う必要がある フィーチャートグルを用いた開発、作業を細かく分割しマージ頻度を高める必要がある
  6. モノレポ設計 • ルートにgo.modを配置し、シングルモジュール化 • ディレクトリ構成 ◦ 基本シンプルな構成に、コンポーネントごとにディレクトリに分割 ◦ メトリクス、ロギング、コンフィグなどのみ共通パッケージ化 •

    DB, protobuf などのスキーマの管理方法 ◦ 共通で使う構造体は使い回せるように • terraformやkubernetesのマニフェストなども全てモノレポ化 • CI/CD ◦ 全体または一部のコンポーネントをタグ打ちリリースできるように