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/