gRPC at OA Dev team

gRPC at OA Dev team

奥山 裕也 (LINE / 開発4センター / Official Account開発室)
いま、OA Dev チームではOAに関する新規サービスを開発しており、サーバー API を Kotlin と gRPC で実装しています。 また、gRPC フレームワークとしては、社内製マイクロサービスフレームワーク Armeria を採用しています。"gRPC 便利そう"、"趣味で触ったことあるけど..." という方は多いと思いますが、サービス開発では使ったことがない方が多いかもしれません。サービス開発で使うには、ロギングやトレーシング、ロードバランシング、エラーハンドリング、ドキュメンテーションといったことが必須になってきます。このセッションでは、OA Dev チームにおける Armeria による gRPC サーバー開発についてご紹介します。

53850955f15249a1a9dc49df6113e400?s=128

LINE Developers

July 29, 2020
Tweet

Transcript

  1. Yuya Okuyama gRPC at OA Dev LINE Developer Meetup @

    2020/7/29
  2. About me • Yuya Okuyama • 2019೥4݄ೖࣾ • Official Account

    ։ൃࣨ • LINEެࣜΞΧ΢ϯτؔ࿈ͷ৽نαʔϏε ( ) • line-bot-sdk-python ϝϯς 2
  3. Outline • What’s gRPC? • gRPC at OA Dev •

    Our system overview • gRPC server built with Armeria • Error handling • Documentation • Summary 3
  4. What’s gRPC?

  5. What’s gRPC • Google ͕։ൃͨ͠ RPC ϑϨʔϜϫʔΫ. ݱࡏ͸, ͷϓϩδΣΫτ. •

    Protocol Buffers (ΠϯλʔϑΣΠεఆٛݴޠ) • εΩʔϚϑΝʔετͳ։ൃ • ಛఆͷݴޠʹґଘ͠ͳ͍ϝοηʔδ΍αʔϏεͷఆٛ • JSON ͱͷ૬ޓม׵ • લํ/ޙํޓ׵ੑΛอͭมߋ • ίϯύΫτ͔ͭޮ཰తͳΤϯίʔσΟϯά • HTTP/2 ͰσʔλΛૹड৴͢Δ • ૒ํ޲௨৴ 5
  6. gRPC at LINE 6 • Our service • LINE Official

    Account • LINE LIVE Commerce • LINE MUSIC • LINE Financial • etc. • Java, Kotlin, Scala • Go • Python • JavaScript (gRPC-Web) Services Languages Thrift http://thrift.apache.org/ Facebook ੡ͷ RPC ϑϨʔϜϫʔΫ. ࣾ಺ͷଟ͘ͷՕॴͰར༻͞Ε͍ͯΔ.
  7. What should we do to deploy gRPC app? • Logging

    • Metrics • Distributed tracing • Circuit breaker • Retry • Load balancing • Debug tool • Error handling • Documentation 7
  8. gRPC at OA Dev

  9. Our system overview 9 #SPXTFS 1BSUOFS4ZTUFN 0UIFS5FBN 4FSWJDF 4FSWJDF 4FSWJDF

    --# REST gRPC gRPC 3&45H31$ 1SPYZ gRPC REST Our service 1SPYZ gRPC
  10. Our system overview 10 #SPXTFS 1BSUOFS4ZTUFN 0UIFS5FBN 4FSWJDF 4FSWJDF 4FSWJDF

    --# REST gRPC gRPC 3&45H31$ 1SPYZ gRPC REST Our service 1SPYZ gRPC 1SPYZͰMPBECBMBODJOH
  11. Our system overview 11 #SPXTFS 1BSUOFS4ZTUFN 0UIFS5FBN 4FSWJDF 4FSWJDF 4FSWJDF

    --# REST gRPC gRPC 3&45H31$ 1SPYZ gRPC REST &OWPZ΍HSQDHBUFXBZ (P ͸࢖Θͣ 4QSJOHͰखॻ͖ ࣾ֎αʔόʔ͔Βݺ͹ΕΔͷͰ ॊೈͰӡ༻ίετͷͳ͍ํ๏ʹ Our service 1SPYZ gRPC 1SPYZͰMPBECBMBODJOH
  12. gRPC server built with 12 • gRPC ϑϨʔϜϫʔΫͱͯ͠, LINE ੡ϚΠΫϩαʔϏεϑϨʔϜϫʔΫ

    Armeria Λ࠾༻. • Reasons: • LogNet/grpc-spring-boot-starter, yidongnan/grpc-spring-boot-starter ΑΓ׆ൃ • ࣾ಺੡ͳͷͰ feature request ͠΍͍͢ • ࣾ֎ͷํͰ΋ line-armeria.slack.com Ͱؾܰʹ • grpc/grpc-java ͷ interface Λ࢖͍ͬͯΔͷͰ, gRPC ΤίγεςϜ͔Βҳ୤͠ͳ͍ • ศརͰଟ࠼ͳػೳ: • ϚΠΫϩαʔϏεͰఆ൪ͳػೳ͕؆୯ʹ࢖͑Δ • Client-side load balancing and service discovery • Circuit breaker • Retry • Distributed tracing (Zipkin) • DocService (Swagger UI తͳը໘)
  13. Armeria: Very easy to use many features 13 gRPC server

    H31$TFSWJDFͷ࣮૷Λ౉͢ $POUFOUUZQFʹԠͯ͡  +40/ͰγϦΞϥΠζ͢Δઃఆ΋ %JTUSJCVUFEUSBDJOH ;JQLJO
  14. Armeria: Very easy to use many features 14 gRPC client

    $MJFOUTJEFMPBECBMBODJOH %/4CBTFETFSWJDFEJTDPWFSZ
  15. Armeria: DocService • ProtoBuf Ͱఆٛͨ͠ service, message ͷҰཡ΍ gRPC ͷݺͼग़͕͠Ͱ͖Δ

    15
  16. Armeria: DocService 16

  17. What should we do to deploy gRPC app? (reappeared) •

    Logging • Metrics • Distributed tracing • Circuit breaker • Retry • Load balancing • Debug tool • Error handling • Documentation 17 }
  18. Error handling • REST ͱҧͬͯ, ΤϥʔϖΠϩʔυΛ HTTP Body Ͱฦͤͳ͍ •

    ํ๏ • grpc-status, grpc-message ͷΈΛฦ͢ • શͯͷϨεϙϯεఆٛʹΤϥʔ༻ͷϑΟʔϧυΛ௥Ճ͢Δ • google/rpc/error_details.proto Λ Metadata (http header) ʹؚΊͯฦ͢ • ࣗ෼Ͱఆٛͨ͠ϝοηʔδΛ Metadata (http header) ʹؚΊͯฦ͢ 18
  19. Error handling • REST ͱҧͬͯ, ΤϥʔϖΠϩʔυΛ HTTP Body Ͱฦͤͳ͍ •

    ํ๏ • grpc-status, grpc-message ͷΈΛฦ͢ • શͯͷϨεϙϯεఆٛʹΤϥʔ༻ͷϑΟʔϧυΛ௥Ճ͢Δ • google/rpc/error_details.proto Λ Metadata (http header) ʹؚΊͯฦ͢ • ࣗ෼Ͱఆٛͨ͠ϝοηʔδΛ Metadata (http header) ʹؚΊͯฦ͢ 19
  20. Error handling: Returning custom error message 20 proto Server Client

  21. Error handling: Returning custom error message 21 proto Server Client

    ϖΠϩʔυΛ ProtoBuf ͰόΠφϦΤϯίʔυͯ͠, Metadata (http header) ܦ༝ͰૹΔ
  22. Error handling: Returning custom error message 22 proto Server Client

    ϖΠϩʔυΛ ProtoBuf ͰόΠφϦΤϯίʔυͯ͠, Metadata (http header) ܦ༝ͰૹΔ ड͚औΓख͕ࣗ෼ͰσγϦΞϥΠζ͢Δ
  23. Documentation • protoc-gen-docs ͱ͍͏υΩϡϝϯτੜ੒ثΛ࢖ͬͯ, proto ϑΝΠϧͷίϝϯτ΍
 Φϓγϣϯ͔ΒଞνʔϜʹڞ༗͢ΔυΩϡϝϯτΛੜ੒. 23

  24. What should we do to deploy gRPC app? (reappeared) •

    Logging • Metrics • Distributed tracing • Circuit breaker • Retry • Load balancing • Debug tool • Error handling • Documentation 24 } Metadata ʹΤϥʔϖΠϩʔυΛؚΊΔ protoc-gen-docs
  25. How was gRPC? • εΩʔϚϑΝʔετ • ࣮૷Ͱ͸ͳ͘εΩʔϚ(࢓༷)͕͋ΔͷͰ, ίʔυϨϏϡʔ͕͠΍͍͢ • proto

    ϑΝΠϧͰؔ਺໊΍ϑΟʔϧυ໊ͷมߋΛιʔείʔυ΁มߋ͢Δͷ͕πϥ͍ • HTTP/2 • ࣾ಺LB, Nginx Ͱ͸ଟগ໘౗͕ͩͬͨ, େͨ͠໰୊͸ͳ͔ͬͨ • ΤίγεςϜ • CLI ͔ΒϦΫΤετ͢ΔͨΊͷ gRPCurl,υΩϡϝϯτΛੜ੒͢Δ protoc-gen-docs
 ͳͲ, ศརͳπʔϧ͸ͦͦ͋͜͜Δ • GUI Client ΋͍͔ͭ͋͘Δ͕, Ϧονͳػೳ͸ͳ͍ 25
  26. Summary

  27. Takeaways • LINE ࣾͰ΋গͣͭ͠ gRPC ͕ϓϩμΫγϣϯͰ࢖ΘΕ͍ͩͯ͠Δ • (For Java,) Armeria

    Λ࢖͑͹, production ready ͳ gRPC αʔόʔΛ؆୯ʹߏஙͰ͖Δ • gRPC Ͱͷ error handling ͸ REST ΑΓͪΐͬͱ໘౗ • εΩʔϚϑΝʔετͩͱ, ϨϏϡʔ΋υΩϡϝϯτੜ੒΋͠΍͍͢ 27
  28. Thank you! Any questions?