Categories: 勉強会

#linedevday LINE Shop powered by Armeria の参加レポ@LINE DEVELOPER DAY 2016

LINE DEVELOPER DAY 2016に今年も今年も参加してきたのでそのメモです。

LINE Shop powered by Armeria

LINE開発1室 佐藤春旗様

いつでも、どこでも、無料でライブ配信&視聴可能!リアルタイムにメッセージやハートを送って、人気タレントやアーティストとのコミュニケーションを楽しもう。
LINE LIVE(ラインライブ)| 夢を叶えるライブ配信アプリ - LINE LIVE

LINE ShopとArmeriaの紹介

  • LINE Shopはスタンプやきせかえなどを売っているサービスです
    • 実はIn-App-Viewを使っているので技術的にはWebView
  • http://line.github.io/armeria/
    • 非同期的なRPCやAPIを呼び出すときに便利なライブラリ
    • クライアントとしてもサーバとしても使える
    • java8、Netty、HTTP/2などの最新のテクノロジーに追従しています
    • Thriftもネイティブでサポートしています
  • Armeriaの起源は花の名前で、英名はSea thriftになる。
    • 和名はハマカンザシという海岸の近くに咲く花
    • thriftに対応したライブラリをつくるということでarmeriaを採用した
    • アイコンがさりげなくこの花がアイコンになっている

shopのアーキテクチャ

  • ユーザはwebやweb viewを使ってだとHTTPでアクセスし、talk-serverにはthriftでアクセスする
  • ThriftやThrift RESTを用いてShop-serverにアクセスし、最終的にはDBやElasticSearchなどに保管される
  • どこでArmeriaが使われているかというと、Proxy, Shop-Server, Search FEまでArmeriaを用いている
    • Talk-serverはまだarmeriaではないが、リクエストに関してはクライアントアプリとしてArmeriaを使っている

Armeriaの利点

  • 実際の製品で使われているライブラリ
  • 非同期的なシステム、並列性と親和性が高い

Production-Ready RPC layer

  • 非同期的なシステム、並列的なシステムは多くのユーザがいてユーザのリクエストも多く、リクエスト同士は依存性がない、できるだけ低いレイテンシーで返したいときにフィットする
  • どのくらいの規模のサービスかというと関連APIのリクエストを数えたとき、一番高いところで、毎秒3000〜4000呼び出しあった
    • 全部合わせると毎秒数万のリクエストをさばいている
  • ユーザ数が多いときはLINEのショップの利用数が多い時に、数十万毎秒さばいた実績もある

処理しているリクエスト数

  • とあるLINEショップのページについてみた際に、メインの部分とオススメ着せ替えの一覧の2種類のデータに切り分けられる
  • 関連しているバックエンドリクエストを見た際に、2段階で別れてはいるが、独立した呼び出しなので実は別に分ける必要はない
    • 分析のために、zipkinを使ってあえて分けて見せるようにしている
    • これもArmeriaで取得して分析しています

HTTP/2

  • ユーザのリクエストも多く、バックエンドも多いときに、RPCに費やすリソースがどんどん膨らんでしまう懸念点がある
  • HTTP/2を使うことで、一つのコネクションで多くのレスポンスやリクエストを多重化できるので、通信量を節約できた
  • armeriaのクライアントサーバを使ってLINE shopに適用したとき、tcpコネクション数をオープンしている数を計測したら、毎分数十万回オープンされていたTCPコネクションが、切り替えたらがくっと、毎分2000回オープンするように変わった
  • TCPをオープンしすぎてコネクションをドロップしていた問題があったが、それが0になった
  • HTTP/2を使いたいときは自然に使えます
  • 様々なメトリックスをサービスで行うためには記録分析しないといけないが、そういった機能もarmeriaにあるので使えます

問題

  • 同期的なものを非同期的なものに書き換えるに当たり、勉強しないといけないことはいろいろあった
  • HTTP/2でコネクションの数はへらせるが、1つのコネクションが長い間生存してしまうので、LBがTCP単位でバランシングしていると、何らかの原因でコネクションが偏るとそれが長く残ってしまう事がある
    • クライアントサイドバランシングを導入して解決したりしました

Armeriaの使い方

コード例

  • サーバの例
    • サーバービルダーというutilityが定義されているので、そこからポートの指定などをしていけばサーバが立ち上がる
  • クライアントの例
    • newClientというUtilityを使っている
    • インターフェースしか渡していないが、必要な部分はrefrectionを使ってArmeriaが管理してくれる
    • コネクションの管理などもしてくれるので書かないといけない部分はかなり減らせる
    • URLの指定の仕方として独特になっており、thriftとプロトコルの書き方を同時にかかないといけない
  • HTTPの例
    • ServerBuilderとClientsを使うのは変わらないが、指定するプロトコルなど変えるだけで似たように変える
  • メトリックロギングの例
    • armeriaに既に用意されている機能を使ってメトリックスもとれます
  • LINEの実際の実装例として、必ずメトリックスをとるし、zipkinでも使えるように質得る

さらにこんなものもあります

  • ドキュメント自動生成
  • サーキットブレーカー
  • Client-sidde バランシング
  • gRPCのサポート

FAQ

  • HTTP/2とRPC, gRPCなどあるが、そのまま使うのはだめなのか?
    • gRPCはHTTP/2前提になっているところがある
    • もともとHTTP/1前提になっているクライアントにも使える、thriftを使っているといった理由があってarmeriaを使っている

@mogmetの所感

Almeriaを用いたサービスが今後作られて実績が増えていけば改善なども活発になりそうですね!

ただ、学習コストがどれくらいかかるかは少し気になるところはあります。

mogmet

View Comments

  • I may need your help. I've been doing research on gate io recently, and I've tried a lot of different things. Later, I read your article, and I think your way of writing has given me some innovative ideas, thank you very much.