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
Last one mile to Microservices
Search
m0r1w4k1
November 13, 2021
Technology
0
380
Last one mile to Microservices
Last one mile to Microservices
Go Conference 2021 Autumn
m0r1w4k1
November 13, 2021
Tweet
Share
More Decks by m0r1w4k1
See All by m0r1w4k1
新卒3ヶ月目でスクラムマスターをやった話 / scrum-fest-mikawa-2020-09-26
m0r1w4k1
0
51
Other Decks in Technology
See All in Technology
データモデルYANGの処理系を再発明した話
tjmtrhs
0
520
Amazon Athenaから利用時のGlueのIcebergテーブルのメンテナンスについて
nayuts
0
150
書籍『入門 OpenTelemetry』 / Intro of OpenTelemetry book
ymotongpoo
10
630
株式会社Awarefy(アウェアファイ)会社説明資料 / Awarefy-Company-Deck
awarefy
3
12k
俯瞰と個別の⼆つの視点で紡ぐ スクラムマスターの成⻑と協働 / Dual Views Weaving Scrum Master Growth
toma_sm
1
100
エンジニア主導の企画立案を可能にする組織とは?
recruitengineers
PRO
1
350
早くて強い「リアルタイム解析基盤」から広げるマルチドメイン&プロダクト開発
plaidtech
PRO
1
160
AIエージェント開発のノウハウと課題
pharma_x_tech
10
5.8k
人生を左右する「即答」のススメ: 一瞬の判断を間違えないためにするべきこと
takasyou
9
1.3k
Oracle Cloud Infrastructure IaaS 新機能アップデート 2024/12 - 2025/02
oracle4engineer
PRO
0
110
生成AI×財務経理:PoCで挑むSlack AI Bot開発と現場巻き込みのリアル
pohdccoe
1
880
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
3
560
Featured
See All Featured
Rebuilding a faster, lazier Slack
samanthasiow
80
8.9k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
670
Building Flexible Design Systems
yeseniaperezcruz
328
38k
The Cult of Friendly URLs
andyhume
78
6.2k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Side Projects
sachag
452
42k
How GitHub (no longer) Works
holman
314
140k
Docker and Python
trallard
44
3.3k
BBQ
matthewcrist
87
9.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.3k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
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