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

増えすぎたマイクロサービスをモジュラーモノリスに移行しているお話

 増えすぎたマイクロサービスをモジュラーモノリスに移行しているお話

kazuhiro Tashiro

July 18, 2023
Tweet

More Decks by kazuhiro Tashiro

Other Decks in Technology

Transcript

  1. 増えすぎたマイクロサービスをモジュラーモノリスに移行
    しているお話

    株式会社サイバーエージェント Kazuhiro Tashiro
    2023.7.19 技術的負債、どうやって解消した?リアーキテクチャ・リファクタ事例から学ぶ Lunch LT @Findy

    View Slide

  2. 自己紹介


    株式会社サイバーエージェント DeveloperProductivity室

    サーバーサイドエンジニア

    OSSのフィーチャーフラグマネジメントシステム

    Bucketeerの開発・社内SaaSの運用をしています。


    View Slide

  3. 本日お話すること



    - Bucketeerのアーキテクチャとその課題を簡単に。

    - モジュラーモノリスの導入について。


    View Slide

  4. Bucketeer

    - フィーチャーフラグ、A/Bテストの提供・管理

    - セルフホストして使ってもらえるように準備中です🏃

    bucketeer-io/bucketeer https://bucketeer.io/

    View Slide

  5. 既存のアーキテクチャと課題


    View Slide

  6. 既存のアーキテクチャ

    - 約30個のマイクロサービスを運用

    - 開発初期から機能のドメインに応じてしっかりサービスを分割してきた。

    - サービスの数が増えてくると、問題も増えてくる。

    - 運用コスト・学習コスト・インフラコスト

    - セルフホストユーザーにとってのハードル

    View Slide

  7. 全体図


    View Slide

  8. モジュラーモノリスアーキテクチャ

    - モノリスとマイクロサービスの中間地点(のどこか)。

    - 明確な定義はない。(それぞれの組織・プロダクトがそれぞれのモジュラーモノリスを設
    計している)

    - 「マイクロサービスのコンポーネント性を享受しながらモノリスのシンプルさを享受する」

    - 一般的な特徴

    - モノリスと同じようにシングルプロセスで動作。

    - モノリスと比べて明確な(時に強制的な)コンテキスト境界の設定。

    View Slide

  9. どのようにモジュラーモノリスを導入したか


    View Slide

  10. 既存アーキテクチャ

    - マイクロサービスのPodにはサイドカーとしてEnvoyを置いている。


    View Slide

  11. 変更後アーキテクチャ

    - backendというアプリ(コンテナ)を作成。

    - backendの中にポートを変えて複数サーバーを立ち上げることにする。

    - アプリ内のサービス間通信もAPIを介して行う。

    - コンテキスト間での直接関数呼び出しは選択せず。

    - 将来またマイクロサービス化する可能性を考慮してAPIを残す。

    View Slide

  12. 複数のサーバーをひとつのアプリ内に

    単純にgrpcサーバーを並べていく。

    https://github.com/bucketeer-io/bucketeer/blob/08a8685d0d53ff1a07dd28ad02c48143ae49d6c4/pkg/backend/cmd/server/server.go#L442-L468

    View Slide

  13. 複数のサーバーをひとつのアプリ内に

    - 元々のマイクロサービスがシングルランタイム上に並行稼働しているだけなので、
    既存コード・ディレクトリ構成の変更はほぼ無かった。

    account
    cmd/server.go
    api/api.go
    apiサーバーの立ち上げ
    アプリのエントリポイント
    auth
    cmd/server.go
    api/api.go
    apiサーバーの立ち上げ
    アプリのエントリポイント
    apiサーバーの立ち上げ
    api.goの変更は一切無し
    アプリのエントリポイント
    account
    api/api.go
    backend
    cmd/server.go
    auth
    api/api.go
    変更前
 変更後


    View Slide

  14. 変更前


    View Slide

  15. 変更後


    View Slide

  16. アーキテクチャ変更の結果

    - backendアプリの内部に11個のサーバーを並列で稼働。

    - 当然、個別にスケールできなくなった。

    - ただし、集約したサービスの大部分はリクエスト量が多くない。

    (管理画面からのアクセス)

    - リクエスト量が多いサービスもRedisを利用して負荷をかなり減らしているので、デメリッ
    トは小さいと判断。


    View Slide

  17. アーキテクチャ変更の結果


    - 起動時間やスケールの所要時間はほとんど変化なし。

    - ひとつのアプリ内で複数のサーバーを起動すると影響が出るかもと危惧していたが大
    丈夫でした。

    - Goのnet/httpを単純に使ってるのでリソース消費量は小さい。

    - リソース消費の大きな言語やフレームワークを利用していると悪影響が出やすいかもし
    れない。


    View Slide

  18. 実際のPR, Issue


    - Issue: マイクロサービスから一部モジュラモノリスへの変更

    - https://github.com/bucketeer-io/bucketeer/issues/405

    - その他の関連情報やPRなどをこのIssueにまとめています。


    View Slide

  19. まとめ

    ひとつのアプリ内で複数サーバーを走らせることによって、増えす
    ぎたマイクロサービスをまとめることができた。


    View Slide

  20. 採用強化中です✊

    サイバーエージェント Developer Productity室はエンジニア募集中で
    す!

    ご興味ある方は是非 

    DP室公式サイト: https://site.developerproductivity.dev/

    を御覧ください!


    View Slide