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

信頼性と柔軟性向上のためのマイクロサービスのリアーキテクティング/architecture-r...

 信頼性と柔軟性向上のためのマイクロサービスのリアーキテクティング/architecture-redesign-of-microservices-for-improved-reliability-and-flexibility

長年運用してきたマイクロサービスが成長して複雑になったときに、管理、システム両方のアーキテクチャのリデザインを行い、信頼性と柔軟性が高いマイクロサービスを構築するための方法を事例ベースで共有します。

以下イベントでの登壇資料です。
https://event.shoeisha.jp/devsumi/20230727

hirai.kazushi

July 27, 2023
Tweet

More Decks by hirai.kazushi

Other Decks in Technology

Transcript

  1. ⾃⼰紹介 l 所属︓ l LINE Fukuoka 株式会社 l 開発1室 Kチームマネージャ

    l サーバサイドエンジニア l 興味︓ l 家族(娘、息⼦), 体を動かすこと, マラソン l Twitter: @hkazushi0627 ฏҪ Ұ࢙ ,";64)*)*3"*
  2. LINE STORE 技術スタック l 開発⾔語︓ l Java, Kotlin (JVMで動作する⾔語) l

    フレームワーク︓ l Spring Boot l Armeria/Central Dogma/Decaton(LINE OSS) l ストレージ︓ l MySQL, MongoDB, Elasticsearch, Redis l インフラストラクチャ︓ l Verda (プライベートクラウド) l VM(仮想マシン), Kubernetes
  3. 歴史 – 2011年 2012 スタンプショップ リリース 2013 LINE STOREリリース 2014

    LINE着せかえ LINEクリエイターズスタンプ 2017 年賀キャンペーン開始 LINE公式アカウントからの おすすめスタンプ⾃動配信 2018 LINE絵⽂字 2019 LINEスタンプ プレミアム 2020 メッセージスタンプ LINEスタンプ プレミアム デラックスコース 2021 LINEスタンプ プレミアム 台湾、インドネシア LINEアニメーション絵⽂字 2011 LINEリリース 2022 LINEスタンプ プレミアム LINE Music LINEMO バンドル l サーバサイドエンジニア︓10⼈未満 l エンジニアのチーム数︓2 (プロダクトチーム) l マイクロサービスのコンポーネント数︓3 サービスローンチ当初の構成
  4. 歴史 – 現在 2012 スタンプショップ リリース 2013 LINE STOREリリース 2014

    LINE着せかえ LINEクリエイターズスタンプ 2017 年賀キャンペーン開始 LINE公式アカウントからの おすすめスタンプ⾃動配信 2018 LINE絵⽂字 2019 LINEスタンプ プレミアム 2020 メッセージスタンプ LINEスタンプ プレミアム デラックスコース 2021 LINEスタンプ プレミアム 台湾、インドネシア LINEアニメーション絵⽂字 2011 LINEリリース 2022 LINEスタンプ プレミアム LINE Music LINEMO バンドル 現在の構成 2023 現在 l サーバサイドエンジニア︓30⼈以上 l エンジニアのチーム数︓6以上 (プロダクト・フィーチャーチーム、SRE) l マイクロサービスのコンポーネント数︓80以上
  5. モノレポ l すべてのコンポーネントを1つのGitHubリポジトリで管理 l メリット︓ l 横断したコンポーネントの開発 l 共通モジュールの構成のしやすさ l

    ライブラリやフレームワークのバージョンを統⼀ l デメリット︓ l コンポーネント数が増えてくると、可視性が低下、 管理が複雑化 l ビルド、CIの遅延 l 意図しないバージョンアップによる不具合、障害の発⽣ Component A Component B Component C Repository
  6. コンポーネント数の過多 l 問題︓ l マイクロサービスやコードベースの学習が困難 l それぞれのコンポーネントがどのプロダクト、機能を担当するのか不明確 l 各コンポーネントの担当者が不明確 l

    コンポーネントについて質問したい時、 何か変更を⾏ってソースレビューしてほしいとき、だれが適切なのか︖ l 既存メンバーであっても、よくわかってないケースが多い
  7. コンポーネントのパフォーマンス、信頼性低下 l 問題︓ l マイクロサービスを⻑期間運⽤していると、初期に想定していた キャパシティと実際のデータ数やデータ量が乖離する場合がある l 要因︓ l ユーザ数の増加や需要の変化

    l ストレージのデータの増加 l 結果︓ l 特定のコンポーネントで、レイテンシ・パフォーマンスの低下 エラー数の増加 l 問題が継続すると、マイクロサービス全体が不安定になり 信頼性が低下
  8. コードベース上でドメインを表現 l リポジトリの階層で、ドメインとコンポーネントの関係を表現 l リポジトリのトップレベル = ドメイン l トップレベル配下 =

    ドメインに含まれるコンポーネント store/ + store-server + store-cms + store-decaton shop/ … subscription/ … リポジトリの構成 ドメイン コンポーネント
  9. KafkaとDecaton l Apache Kafka l 分散メッセージングシステム l ⾼い信頼性・スケーラブル l LINE共通のKafkaクラスタが使⽤できる

    l Decaton l Kafka Consumerライブラリ l LINEのOSS https://github.com/line/decaton l パーティションをマルチスレッドで同時に処理 l リトライ、レートリミッター機能が標準装備で、別途開発する必要がない
  10. 開発を⾏う上で⼯夫した点 l 各コンポーネントの役割を明確にして、機能を実装 Producer(送信者) l Kafkaにメッセージ送信 l LINEメッセージのデータ(JSON)の作成 Consumer(受信者) l

    Messaging APIのコール l リトライ・レートリミット 配信するLINEメッセージのデータに新規追加や変更が発⽣しても、 Producerのみの開発、デプロイで対応可能 = Consumerの再利⽤性が向上 メリット
  11. CQRS l CQRS = Command Query Responsibility Segregation l データ更新(コマンド)とデータ取得(クエリ)を分離、別のモデルとして扱う

    l CQRSを使って、コマンドの役割を持つコンポーネントとクエリの役割を持つ コンポーネントで、マイクロサービスを構成する l メリット︓ l コマンドとクエリに対して、異なるスケーリングやアーキテクチャの適⽤が 可能
  12. 発表の流れ まとめ l コンポーネント数過多による複雑さを解消するために、 コンポーネントドメインを導⼊ l コードベースの階層化でドメインを表現 l コードオーナーを設定して担当者を明確化 l

    コンポーネントやドメインの役割・責務を明確にして、 コンポーネントのモノリス化を防ぐ l ⾮同期メッセージングアーキテクチャやCQRSを活⽤して、 信頼性⾼い、かつ柔軟なマイクロサービスを構築
  13. マイクロサービスを安全にリリース、運⽤する⽅法 l テスト l E2Eテストの⾃動化 l ミラーリクエストを使ったパフォーマンステスト l リリース l

    カナリアリリース l パーセンテージリリース l 監視 l ダッシュボードの整備 l 分散トレーシングの活⽤
  14. Central Dogmaの活⽤ l Central Dogma l サービス構成管理リポジトリ l LINEのOSS https://line.github.io/centraldogma/

    l 設定ファイルを可⽤性⾼く、サーバ上でバージョン管理 l GitとZookeeperベースのフレームワーク l クライアントをアプリケーションに組み込んでおくと、リアルタイムで 設定値を⾃動で同期 l 設定ファイルをGitHub上で管理可能
  15. Armeria l JVM, Netty ベースのフレームワーク l LINEのOSS https://armeria.dev/ l マイクロサービス(サーバ,

    クライアント)を構築する上での機能を提供 l Non-Blocking I/O l HTTP/2 l RPC(Thrift, gRPC), RESTサーバ/クライアント, GraphQL l Spring Boot, Spring MVCとの統合 l Micrometerによるメトリクス収集 l Zipkinによる分散トレーシング l クライアントサイドロードバランシング l ⾃動リトライ、レイトリミッター、サーキットブレーカー