「グリーグループモバイルアプリ勉強会 Vol.1」でのLT資料です。 https://gree.connpass.com/event/142728/
Copyright © LIMIA, Inc. All Rights Reserved.gRPCを使ったメディアサービス2
View Slide
Copyright © LIMIA, Inc. All Rights Reserved.● グリーグループのリミア株式会社で、LIMIA という住まい領域のメディアを作っています。ゲーム会社ですが、最近はメディアに力を入れています。● 機械学習のエンジニアですが、iOS, Android,JSなどもやっている何でも屋です。5歳の娘のパパ。twitter: @mahiguch1● 部活動でグリー技術書典部というのを立ち上げました。● https://limia.jp/● https://arine.jp/● https://aumo.jp/● https://www.mine-3m.com/mine/Masahiro Higuchi/樋口雅拓 技術書典[email protected]い05C2
Copyright © LIMIA, Inc. All Rights Reserved.背景と目的
Copyright © LIMIA, Inc. All Rights Reserved.LIMIAとは?4● メディアサービス● Android, iOS, Web● 記事一覧を表示し、タップすると記事詳細を閲覧できる。● 記事一覧はパーソナライズ。● 記事詳細読了後に関連記事を出している。● AWS:90%、GCP:10%。● PHP/EC2 → Go/ECS移行中● コンテナ間はgRPC+NLB● 偏りが激しいのでEnvoy使いたい
Copyright © LIMIA, Inc. All Rights Reserved.興味があること5LIMIAに最も適したシステムは、何だろう?● インフラ: Kubernetes/ECS/Lambda/EC2/CF/Firebase● Backend FW: gin/Laravel/Django/Rails/gRPC/使わない選択肢が多すぎて、よくわからない! → とりあえず色々試してみよう。試した結果、gRPCが良さそう。 https://speakerdeck.com/mahiguch/grpcwoshi-tutamedeiasabisuもう一度、これを試してみます。
Copyright © LIMIA, Inc. All Rights Reserved.【前回試したこと:とりあえず動くか】起動直後(MainFragment::onActivityCreated)、gRPC Serverにリクエストして、callbackでViewに追加。【今回試したこと:実際使おうとしたときの問題点】リストの末尾まで到達(PagedList::BoundaryCallback)したら、gRPCServerにリクエスト、LiveDataでViewを更新。今回試すこと6
Copyright © LIMIA, Inc. All Rights Reserved.今回試すことの図左図のRetrofitをgRPCに置き換えたのが右図7
Copyright © LIMIA, Inc. All Rights Reserved.要素技術の説明
Copyright © LIMIA, Inc. All Rights Reserved.gRPCとは?9● RPCを実現する通信方式の一つ● Googleが作っている● Protocol buffersという形式でデータをシリアライズして送受信している。
Copyright © LIMIA, Inc. All Rights Reserved.Protocol Bufferとは?10● Request/Responseのフォーマットを指定すると、それでシリアライズしてくれる。● 通信部分のコードを自動生成してくれるので、そこに時間を割かれるのを防げる。● ただし、エラー定義は書けないので、そこはコメントで書いておくなど、チーム内でルールを決めておく必要がある。
Copyright © LIMIA, Inc. All Rights Reserved.AAC(Android Architecture Components)とは、便利なライブラリ集。使うと便利なのは分かっているが、既存アプリへの導入は工数がかかるため、みんな少しづつ入れている。今回利用するAACは、次の4つ。● LiveData: 基盤となるデータベースが変更されたときにビューに通知する● Paging: データソースからオンデマンドで情報を徐々に読み込む● Room: SQLite データベースにスムーズにアクセスする● ViewModel: ライフサイクルを意識した方法で UI 関連のデータを管理するAACの説明11
Copyright © LIMIA, Inc. All Rights Reserved.本題
Copyright © LIMIA, Inc. All Rights Reserved.● 一覧を取ってきて表示するアプリにおいて、RetrofitをgRPCに置き換えてみた。● ベースは、AACのサンプルアプリ。見た目は同じ。https://github.com/googlesamples/android-architecture-components/tree/88747993139224a4bb6dbe985adf652d557de621/PagingWithNetworkSample今回作った検証アプリについて13
Copyright © LIMIA, Inc. All Rights Reserved..proto files14RPC IFをserviceに、データのフォーマットを messageに記載する。エラーコードなど異常系は、ここでは管理できない。
Copyright © LIMIA, Inc. All Rights Reserved.自動生成されたmethodを呼び出しているだけ。API call15
Copyright © LIMIA, Inc. All Rights Reserved.AAC Pagingを使うと、リスト開始や末尾でcallbackが呼ばれる。そこで、APIcall methodを呼び出す。レスポンスの処理はRepositoryから渡されたcallbackで行う。BoundaryCallback16
Copyright © LIMIA, Inc. All Rights Reserved.Server側は、Clientから呼び出したmethodをoverrideする形で実装する。Client/Server共にかなりシンプルに実装できる。Server17
Copyright © LIMIA, Inc. All Rights Reserved.● Retrofitに依存している部分が多く、思ったより大変だった。● 今回はRetrofitからgRPCに切り替えたが、本番導入するなら共存する必要がある。つまり、結構工数がかかりそう。● gRPC対応するとIFの型が保証されるが、大きな工数をかけてでも解決したい問題かというと。。。● RetrofitがgRPC対応してくれれば、全て解決だが。グリーグループの有志が集まって、技術書を書きました。技術書典7で頒布しますので、ぜひ遊びに来てください。https://techbookfest.org/event/tbf07/circle/5765683543539712まとめ18
Copyright © LIMIA, Inc. All Rights Reserved.