Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Last one mile to Microservices
Search
m0r1w4k1
November 13, 2021
Technology
500
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Last one mile to Microservices
Last one mile to Microservices
Go Conference 2021 Autumn
m0r1w4k1
November 13, 2021
More Decks by m0r1w4k1
See All by m0r1w4k1
新卒3ヶ月目でスクラムマスターをやった話 / scrum-fest-mikawa-2020-09-26
m0r1w4k1
0
70
Other Decks in Technology
See All in Technology
AI駆動開発の時代になったのでトヨタ生産方式から見直す
terurou
4
5.1k
並行性の問題を防げ!実践トランザクション入門
occhi
0
280
味覇で作るパスタが美味い - 20261001_yabaubuki.dev
livesense
PRO
0
110
3つのアプローチで目指す チームを強くするAI駆動開発
thkt
0
140
[2026-09-30]ロックンロールは鳴り止まないっ - 信頼性かまってちゃん - 「データ駆動を投げ捨ててまで。」追いかける信頼性改善に向けた取り組みの話
tosite
0
210
不可逆な意思決定を避けながら10億超の顧客データを AI Ready にするデータ基盤設計
baseballyama
1
190
生成AIを使って「人が」考える技術 ― AI時代の人機共想と実践ノウハウ|UNITT AC2026
ishiirikie
0
570
AI時代のAPI開発を加速する品質ガードレール / API Quality Guardrails in the AI Era
yokawasa
0
160
ai_cording_with_k8s_knowledge.pdf
mochizuki875
1
310
go-sqletch
moznion
0
110
ファミコンでPHPを動かす / PHP on the Famicom side b
tomzoh
0
140
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
3
410
Featured
See All Featured
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
WENDY [Excerpt]
tessaabrams
14
40k
Ruling the World: When Life Gets Gamed
codingconduct
0
390
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Everyday Curiosity
cassininazir
0
350
So, you think you're a good person
axbom
PRO
2
2.2k
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
440
Designing for Performance
lara
612
70k
[SF Ruby Conf 2025] Rails X
palkan
3
1.4k
Transcript
マイクロサービス移行を仕上げる Last one mile 2021/11/13 Kenta Moriwaki
期待値調整 • マイクロサービスを使ったシステムで、モノリスで動いていたサー ビスの一部分を置き換えました • マイクロサービスへはこのように移行すべきだ、という発表ではな いです • Goの内部実装の話は少ないです:bow:
今日話したいこと • Goを使ってマイクロサービスの運用を始めた、事例ベースの話です • 元となる設計思想や基本的なサービスはすでに存在していて、プロダ クションに出す手前あたりで自分はジョインしました • 本番運用するにあたり工夫した点や悩んだ点など共有したいです
自己紹介 森脇健太 Retty株式会社 エンジニアリング部門 ソフトウェアエンジニア バックエンドとフロントエンド書いています 南インドやネパールのカレーが好きです
アジェンダ • 背景 • 本番導入に向けて必要なこと • こんなことがありました • まとめ
背景 Rettyが提供している主なページ • 店舗ページ ◦ レストランの情報など • 店舗リストページ ◦ 検索結果など、店舗のリスト
店舗ページ 店舗リストページ
背景 既存のサービスの問題 • ビジネスロジックが散らばった10年もののPHPシステム • 大規模なアクセスを支えるためのキャッシュが厚く、情報が反映され るタイミングが読めない • 過去に単一のサービスでバックエンドを作り直そうとしたが、重複し たロジックが残ったりして苦しかった前例があった
マイクロサービスをベースとした、 リアーキテクチャが3年ほど前から進行中
背景:リアーキテクチャへの道筋① モノリス → Adapterサービス → BFF → Frontendの形をまず用意
背景:リアーキテクチャへの道筋② Adapterの主要一部(レストラン情報を返すサービス)を置き換える
背景:リアーキテクチャへの道筋③ Adapterを少しずつ別のアプリケーションに置き換える
今回の話のスコープ 途中まで進んでいたAdapterの置き換え作業 サービスからモノリスの依存を外し、本番に出した話です
本番導入に向けて必要だったこと • モノリスからの脱却 • ログインユーザーのための認証基盤との連携 • 本番へのリリース方針を決める
本番導入に向けて必要だったこと • モノリスからの脱却 • ログインユーザーのための認証基盤との連携 • 本番へのリリース方針を決める
モノリスからの脱却 サービスの分割単位は.protoファイルで定義 Adapterサービスは複数サービスを兼任していた
マイクロサービス多すぎ問題 Adapterから切り離すサービスが多いわりに..... • サービスそれぞれが小さい • 参照系の機能しか持たない ◦ 提供しているサービスの性質上、参照>>>更新 それぞれを別のインスタンスで動かすのはまだ早すぎるのでは?
miscellaneous(その他)サービス 小さな参照系のサービスをまとめる 別々のインスタンスで動かし、独立したデプロイの利点がまだない • チームごとに担当サービスがある、という組織構造ではなかった .protoファイルの存在により切り出しの粒度がわかっていた • 大きいサービスは独立、小さいものはmiscellaneousサービスに入れる といった判断が実装前に判断できた •
サービスは他のサービスのコードに依存しないようにして、いつでも 分離できるようにした
サービスの全体図
サービスの全体図
本番導入に向けて必要だったこと • モノリスからの脱却 • ログインユーザーのための認証基盤との連携 • 本番へのリリース方針を決める
認証周りの話 ユーザーがログインしているかどうかでサービスが返す情報を分けたい ログイン情報を扱うセッションサービスはすでに存在し、モノリスから 利用していた
認証周りの話 マイクロサービスを跨いでセッションを保持する主なパターン • 独立型 • 中央集権型 • 分散型 • ゲートウェイ分散型
中央集権型とゲートウェイ分散型の2択に絞られた マイクロサービス時代のセッション管理 https://engineer.retty.me/entry/2019/12/21/171549
中央集権型 ユーザーの認証情報を 持ったセッションサービ スを、各サービスがそれ ぞれ問い合わせる • Revokeが簡単 • 可用性が必要
ゲートウェイ分散型 BFFのようなGatewayで セッションサービスを問 い合わせ、認証情報を JWTで受け取る 各サービスはJWTを受け 取り、各自で検証する
ゲートウェイ分散型 • 可用性が必要なのは 変わらず • 認証情報を使うたび にセッションサービ スを叩く必要がない ので負荷は減る 今後の負荷の可能性を考
えてこちらを採用するこ とに
本番導入に向けて必要だったこと • モノリスからの脱却 • ログインユーザーのための認証基盤との連携 • 本番へのリリース方針を決める
どう本番に出していくか ミニマムな形で本番に出す 特定契約の店舗ページのみを切り替える ストラングラーパターンを使う • 特定店舗の場合はマイクロサービス 群を利用したシステムへ、それ以外 は既存のシステムへ、といった形で 振り分ける
モノリスか新しいサービスかを振り分けるサービス リクエストルーター(echoを使ったシンプルなシステム) 既存システム マイクロサービス群 を利用したシステム リクエストされたURLを もとに振り分け 10店舗 → 25店舗
→ 100店舗…と徐々に広げながら負 荷に耐えうるかを見ていった
リクエストルーター リクエストされたURLパスを 正規表現でチェックして、新 しいサービスへと振り分ける • 該当のページのURL • それ特有のAPIのURL • フロントエンドで必要な
URL(/_nuxt/ etc...)
本番導入に向けて必要だったこと • モノリスからの脱却 • ログインユーザーのための認証基盤との連携 • 本番へのリリース方針を決める
本番導入に向けて必要だったこと • モノリスからの脱却 • ログインユーザーのための認証基盤との連携 • 本番へのリリース方針を決める
こんなことがありました • ファイルディスクリプタの枯渇という落とし穴 • 対象店舗が更新されない
こんなことがありました • ファイルディスクリプタの枯渇という落とし穴 • 対象店舗が更新されない
ファイルディスクリプタの枯渇という落とし穴 本番に出して一ヶ月ほど経ち、その他サービスのうちの一つのエラー レートが上昇 socket: too many open files • ファイルディスクリプタが枯渇していた
ファイルディスクリプタの枯渇という落とし穴 https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html
ファイルディスクリプタの枯渇という落とし穴 https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html
ファイルディスクリプタの枯渇という落とし穴 Amazon ECSのデフォルトのリソース制限に引っかかっていた -> ulimitを増やして解決 一つのアプリケーションにサービスを詰め込んでいった結果、当初の想 定以上にDBアクセスが増えてしまっていた。
こんなことがありました • ファイルディスクリプタの枯渇という落とし穴 • 対象店舗が更新されない
対象店舗が更新されない 振り分け対象の店舗はS3に格納し、リクエストルーターで定期的に取得
対象店舗が更新されない
対象店舗が更新されない 「*」デリファレンスされてる?? 新しい構造体なので、 tickerのチャネルを待ち受けて いるゴルーチンは存在してい ない......
None
対象店舗が更新されない
まとめ 紆余曲折ありましたがマイクロサービスを本番に出して運用することが できています • 本番に出すことで初めてわかるようになる問題があるので、 実際に運用してみることは重要と再認識しました モノリスをマイクロサービスにする過程で、モジュラモノリスという選 択もしました • 状況によっては分割しない、という選択もありだと思います
• その時々に合ったもので、必要なら他のものに変更しやすいアーキテ クチャを選んでいきたいです
None