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
2.5k
増えすぎたマイクロサービスをモジュラーモノリスに移行しているお話
kazuhiro Tashiro
July 18, 2023
Tweet
Share
More Decks by kazuhiro Tashiro
See All by kazuhiro Tashiro
ECS Fargateを本番投入して得た悲喜交交
masaaania
2
3.5k
Other Decks in Technology
See All in Technology
Google Cloud Next '24でブログを10本書いた方法と勉強会を沸かせた方法
yasumuusan
0
330
BPStudyの200回を中心にIT業界を振り返る。そしてこれから
haru860
3
410
Building a RAG-poweredAI chat appwith Python and VS Code
pamelafox
0
160
アクセス制御にまつわる改善 / Improving access control
itkq
0
590
Microsoft for Startups Founders Hub_20240429 update
daikikanemitsu
1
2.4k
ワールドカフェI /チューターを改良する / World Café I and Improving the Tutors
ks91
PRO
0
150
AWSに詳しくない人でも始められるコスト最適化ガイド
yuhta28
2
400
TechFeed Experts Night#27 〜 フロントエンドフレームワーク最前線 (Svelte)
baseballyama
2
590
実例で紹介するRAG導入時の知見と精度向上の勘所
yamahiro
5
1.6k
Cypress or Playwright?
rainerhahnekamp
0
170
LangSmith入門―トレース/評価/プロンプト管理などを担うLLMアプリ開発プラットフォーム
os1ma
5
710
20分で完全に理解するGrafanaダッシュボード
hamadakoji
5
890
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
20
1.6k
Fireside Chat
paigeccino
22
2.6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
123
39k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
21
1.9k
How GitHub (no longer) Works
holman
305
140k
Gamification - CAS2011
davidbonilla
77
4.6k
How STYLIGHT went responsive
nonsquared
92
4.8k
Web development in the modern age
philhawksworth
203
10k
Debugging Ruby Performance
tmm1
70
11k
Principles of Awesome APIs and How to Build Them.
keavy
121
16k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3.1k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
660
120k
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/ を御覧ください!