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
69
Other Decks in Technology
See All in Technology
LLMに渡さなかった仕事
nanaism
0
480
2026_devsumi_ozono.pdf
o3
3
510
Azure Serverless 2026:Production-ready な AI エージェント基盤 / Azure Serverless 2026: Production-Ready AI Agent Platform
miyake
2
160
データ界隈LT祭 第1回LT登壇
taromatsui_cccmkhd
2
1.4k
AIを活用するために決めた "やらないこと" - 価値に注目する / Not betting on AI
soudai
PRO
2
540
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
130
aws-iot-platform-architecture-use-cases.pdf
ma2shita
0
250
ソフトウェアDNAとクラウドエージェントのススメ
cloudace
0
110
Claude in Chrome 入門 / Introduction to Claude in Chrome
cielo1985
0
840
新機種発売前に見直そう!端末移行で再ログインが要るアプリ・要らないアプリは何が違うのか 〜シームレスに再開できる設計と実装〜
zozotech
PRO
0
200
What the customer really needed
kawaguti
PRO
3
200
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
140
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
6.3k
Code Review Best Practice
trishagee
74
20k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
990
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
280
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
2
2.1k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
350
The Pragmatic Product Professional
lauravandoore
37
7.4k
A Modern Web Designer's Workflow
chriscoyier
699
190k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
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