gRPC in スタディサプリENGLISH / gRPC in StudySapuri ENGLISH

gRPC in スタディサプリENGLISH / gRPC in StudySapuri ENGLISH

スタディサプリ/Quipper Product Meetup #3 発表スライド
https://techplay.jp/event/737389

9a71d9081335ef7d5ecfa86155c949af?s=128

yutachaos

July 18, 2019
Tweet

Transcript

  1. 2.

    #sapurimeetup gRPC in スタディサプリENGLISH 木村 勇太 @yutachaos 経歴 パソコン(Word,Excel)の先生→ 独学でプログラムの先生

    → SES・受託プログラマー → 2018年7月からスタディサプリ ENGLISH SRE 趣味 本、楽器、酒 2
  2. 3.

    #sapurimeetup gRPC in スタディサプリENGLISH Agenda | 01 02 03 04

    スタディサプリENGLISHについて gRPCについて 負荷分散 まとめ 3
  3. 8.

    #sapurimeetup gRPC in スタディサプリENGLISH サービス内容 ➔ 2015年 10月 サービススタート ➔

    元々あったスタディサプリとは別アプリで、英単語サプリとしてローンチされ た。 ➔ オンライン英語学習アプリ ➔『Writing』『Listening』『Speaking』『Reading』をアプリ上で学習できる 8
  4. 10.

    #sapurimeetup gRPC in スタディサプリENGLISH 利用技術(サーバーサイド) ➔ インフラ ◆ AWS ➔

    ECS、RDS、lambda、kinesis、SQSなど ➔ 言語・フレームワーク、ツール ◆ Scala、Play、gRPC ➔ サービス数 ◆ 20+ 1 0
  5. 12.

    #sapurimeetup gRPC in スタディサプリENGLISH gRPCとはGoogleが元々内部用として利用していたStubbyというRPCフレームワーク を元に開発をされたRPC(Remote Procedure Call) fremework。Protocol Buffersを

    利用したIDL(protoファイル)でのインターフェイスを定義。 protoファイルからクライアントとサーバーのコード生成をすることが出来、 様々な言語の実装があり、多言語で利用できる。 プロトコルにはHTTP/2が利用される。 gRPC https://grpc.io/ 12
  6. 13.

    #sapurimeetup gRPC in スタディサプリENGLISH gRPCの導入経緯 ➔ 元々のスタディサプリENGLISHはモノリシックアプリケーションだった ➔ ビジネス的にスケールし始め、要件が複雑化しはじめた。 ➔

    2017年新規サービスを開発時、Microservices化に舵を切った際に共通の interfaceでの内部通信の共通が欲しくなった 13 ➔ スタディサプリENGLISH 大規模改修の裏側 https://tech.recruit-mp.co.jp/infrastructure/post-13129/
  7. 19.

    #sapurimeetup gRPC in スタディサプリENGLISH HTTP/2のLoad Balancing対応問題 ➔ AWSは外部通信に対しては HTTP/2は対応しているが、内部通信に対して HTTP/2

    の対応をしていない (2019年7月時点) ➔ 導入当初HTTP/2の非対応は認識していて、 CLBのTCPモードでのbalancingを行っ ていたが、負荷が増えるにつれて障害が発生するレベルの偏りになっていった。 ➔ 現時点でAWSでHTTP/2を利用するgRPCをする場合はclient側、もしくはProxy側で 行う必要がある。 19
  8. 21.

    #sapurimeetup gRPC in スタディサプリENGLISH gRPCのLoad Balancing 21 gRPCのLoad Balancingの方法は公式に書かれている方法だとProxy load

    balancing,Client Side load balancing,Lookaside Load Balancing(今回は説 明省略) の3つが存在。
  9. 22.

    #sapurimeetup gRPC in スタディサプリENGLISH Proxy load balancing 22 ➔ Clientの手前にproxyサー

    バーをたてて、requestを proxyで受け、その先の ServerへのLoad Balancing を行う方法
  10. 23.

    #sapurimeetup gRPC in スタディサプリENGLISH Client side load balancing 23 ➔

    Clientが直接Service Discovery等を利用、Server のIPを直接把握し、 Client側でServerに対する Load Balancingを行う方法
  11. 24.

    #sapurimeetup gRPC in スタディサプリENGLISH Load Balancingの方法検討(Pros) ➔ Proxy Load Balancing

    ➔ Client側の手を入れないでload balancingが出来る。 Load Balancingの責務をproxy側に寄せることができる。 ➔ Client Side Load Balancing ➔ 余計な経路が発生しないのでProxy側で行うよりも高性能さが期待でき る。 24
  12. 25.

    #sapurimeetup gRPC in スタディサプリENGLISH Load Balancingの方法検討(Cons) ➔ Proxy Load Balancing

    ➔ Load Balancerの性能がScalabilityの限界になる。またProxyを挟むこ とがLatencyの発生要因になる。 ➔ Client Side Load Balancing ➔ client側が直接相手のServerを参照するため、Load Balancingの実装 が各言語に寄ってしまう。Client側の複雑性が増してしまう。 25
  13. 27.

    #sapurimeetup gRPC in スタディサプリENGLISH Proxyの導入検討 ➔ Nginx ➔ 利用実績もあり、gRPC Supportもしているが、対応された時期が

    1.13.10(2018年3月)でdocや大規 模な事例も無く断念 ➔ HAProxy ➔ 検討時点でまだgRPCのsupportをしていなかった。 ➔ Envoy ➔ docでsampleの方法でも課題を解決出来ることが確認でき、負荷試験をしても性能が出ることを確認。 gRPCのオプションが多彩にあったので、他社での採用事例があったので採用 27 Nginx VS HAProxy VS Envoy
  14. 28.

    #sapurimeetup gRPC in スタディサプリENGLISH Load Balancingの方法検討 ➔ Istioの中でEnvoyを使うService Meshを検討 ➔

    将来的にはService Meshにしたいが、変更箇所を少ないままで現状で の障害を早く解決したい。影響範囲が大きすぎるService Meshは一旦 断念 28 案1 Service Mesh
  15. 29.

    #sapurimeetup gRPC in スタディサプリENGLISH Load Balancingの方法検討 ➔ 各api側にside carとしてenvoyのContainerをdeployし、grpcへの requestをenvoy経由でrequestするようにする。

    ➔ 導入時点でSide Carを使ったapplicationの運用をしていなかったこと、 サービス全体への導入の影響範囲が大きいので導入を断念 29 案2 Side Car
  16. 30.

    #sapurimeetup gRPC in スタディサプリENGLISH Load Balancingの方法検討 ➔ 各api側 internal apiの前にenvoyが動作するserviceをdeploy、external

    apiからgRPCにrequestする際にdeployされたenvoy経由でrequestするよ うにする ➔ envoy用の新しいserviceが必要にはなるが、各gRPCService毎に導入 することが出来、影響範囲が少なく出来るためこの方式にした。 30 案3 Front proxy
  17. 32.

    #sapurimeetup gRPC in スタディサプリENGLISH Load Balancingの方法検討 ➔ 導入前の構成はinternal APIの前に、CLBが存在しており、External APIは

    CLBのendpointに対してrequestするだけで適当なIPを返してくれる。しか し、CLBはHTTP/2に対応していないので使えない。 32 問題点
  18. 33.

    #sapurimeetup gRPC in スタディサプリENGLISH Client Side Service Discovery 33 今回のようにELBを使わないとき、

    client側は対象のServiceのIPの一 覧を返してくれるendpointが別途 必要になる。 Ex consul.eurekaなど
  19. 34.

    #sapurimeetup gRPC in スタディサプリENGLISH Amazon ECS Service Discovery 34 ➔

    ECSとの追加機能として、Route53 Auto Naming APIを利用し、対象の Serviceに登録されたTaskのIPを返してくれるdomainを作成し、DNS Service Discoveryとして利用してくれる機能。 Load Balancingの方法検討
  20. 49.

    #sapurimeetup gRPC in スタディサプリENGLISH 悪かったこと、良かったこと ➔ gRPCの負荷分散が最初できていなかったのに気づかなかったような、技術 的負債が生まれてしまっていることはよくある。 ➔ 日々動いているサービスに新しいものを入れるときには影響範囲の範囲を

    考えて、影響範囲と切り戻しの範囲を十分に考える。 ➔ 新しいものを入れるときは、出来るだけ自分が今何をしているか共有しやす い方法で進めていくと、あとで理解を得やすくて便利。Scrapbox便利。 ➔ 知らない新しいものを触るのは楽しい。 Envoyは良いぞ。 49
  21. 50.

    #sapurimeetup gRPC in スタディサプリENGLISH ➔ スタディサプリENGLISH 大規模改修の裏側 https://tech.recruit-mp.co.jp/infrastructure/post-13129/ ➔ EnvoyとAmazon

    ECS Service Discoveryを利用したgRPCの負荷分散 https://tech.recruit-mp.co.jp/infrastructure/post-13129/ ➔ gRPC Load Balancing https://grpc.io/blog/loadbalancing/ ➔ Envoy Learn https://www.envoyproxy.io/learn/ ➔ Service mesh data plane vs. control plane https://blog.envoyproxy.io/service-mesh-data-plane-vs-control-plane-2774e720f7fc ➔ Microservices on AWS – Service Discovery https://docs.aws.amazon.com/whitepapers/latest/microservices-on-aws/service-discovery.html 50 参考資料