Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
増えすぎたマイクロサービスをモジュラーモノリスに移行しているお話
Search
kazuhiro Tashiro
July 18, 2023
Technology
3
4k
増えすぎたマイクロサービスをモジュラーモノリスに移行しているお話
kazuhiro Tashiro
July 18, 2023
Tweet
Share
More Decks by kazuhiro Tashiro
See All by kazuhiro Tashiro
ECS Fargateを本番投入して得た悲喜交交
masaaania
2
4k
Other Decks in Technology
See All in Technology
事業状況で変化する最適解。進化し続ける開発組織とアーキテクチャ
caddi_eng
1
1.4k
『HOWはWHY WHATで判断せよ』 〜『ドメイン駆動設計をはじめよう』の読了報告と、本質への探求〜
panda728
PRO
5
2.1k
セマンティックHTMLによる アクセシビリティ品質向上の基礎
zozotech
PRO
0
120
OSだってコンテナしたい❗Image Modeが切り拓くLinux OS運用の新時代
tsukaman
0
110
Error.prototype.stack の今と未来
progfay
1
180
Kubernetesと共にふりかえる! エンタープライズシステムのインフラ設計・テストの進め方大全
daitak
0
400
LINEスキマニ/LINEバイトにおけるバックエンド開発
lycorptech_jp
PRO
0
320
Rubyist入門: The Way to The Timeless Way of Programming
snoozer05
PRO
7
520
レガシーで硬直したテーブル設計から変更容易で柔軟なテーブル設計にする
red_frasco
2
260
QAを"自動化する"ことの本質
kshino
1
140
Perlの生きのこり - YAPC::Fukuoka 2025
kfly8
0
140
AIと自動化がもたらす業務効率化の実例: 反社チェック等の調査・業務プロセス自動化
enpipi
0
680
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
95
14k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
[RailsConf 2023] Rails as a piece of cake
palkan
57
6.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Why You Should Never Use an ORM
jnunemaker
PRO
60
9.6k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
4 Signs Your Business is Dying
shpigford
186
22k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
Transcript
増えすぎたマイクロサービスをモジュラーモノリスに移行 しているお話 株式会社サイバーエージェント Kazuhiro Tashiro 2023.7.19 技術的負債、どうやって解消した?リアーキテクチャ・リファクタ事例から学ぶ Lunch LT @Findy
自己紹介 株式会社サイバーエージェント DeveloperProductivity室 サーバーサイドエンジニア OSSのフィーチャーフラグマネジメントシステム Bucketeerの開発・社内SaaSの運用をしています。
本日お話すること - Bucketeerのアーキテクチャとその課題を簡単に。 - モジュラーモノリスの導入について。
Bucketeer - フィーチャーフラグ、A/Bテストの提供・管理 - セルフホストして使ってもらえるように準備中です🏃 bucketeer-io/bucketeer https://bucketeer.io/
既存のアーキテクチャと課題
既存のアーキテクチャ - 約30個のマイクロサービスを運用 - 開発初期から機能のドメインに応じてしっかりサービスを分割してきた。 - サービスの数が増えてくると、問題も増えてくる。 - 運用コスト・学習コスト・インフラコスト
- セルフホストユーザーにとってのハードル
全体図
モジュラーモノリスアーキテクチャ - モノリスとマイクロサービスの中間地点(のどこか)。 - 明確な定義はない。(それぞれの組織・プロダクトがそれぞれのモジュラーモノリスを設 計している) - 「マイクロサービスのコンポーネント性を享受しながらモノリスのシンプルさを享受する」 -
一般的な特徴 - モノリスと同じようにシングルプロセスで動作。 - モノリスと比べて明確な(時に強制的な)コンテキスト境界の設定。
どのようにモジュラーモノリスを導入したか
既存アーキテクチャ - マイクロサービスのPodにはサイドカーとしてEnvoyを置いている。
変更後アーキテクチャ - backendというアプリ(コンテナ)を作成。 - backendの中にポートを変えて複数サーバーを立ち上げることにする。 - アプリ内のサービス間通信もAPIを介して行う。 - コンテキスト間での直接関数呼び出しは選択せず。
- 将来またマイクロサービス化する可能性を考慮してAPIを残す。
複数のサーバーをひとつのアプリ内に 単純にgrpcサーバーを並べていく。 https://github.com/bucketeer-io/bucketeer/blob/08a8685d0d53ff1a07dd28ad02c48143ae49d6c4/pkg/backend/cmd/server/server.go#L442-L468
複数のサーバーをひとつのアプリ内に - 元々のマイクロサービスがシングルランタイム上に並行稼働しているだけなので、 既存コード・ディレクトリ構成の変更はほぼ無かった。 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 変更前 変更後
変更前
変更後
アーキテクチャ変更の結果 - backendアプリの内部に11個のサーバーを並列で稼働。 - 当然、個別にスケールできなくなった。 - ただし、集約したサービスの大部分はリクエスト量が多くない。 (管理画面からのアクセス) -
リクエスト量が多いサービスもRedisを利用して負荷をかなり減らしているので、デメリッ トは小さいと判断。
アーキテクチャ変更の結果 - 起動時間やスケールの所要時間はほとんど変化なし。 - ひとつのアプリ内で複数のサーバーを起動すると影響が出るかもと危惧していたが大 丈夫でした。 - Goのnet/httpを単純に使ってるのでリソース消費量は小さい。
- リソース消費の大きな言語やフレームワークを利用していると悪影響が出やすいかもし れない。
実際のPR, Issue - Issue: マイクロサービスから一部モジュラモノリスへの変更 - https://github.com/bucketeer-io/bucketeer/issues/405 - その他の関連情報やPRなどをこのIssueにまとめています。
まとめ ひとつのアプリ内で複数サーバーを走らせることによって、増えす ぎたマイクロサービスをまとめることができた。
採用強化中です✊ サイバーエージェント Developer Productity室はエンジニア募集中で す! ご興味ある方は是非 DP室公式サイト: https://site.developerproductivity.dev/ を御覧ください!