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

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. #sapurimeetup gRPC in スタディサプリENGLISH gRPC in スタディサプリENGLISH @yutachaos スタディサプリ/Quipper Product

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

    → SES・受託プログラマー → 2018年7月からスタディサプリ ENGLISH SRE 趣味 本、楽器、酒 2
  3. #sapurimeetup gRPC in スタディサプリENGLISH Agenda | 01 02 03 04

    スタディサプリENGLISHについて gRPCについて 負荷分散 まとめ 3
  4. #sapurimeetup gRPC in スタディサプリENGLISH スタディサプリENGLISHについて 01 4

  5. スタディサプリ (対象学年が小中高校生) (ToC向け、ToB向け) スタディサプリ ENGLISH 国内向け学習サービス

  6. スタディサプリ (対象学年が小中高校生) (ToC向け、ToB向け) スタディサプリ ENGLISH 国内向け学習サービス

  7. #sapurimeetup gRPC in スタディサプリENGLISH スタディサプリENGLISHについて 01 7

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

    元々あったスタディサプリとは別アプリで、英単語サプリとしてローンチされ た。 ➔ オンライン英語学習アプリ ➔『Writing』『Listening』『Speaking』『Reading』をアプリ上で学習できる 8
  9. #sapurimeetup gRPC in スタディサプリENGLISH アプリの種類 9 ➔ 英会話 ➔ TOEIC対策

    ➔ 英単語 ➔ 4技能 ➔ TEPPAN英単語
  10. #sapurimeetup gRPC in スタディサプリENGLISH 利用技術(サーバーサイド) ➔ インフラ ◆ AWS ➔

    ECS、RDS、lambda、kinesis、SQSなど ➔ 言語・フレームワーク、ツール ◆ Scala、Play、gRPC ➔ サービス数 ◆ 20+ 1 0
  11. #sapurimeetup gRPC in スタディサプリENGLISH gRPCについて 02 11

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

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

  15. #sapurimeetup gRPC in スタディサプリENGLISH 当初構成 ➔ externalのrequestはALBで捌く ➔ internal(gRPC)を利用しているサービスはCLBのTCPモードでロードバラン サーで捌いている。

    15
  16. #sapurimeetup gRPC in スタディサプリENGLISH そして、導入 16

  17. #sapurimeetup gRPC in スタディサプリENGLISH 17 CPU使用率 しかし、負荷分散されない

  18. #sapurimeetup gRPC in スタディサプリENGLISH なぜ分散されなかったか? 18

  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
  20. #sapurimeetup gRPC in スタディサプリENGLISH gRPCの負荷分散 03 20

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

    balancing,Client Side load balancing,Lookaside Load Balancing(今回は説 明省略) の3つが存在。
  22. #sapurimeetup gRPC in スタディサプリENGLISH Proxy load balancing 22 ➔ Clientの手前にproxyサー

    バーをたてて、requestを proxyで受け、その先の ServerへのLoad Balancing を行う方法
  23. #sapurimeetup gRPC in スタディサプリENGLISH Client side load balancing 23 ➔

    Clientが直接Service Discovery等を利用、Server のIPを直接把握し、 Client側でServerに対する Load Balancingを行う方法
  24. #sapurimeetup gRPC in スタディサプリENGLISH Load Balancingの方法検討(Pros) ➔ Proxy Load Balancing

    ➔ Client側の手を入れないでload balancingが出来る。 Load Balancingの責務をproxy側に寄せることができる。 ➔ Client Side Load Balancing ➔ 余計な経路が発生しないのでProxy側で行うよりも高性能さが期待でき る。 24
  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
  26. #sapurimeetup gRPC in スタディサプリENGLISH Load Balancingの方法検討(結論) ➔ 現時点で特別に性能が必要という訳でなかった。 ➔ できるだけ既存のコードに手をいれたくなかった。

    ➔ Proxy Load Balancingとその時期ちょうどGAとなったECS Service Discoveryを採用 26
  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
  28. #sapurimeetup gRPC in スタディサプリENGLISH Load Balancingの方法検討 ➔ Istioの中でEnvoyを使うService Meshを検討 ➔

    将来的にはService Meshにしたいが、変更箇所を少ないままで現状で の障害を早く解決したい。影響範囲が大きすぎるService Meshは一旦 断念 28 案1 Service Mesh
  29. #sapurimeetup gRPC in スタディサプリENGLISH Load Balancingの方法検討 ➔ 各api側にside carとしてenvoyのContainerをdeployし、grpcへの requestをenvoy経由でrequestするようにする。

    ➔ 導入時点でSide Carを使ったapplicationの運用をしていなかったこと、 サービス全体への導入の影響範囲が大きいので導入を断念 29 案2 Side Car
  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
  31. #sapurimeetup gRPC in スタディサプリENGLISH 31 当初のAPI構成(再掲) ここをEnvoyに置き換えたい

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

    CLBのendpointに対してrequestするだけで適当なIPを返してくれる。しか し、CLBはHTTP/2に対応していないので使えない。 32 問題点
  33. #sapurimeetup gRPC in スタディサプリENGLISH Client Side Service Discovery 33 今回のようにELBを使わないとき、

    client側は対象のServiceのIPの一 覧を返してくれるendpointが別途 必要になる。 Ex consul.eurekaなど
  34. #sapurimeetup gRPC in スタディサプリENGLISH Amazon ECS Service Discovery 34 ➔

    ECSとの追加機能として、Route53 Auto Naming APIを利用し、対象の Serviceに登録されたTaskのIPを返してくれるdomainを作成し、DNS Service Discoveryとして利用してくれる機能。 Load Balancingの方法検討
  35. #sapurimeetup gRPC in スタディサプリENGLISH ちょっと余談 35

  36. #sapurimeetup gRPC in スタディサプリENGLISH 36

  37. #sapurimeetup gRPC in スタディサプリENGLISH 37

  38. #sapurimeetup gRPC in スタディサプリENGLISH 38

  39. #sapurimeetup gRPC in スタディサプリENGLISH 方法検討の議論 ➔ 新しい技術やソフトウェアを取り入れるときはチームの理解や合意が必要 ➔ 説明する前にScrapboxで資料を作ったり、メモを残すようにしている 39

  40. #sapurimeetup gRPC in スタディサプリENGLISH 解説に戻ります 40

  41. #sapurimeetup gRPC in スタディサプリENGLISH 41 当初のAPI構成(再掲)

  42. #sapurimeetup gRPC in スタディサプリENGLISH Envoy導入前構成(再掲) ➔ externalのrequestはALBで捌く ➔ internal(gRPC)を利用しているサービスはCLBのTCPモードでロードバラン サーで捌いている。

    42
  43. #sapurimeetup gRPC in スタディサプリENGLISH Envoyの導入(導入後) 43

  44. #sapurimeetup gRPC in スタディサプリENGLISH Envoy導入後の構成 ➔ externalのrequestはALBで捌く(ここは同じ) ➔ internal(gRPC)を利用しているサービスはECS Serviceとして立ち上げた

    Envoy経由でInternal APIのService Discoveryに対し、requestを行うよう に変更 44
  45. #sapurimeetup gRPC in スタディサプリENGLISH 導入結果 45

  46. #sapurimeetup gRPC in スタディサプリENGLISH Envoy導入後 46 CPU使用率

  47. #sapurimeetup gRPC in スタディサプリENGLISH Envoy導入前 47 CPU使用率

  48. #sapurimeetup gRPC in スタディサプリENGLISH まとめ 05 48

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

    考えて、影響範囲と切り戻しの範囲を十分に考える。 ➔ 新しいものを入れるときは、出来るだけ自分が今何をしているか共有しやす い方法で進めていくと、あとで理解を得やすくて便利。Scrapbox便利。 ➔ 知らない新しいものを触るのは楽しい。 Envoyは良いぞ。 49
  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 参考資料
  51. #sapurimeetup gRPC in スタディサプリENGLISH ありがとうございました! 51