Upgrade to Pro — share decks privately, control downloads, hide ads and more …

俺たちのmicroserviceはまだ始まったばかり

kokukuma
January 08, 2019

 俺たちのmicroserviceはまだ始まったばかり

mercari.go #5

kokukuma

January 08, 2019
Tweet

More Decks by kokukuma

Other Decks in Technology

Transcript

  1. 私はkokukumaです • 名前 ◦ 狩野達也 • Github ◦ kokukuma •

    Twitter ◦ @kokukuma • 仕事 ◦ Mercari Backend チーム / マイクロサービス開発
  2. • 本に書いてあった説明 ◦ 『マイクロサービスアーキテクチャの目標は、それぞれ責任を持って 1つの機能をこなす一連の小さ なアプリケーションを構築し、個々のマイクロサービスに自律性、独立性、自己完結性を与えること です』プロダクションレディマイクロサービス ◦ 『満たすべき特徴は、疎結合、高凝縮、単一目的』 Microservice

    Architecture at Medium ◦ • わかりやすいなと思った説明 ◦ 開発・運用をスケールアウト出来るようにするためにやる ▪ 自分が関わる対象範囲を小さくする ▪ その範囲を、全部自分のものにする ▪ 他の人の範囲を、API経由で利用する ◦ 『Google map を使ったwebサービス』をイメージしてサービスを分割する マイクロサービスとは
  3. こんな感じで分割するのがいい • 特徴 ◦ 開発プロセスが独立している ◦ 組織が独立している ◦ コード/データが分離されている ◦

    • こんな事は起きない ◦ リリースするとき、Google mapの人に連絡しな いといけない ◦ サービス開発してたら、 GitHubが壊れた ◦ GitHubとGoogle mapで同じDBみてる コード/データ、開発プロセス、運用プロセス、組織、それぞれが各サー ビスにおいて独立している
  4. 前進してます、マイクロサービス化 • プラットフォームチームが、共通機能の準備 ◦ gatewayサービス、テンプレートサービス、プロダクションレディチェックリスト ◦ モニタリング、エラーレポーティング、 Oncall対応 ◦ 「Microservices

    Platform at Mercari」in Mercari Tech Conf 2018 ◦ • バックエンドチームが、既存機能のマイクロサービス化を実施 ◦ API単位で進められている。 ◦ Mercari APIの互換性を保ちつつ、既存ロジックを分割している。 Client側/DB側は変えない。 ◦ 「Listing Service: モノリスからマイクロサービスへ」 in Mercari Tech Conf 2018 ◦ • Listing serviceのリリースを実施中 ◦ Listing serviceは、一つのAPIを担当。 ◦ 依存するサービスを含めると 10数サービスくらい。
  5. • mercariのDBに対するCRUDを提供 ◦ 運用可能な範囲のサービス数で、 Listingサービスのマイクロサービス化を進める ◦ 他のサービスでの資産を使うため、 Goで書かれている。 ◦ あくまで、マイクロサービス化の

    一時的対処として行っている。 Legacy db serviceとは gRPCでリクエストを受ける。クエリ を直接受け取らない。 クエリ組み立てて、MySQLに 投げる。結果を組み立てて返 す。 特定のテーブルのみアクセ ス出来るようにする。
  6. • 分散モノリスを助長する危険性がある ◦ テーブルやロジックが誰のものか考えずに使えてしまう ◦ テーブル呼んでるところや、ロジックがいろんなサービスに分散してしまう ◦ • 一時的なものにするために.... ◦

    アクセスできるサービス /テーブルを制限 ▪ オーナーが未定のテーブルのみアクセス許可 ▪ 使いたいと言ってるサービスが、そのテーブルのオーナーぽかったら。。 ▪ ◦ シンプルなCRUDのみ提供 ▪ トランザクション、Join、Subqueryは提供しない。 ▪ 複雑なことしたくなるロジックは、オーナーが持ったほうがいい ▪ そういうロジックが散るのは危ない。別途サービスを作ろう。 Legacy db serviceの怖さと対応
  7. Legacy db service、必要? • Legacy db ができた背景 ◦ API単位でマイクロサービス化を進めたために、一気に数 10サービスリリースする必要が出てきた

    • もし、 ◦ データ側からサービスを一つづつ作っていったら、 legacy dbはいらなかったかも。 • ただ、 ◦ そのサービスを使うように mercari APIを修正する必要がある ◦ 時間もかかるし、手間もかかる。
  8. • Gateway ◦ マイクロサービスに行くか、既存の mercari APIに行くかが別れている ◦ API毎に制御 ◦ •

    Mercari API側 ◦ 複数あって開発者が自由に利用できる ◦ 特定のsubdomainにアクセスする ◦ • マイクロサービス側 ◦ 複数デプロイすることは現状してない ◦ 開発者が自分のサービスをデプロイする 現状のQA環境
  9. • 状況 ◦ 定期的に動かなくなる ▪ 独立してデプロイする ▪ 独立したQAはしてない ▪ リクエストも少なく発見が遅れる

    ◦ 他のQAが進まなくなる • 対策 ◦ デプロイの制限 ◦ 動く状況を保つ ◦ 複製出来るようにする QA環境が安定しない問題
  10. • 全体的に動く状態を保つ ◦ 数個の環境をルール決めて運用する。動かなくなったら、検知出来るようにする。 ◦ てっとり早いが、スケールはしない。 ◦ • サービス毎に動く状態を保つ ◦

    各サービスの独立性を上げて、動く状態を保つ。 ◦ スケールする。文化による対応、浸透するまでに時間がかかる。 ◦ • QA環境を複製できるようにする ◦ QA環境を用途に応じて、環境を低コストで複製できるようにする。 ◦ ある程度スケールする。 対策の種類
  11. • 対策内容 ◦ 1つ以上の固定された環境を持つ。 ◦ 正常系のリクエストを投げ続け、通らな かったらアラート。 • メリット・デメリット ◦

    低コストで実施出来るメリット ◦ スケールしないデメリット ▪ 全サービスで統一したルールを守る 必要がある。 ▪ APIが増えたときに、リクエストの追 加が発生。 ▪ 動かなくなる可能性を下げる力は働 かない ◦ 運用コストが大きくなるデメリット 全体的に動く状態を保つ
  12. • 対策内容 ◦ 各サービスそれぞれが、機能を提供出来 ていることを保証する ◦ QA環境に、本番に近い品質を求める ▪ unit test・サービス内のe2e

    test ▪ デプロイ後のintegration test ▪ 後方互換性の検証 ▪ 問題があったときのアラート ◦ • メリット・デメリット ◦ サービスの独立性を推進するメリット。 ◦ 対策が浸透するまで時間がかかるデメリッ ト。 サービス毎に動く状態を保つ
  13. • 対策内容 ◦ サービスメッシュを使う ▪ 特定リクエストのみ特定サービスに 切り替える ▪ 各サービスでは、デプロイだけ ▪

    QAを主導する人が、routeを選択 ◦ • メリット・デメリット ◦ 問題を一番確実に解決出来るメリット。 ◦ API単位のQAを根付かせてしまうデメリッ ト QA環境を複製できるようにする
  14. • 思うこと ◦ 最終的には、「サービス毎に動く状態保つ」方向に行かなければならない。 ◦ どのみち、QA環境を分ける需要は発生する。 ◦ Sakura側は事情が違いすぎて、サービスメッシュ導入難しい。 ◦ どれがうまくいくかは、やってみないとわからないところある。

    ◦ • 全部組み合わせる形でやってみたい ◦ サービスメッシュ使って、特定サービスだけ QAできる状況を作る。 ◦ Master環境は、リクエスト投げ続けて、動く状態を保つ。 ◦ Sakura側は、各サービスの独立性をあげる。 で、どうするか?