1
LINE Shop Asynchronous Thrift RPC with Armeria Architecture リクエスト数 (shop-server) Distributed Tracing - Zipkin Thrift RPC (Remote Procedure Call) LINE 製 Asynchronous RPC/REST Framework ! マイクロサービスのための高速な RPC - Thrift, gRPC ! HTTP/2 対応 - Client-side Load Balancing ! マイクロサービスの信頼性を保つために必要な機能 - Micrometer による詳細なサービスメトリック出力 - Zipkin による分散トレーシング機能 - Circuit breaker - 過負荷時に特定のサービスを切り離す機能 ! 動くAPIリファレンスがすぐに作れるDocService LINE メッセージングプラットフォーム標準の RPC プロトコル ! 型があるスキーマ・引数と返り値が定義されたメソッド - Thrift IDL により定義 - IDL を共有するだけで、異言語でも共通のモデルが使える ! JSON より Serialize/Deserialize が高速 - プロトコルは選択可能だが、基本はバイナリ (TBinary, TCompact) " 一般的でないため、外部公開 API には使いにくい - 特に JavaScript の Thrift ライブラリが巨大 スタンプ 絵文字 着せかえ LINE 内の有料デジタルコンテンツを販売 In App Shop, LINE STORE… 共通の API・バックエンド・サーバー Microservices Armeria 機能ごとにサービスを分離 - 認証 - 商品情報取得 - 商品検索 - 所有権情報取得 - スタンプ送信認可 - LINE STORE (Web) Asynchronous I/O / Reactive Streams もっとはやく、もっと効率的に... ! 急激なリクエスト集中に対応 - Thread pool を使った並列処理では、スレッドの枯渇が起きる - CPU・ネットワーク帯域を限界まで使い切る ! RxJava2 を利用したストリーム処理 - API サーバー内部の多くが、collection への map 処理 - サーバーサイドでも RxJava2 を使って、非同期処理を柔軟に " 学習コストと過渡期の移行問題 - 中途半端にせず、全て非同期になれば、非同期でしかかけない スタンプ 絵文字 着せかえ ユーザー token 認証 Product 情報取 Ownership 情報取 サービスを跨いだ分散トレーシング Zipkin Trace の仕組み Server A Server Server Server traceId: 5 getB( traceId: 5 getD( traceId: 5 getC( Trac getA( Server A Custom Zipkin Server (imon- tracing) Server B Thrift Spans Thrift Spans Elasticsearch Zipkin UI Zipkin Storage in LINE Shop 普段のリクエスト ~ 50K requests/sec イベント/年末年始 ~ 100K requests/sec Metrics Monitoring - Micrometer / Prometheus マイクロサービス化すると、問題発見が難しくなる? ! Micrometer を利用した、詳細なサービスメトリックス出力 - API (Client-side, Server-side)・DBのレイテンシを監視 - Percentile ベースの値を出力、平均値に意味はない - Grafana を利用して1画面で多くの情報を確認 - DB, Cache, ThreadPool, GC… 全てを見える化 ! Prometheus で問題の発見を助ける横断的なアラートルールを設定 - すべての API のレイテンシの変化・エラーレートを監視 - 問題発生時には、LINE, Slack へサービス・API名を通知 http://line.github.io/

LINE Shop Architecture - static.line-scdn.net fileLINE Shop Asynchronous Thrift RPC with Armeria Architecture 櫤µÄ: TIPQ TFSWFS Distributed Tracing - Zipkin Thrift RPC (Remote

  • Upload
    vuduong

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

Page 1: LINE Shop Architecture - static.line-scdn.net fileLINE Shop Asynchronous Thrift RPC with Armeria Architecture 櫤µÄ: TIPQ TFSWFS Distributed Tracing - Zipkin Thrift RPC (Remote

LINE Shop

Asynchronous Thrift RPC with Armeria

Architecture

リクエスト数 (shop-server)

Distributed Tracing - Zipkin

Thrift RPC (Remote Procedure Call)

LINE 製 Asynchronous RPC/REST Framework ! マイクロサービスのための高速な RPC - Thrift, gRPC ! HTTP/2 対応 - Client-side Load Balancing ! マイクロサービスの信頼性を保つために必要な機能 - Micrometer による詳細なサービスメトリック出力 - Zipkin による分散トレーシング機能 - Circuit breaker - 過負荷時に特定のサービスを切り離す機能 ! 動くAPIリファレンスがすぐに作れるDocService

LINE メッセージングプラットフォーム標準の RPC プロトコル ! 型があるスキーマ・引数と返り値が定義されたメソッド - Thrift IDL により定義 - IDL を共有するだけで、異言語でも共通のモデルが使える ! JSON より Serialize/Deserialize が高速 - プロトコルは選択可能だが、基本はバイナリ! (TBinary, TCompact) " 一般的でないため、外部公開 API には使いにくい - 特に JavaScript の Thrift ライブラリが巨大

スタンプ 絵文字 着せかえLINE 内の有料デジタルコンテンツを販売 In App Shop, LINE STORE… 共通の API・バックエンド・サーバー

Microservices

Armeria

機能ごとにサービスを分離 - 認証 - 商品情報取得 - 商品検索 - 所有権情報取得 - スタンプ送信認可 - LINE STORE (Web)

Asynchronous I/O / Reactive Streams

もっとはやく、もっと効率的に... ! 急激なリクエスト集中に対応 - Thread pool を使った並列処理では、スレッドの枯渇が起きる - CPU・ネットワーク帯域を限界まで使い切る ! RxJava2 を利用したストリーム処理 - API サーバー内部の多くが、collection への map 処理 - サーバーサイドでも RxJava2 を使って、非同期処理を柔軟に " 学習コストと過渡期の移行問題 - 中途半端にせず、全て非同期になれば、非同期でしかかけない

スタンプ 絵文字 着せかえ

ユーザー token 認証

Product 情報取

Ownership 情報取

サービスを跨いだ分散トレーシング

Zipkin の Trace の仕組み

Server A Server

Server Server

traceId: 5

getB(

traceId: 5

getD(

traceId: 5

getC(

TracgetA(

Server A CustomZipkin Server!(imon-

tracing)Server B

Thrift

Spans

Thrift

Spans

Elasticsearch

Zipkin UI

Zipkin Storage in LINE Shop

普段のリクエスト ~ 50K requests/sec イベント/年末年始 ~ 100K requests/sec

Metrics Monitoring - Micrometer / Prometheus

マイクロサービス化すると、問題発見が難しくなる? ! Micrometer を利用した、詳細なサービスメトリックス出力 - API (Client-side, Server-side)・DBのレイテンシを監視 - Percentile ベースの値を出力、平均値に意味はない - Grafana を利用して1画面で多くの情報を確認 - DB, Cache, ThreadPool, GC… 全てを見える化 ! Prometheus で問題の発見を助ける横断的なアラートルールを設定 - すべての API のレイテンシの変化・エラーレートを監視 - 問題発生時には、LINE, Slack へサービス・API名を通知

http://line.github.io/