SlideShare a Scribd company logo
© RakSul,Inc. All Rights Reserved.
RakSulのInternal API開発で
gRPCを導入した話
Omotesando.rb #45
Nobuhiro Nikushi
2019/04/03
© RakSul,Inc. All Rights Reserved.
About me
Nobuhiro Nikushi
二串 信弘  
● Works at RAKSUL INC. from 2017/3
● Engineering Manager at Printing EC Team.
● Favorite Languages: Ruby, Golang,
TypeScript, etc
● Private: English, Violin, 子育て
Engineering Manager and Tech Lead at RAKSUL
github: @nikushi
twitter: @nikushi_jp
ファブレス型印刷/広告EC
“ラクスル”
物流のUber
“ハコベル”
Our services
印刷や物流といった伝統的な産業で事業を展開
● ラクスルのシステムのRebuild
○ 一枚岩なレガシーシステムを ラクスルではどのように Rebuildしているの
か?https://www.slideshare.net/nixiesan/rebuild-124366117
○ そうだ、ラクスルを作り直そう! | RakSul Tech Blog
https://tech.raksul.com/2017/12/18/raksul-platform-project/
● 商品カタログ機能のInternal API化 # 今日の話
What do I do?
商品カタログAPI(MD API)の立ち上げにあたってgRPCを採用
その経緯を紹介します
Today’s topic
© RakSul,Inc. All Rights Reserved.
印刷EC = raksul.com における商品カタログサービス。もともとモノリスアプリケーション
内に存在していた機能を別サービス化。
ユースケース
● ECサイトは商品仕様をAPI経由で参照できる
● カテゴリマネージャー向け(商品登録・更新、販売価格の更新など)
What is MD API?
© RakSul,Inc. All Rights Reserved.
商品仕様の例: チラシ・フライヤー
© RakSul,Inc. All Rights Reserved.
商品仕様の例: 名刺
© RakSul,Inc. All Rights Reserved.
商品仕様の例: 冊子
© RakSul,Inc. All Rights Reserved.
Components
Monolithic App
Monolithic App
MD API
GET https://raksul.com/flyer GET https://raksul.com/flyer
gRPC over h2c
server implemented
by grpc gem, with
Rails’ ecosystem.
Still monolithic Rails
app, but this layer
acts like BFF.
gRPC client stub,
implemented by
grpc gem
© RakSul,Inc. All Rights Reserved.
商品カタログの特性
● raksul.com の商品カテゴリ数はN個(チラシ、名刺、冊子、etc..)
● 商品カテゴリ毎にデータスキーマは異なる
本プロジェクトでAPI仕様記述言語に求めること
● API仕様記述ファイルを商品カテゴリ毎に分けたい
● API仕様記述のエディタでの書きやすさを重視
We choose gRPC, Why?
© RakSul,Inc. All Rights Reserved.
Protocol Buffers
● import によるファーストクラスのファ
イル分割サポート
● エディタのサポートが強力
○ 無論エディタによるが
○ JetBrains系エディタのproto plugin
はとても良い
■ message間、ファイル間の
コードジャンプ
■ syntax error feedback
We choose gRPC, Why?
© RakSul,Inc. All Rights Reserved.
RakSulではAPI開発にSwaggerを使ってきたが本案件では採用しなかった
● $ref を使うとファイル分割できるが
○ $ref: '../components/pet.yml' こういうの
● ローカルエディタでのコードジャンプは効くが、Swagger Editorは未対応
○ (余談) 社内アンケートではSwagger Editor 派と ローカルエディタ派にそもそも分かれた
○ (余談) 私個人としては面倒だが Swagger Editor 使っていた
● Swagger UIや committee がresolveしてくれない
○ `$ref` を resolve し1ファイルに統合するスクリプトを作る ?
■ `$ref` の解決は Ruby ではなく別途 node を使うことになる
○ ファイル修正するたびにコマンド実行 ? or Guard で watchする?
Swagger, why not?
© RakSul,Inc. All Rights Reserved.
swagger-blocks という gem がある
swagger記法をRuby の DSL で書ける
今回の要件も叶えれるが、本当に俺たちはRubyでSwaggerを書きたいか?
最終更新日が1 year ago
等々考えて見送った。
© RakSul,Inc. All Rights Reserved.
● JSON Schema より圧倒的に書きやすい(とおもった)
○ 記述量少ない && エディタサポートがいい感じなのでサクサク書ける
● REST制約(GET/POST/PUT/DELETE)に縛られないAPI設計ができること
○ 技術負債解消の文脈では関数単位で切り出しがしやすい!
● メンバーのモチベーションは高い、技術的な裾のが広がった
○ Protocol Buffersが便利だと気づく
○ 他案件でも採用
● インフラ的チャレンジ(Sidecar Envoy, Service Discovery, Service Mesh,
Container, etc)
gRPCを採用後に感じた良かったこと
© RakSul,Inc. All Rights Reserved.
gRPCを使ったサービスを本番運用に乗せるには考えることがたくさんある
● Infrastructure(monitoring, load balancing, graceful deploy, etc)
● Understanding gRPC protocol(status code, metadata, etc)
● Interceptor
● mock in unit tests
● mono git repository for proto files
● Understanding gRPC Server(Ruby and gRPC C-Core impl)
● etc
ロングストーリー。これらの話はまたいつかの機会に話したい。
gRPC in Production
© RakSul,Inc. All Rights Reserved.
We are hiring!
© RakSul,Inc. All Rights Reserved.
Thank you!
© RakSul,Inc. All Rights Reserved.
Appendix
© RakSul,Inc. All Rights Reserved.
raksul-proto: mono repo for all systems’ proto files
raksul-proto $ tree raksul/
raksul
└── printmd
└── v1
├── businesscard.proto
├── b3flyer.proto
├── flyer.proto
├── price.proto
…etc..
© RakSul,Inc. All Rights Reserved.
フロントエンド向けのAPI戦略
● フロント向けのAPIは引き続き RESTFul APIを採用
● Swaggerを使う. gRPC-Web も考えたが見送り
○ PMやフロントエンドエンジニアの慣れ chorome developer tools
● しかしここでJSON Schemaを書いてしまっては裏側をgRPCにしたとしても意味が
無い
protoc-gen-swaggerを使ってフロントエンド向けAPIの仕様もProtocol Buffers で書いて
swagger.json 出力するようにした
ref: スキーマ定義言語 Protocol Buffers と protoc-gen-swagger を使って Web API のスキマを埋めよう
| VOYAGE GROUP techlog
https://techlog.voyagegroup.com/entry/protoc-gen-swagger
protoc-gen-swagger

More Related Content

What's hot

レガシーなアプリにWeb apiを実装してなみだ目になったのでちょっといろいろ教えてください
レガシーなアプリにWeb apiを実装してなみだ目になったのでちょっといろいろ教えてくださいレガシーなアプリにWeb apiを実装してなみだ目になったのでちょっといろいろ教えてください
レガシーなアプリにWeb apiを実装してなみだ目になったのでちょっといろいろ教えてください
Isamu Suzuki
 
【資料】【Web開発者向け】クラウドセミナー@渋谷 #2【Azure入門】
【資料】【Web開発者向け】クラウドセミナー@渋谷 #2【Azure入門】【資料】【Web開発者向け】クラウドセミナー@渋谷 #2【Azure入門】
【資料】【Web開発者向け】クラウドセミナー@渋谷 #2【Azure入門】
SAKURUG co.
 
Node.jsで使えるファイルDB"NeDB"のススメ
Node.jsで使えるファイルDB"NeDB"のススメNode.jsで使えるファイルDB"NeDB"のススメ
Node.jsで使えるファイルDB"NeDB"のススメ
Isamu Suzuki
 
Node.jsに縁のない職場でnode.jsを使い始める戦術
Node.jsに縁のない職場でnode.jsを使い始める戦術Node.jsに縁のない職場でnode.jsを使い始める戦術
Node.jsに縁のない職場でnode.jsを使い始める戦術
Isamu Suzuki
 
極貧Webサービス運用 kawasaki.rb #044
極貧Webサービス運用 kawasaki.rb #044極貧Webサービス運用 kawasaki.rb #044
極貧Webサービス運用 kawasaki.rb #044
Misao X
 
AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)Akio Katayama
 
私はこれでJSONをやめました〜あるいはAWSの設定をコード化するとはどういうことか〜
私はこれでJSONをやめました〜あるいはAWSの設定をコード化するとはどういうことか〜私はこれでJSONをやめました〜あるいはAWSの設定をコード化するとはどういうことか〜
私はこれでJSONをやめました〜あるいはAWSの設定をコード化するとはどういうことか〜
Terui Masashi
 
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
Daisuke Nagao
 
俺と LightSail 概要と使ってみた
俺と LightSail  概要と使ってみた俺と LightSail  概要と使ってみた
俺と LightSail 概要と使ってみた
Masayuki KaToH
 
クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)
クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)
クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)
Terui Masashi
 
グラフ解析で社長の脳内さらす!
グラフ解析で社長の脳内さらす!グラフ解析で社長の脳内さらす!
グラフ解析で社長の脳内さらす!
Kazuki Morozumi
 
モバイルゲームにおけるAWSの泥臭い使い方
モバイルゲームにおけるAWSの泥臭い使い方モバイルゲームにおけるAWSの泥臭い使い方
モバイルゲームにおけるAWSの泥臭い使い方Junpei Nakada
 
AWS Step FunctionとLambdaでディープラーニングの訓練を全自動化する
AWS Step FunctionとLambdaでディープラーニングの訓練を全自動化するAWS Step FunctionとLambdaでディープラーニングの訓練を全自動化する
AWS Step FunctionとLambdaでディープラーニングの訓練を全自動化する
mizugokoro
 
Fargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころFargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころ
Yuto Komai
 
JAWS-UG Osaka 2013.11.02 Feel the Elesticity v2.0
JAWS-UG Osaka 2013.11.02 Feel the Elesticity v2.0JAWS-UG Osaka 2013.11.02 Feel the Elesticity v2.0
JAWS-UG Osaka 2013.11.02 Feel the Elesticity v2.0
Toshiyuki Konparu
 
VRディープ座談会 introduction ojima
VRディープ座談会 introduction ojimaVRディープ座談会 introduction ojima
VRディープ座談会 introduction ojima
Hideki Ojima
 
Serverless Ninja Warriors [panel]
Serverless Ninja Warriors [panel]Serverless Ninja Warriors [panel]
Serverless Ninja Warriors [panel]
真吾 吉田
 
サーバーレスでシステムを開発する時に⼤切な事
サーバーレスでシステムを開発する時に⼤切な事サーバーレスでシステムを開発する時に⼤切な事
サーバーレスでシステムを開発する時に⼤切な事
Hiroyuki Hiki
 
Serverless Meetup Tokyo #2 オープニング
Serverless Meetup Tokyo #2 オープニングServerless Meetup Tokyo #2 オープニング
Serverless Meetup Tokyo #2 オープニング
真吾 吉田
 
Scalaプロダクトのビルド高速化
Scalaプロダクトのビルド高速化Scalaプロダクトのビルド高速化
Scalaプロダクトのビルド高速化
kuro kuro
 

What's hot (20)

レガシーなアプリにWeb apiを実装してなみだ目になったのでちょっといろいろ教えてください
レガシーなアプリにWeb apiを実装してなみだ目になったのでちょっといろいろ教えてくださいレガシーなアプリにWeb apiを実装してなみだ目になったのでちょっといろいろ教えてください
レガシーなアプリにWeb apiを実装してなみだ目になったのでちょっといろいろ教えてください
 
【資料】【Web開発者向け】クラウドセミナー@渋谷 #2【Azure入門】
【資料】【Web開発者向け】クラウドセミナー@渋谷 #2【Azure入門】【資料】【Web開発者向け】クラウドセミナー@渋谷 #2【Azure入門】
【資料】【Web開発者向け】クラウドセミナー@渋谷 #2【Azure入門】
 
Node.jsで使えるファイルDB"NeDB"のススメ
Node.jsで使えるファイルDB"NeDB"のススメNode.jsで使えるファイルDB"NeDB"のススメ
Node.jsで使えるファイルDB"NeDB"のススメ
 
Node.jsに縁のない職場でnode.jsを使い始める戦術
Node.jsに縁のない職場でnode.jsを使い始める戦術Node.jsに縁のない職場でnode.jsを使い始める戦術
Node.jsに縁のない職場でnode.jsを使い始める戦術
 
極貧Webサービス運用 kawasaki.rb #044
極貧Webサービス運用 kawasaki.rb #044極貧Webサービス運用 kawasaki.rb #044
極貧Webサービス運用 kawasaki.rb #044
 
AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)AWS re:Invent 2013 参加報告(新サービスとセッション)
AWS re:Invent 2013 参加報告(新サービスとセッション)
 
私はこれでJSONをやめました〜あるいはAWSの設定をコード化するとはどういうことか〜
私はこれでJSONをやめました〜あるいはAWSの設定をコード化するとはどういうことか〜私はこれでJSONをやめました〜あるいはAWSの設定をコード化するとはどういうことか〜
私はこれでJSONをやめました〜あるいはAWSの設定をコード化するとはどういうことか〜
 
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
APIを叩くだけでない、Deep Learning on AWS で自分だけの学習モデルを作ろう! by JAWS-UG AI支部
 
俺と LightSail 概要と使ってみた
俺と LightSail  概要と使ってみた俺と LightSail  概要と使ってみた
俺と LightSail 概要と使ってみた
 
クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)
クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)
クラウド環境におけるWebアプリケーションの正しい作り方(for Perl users)
 
グラフ解析で社長の脳内さらす!
グラフ解析で社長の脳内さらす!グラフ解析で社長の脳内さらす!
グラフ解析で社長の脳内さらす!
 
モバイルゲームにおけるAWSの泥臭い使い方
モバイルゲームにおけるAWSの泥臭い使い方モバイルゲームにおけるAWSの泥臭い使い方
モバイルゲームにおけるAWSの泥臭い使い方
 
AWS Step FunctionとLambdaでディープラーニングの訓練を全自動化する
AWS Step FunctionとLambdaでディープラーニングの訓練を全自動化するAWS Step FunctionとLambdaでディープラーニングの訓練を全自動化する
AWS Step FunctionとLambdaでディープラーニングの訓練を全自動化する
 
Fargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころFargate起動歴1日の男が語る運用の勘どころ
Fargate起動歴1日の男が語る運用の勘どころ
 
JAWS-UG Osaka 2013.11.02 Feel the Elesticity v2.0
JAWS-UG Osaka 2013.11.02 Feel the Elesticity v2.0JAWS-UG Osaka 2013.11.02 Feel the Elesticity v2.0
JAWS-UG Osaka 2013.11.02 Feel the Elesticity v2.0
 
VRディープ座談会 introduction ojima
VRディープ座談会 introduction ojimaVRディープ座談会 introduction ojima
VRディープ座談会 introduction ojima
 
Serverless Ninja Warriors [panel]
Serverless Ninja Warriors [panel]Serverless Ninja Warriors [panel]
Serverless Ninja Warriors [panel]
 
サーバーレスでシステムを開発する時に⼤切な事
サーバーレスでシステムを開発する時に⼤切な事サーバーレスでシステムを開発する時に⼤切な事
サーバーレスでシステムを開発する時に⼤切な事
 
Serverless Meetup Tokyo #2 オープニング
Serverless Meetup Tokyo #2 オープニングServerless Meetup Tokyo #2 オープニング
Serverless Meetup Tokyo #2 オープニング
 
Scalaプロダクトのビルド高速化
Scalaプロダクトのビルド高速化Scalaプロダクトのビルド高速化
Scalaプロダクトのビルド高速化
 

Similar to RakSulのInternal API開発で gRPCを導入した話

Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurbSidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
Koichiro Sumi
 
GAE + Spannerで目指せ No (Uncomfortable) Ops
GAE + Spannerで目指せ No (Uncomfortable) OpsGAE + Spannerで目指せ No (Uncomfortable) Ops
GAE + Spannerで目指せ No (Uncomfortable) Ops
Miniascape
 
レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話nekogeruge_987
 
Rubyプログラミング教育に対する取り組みと事例紹介
Rubyプログラミング教育に対する取り組みと事例紹介Rubyプログラミング教育に対する取り組みと事例紹介
Rubyプログラミング教育に対する取り組みと事例紹介
Yasushi Ishikawa
 
Scala.jsはじめました!
Scala.jsはじめました!Scala.jsはじめました!
Scala.jsはじめました!
K Kinzal
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streaming
chibochibo
 
SpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorbSpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorb
Youtarou TAKAHASHI
 
fluxflex meetup in Tokyo
fluxflex meetup in Tokyofluxflex meetup in Tokyo
fluxflex meetup in TokyoKyosuke Inoue
 
Deploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in FargateDeploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in Fargate
bitbank, Inc. Tokyo, Japan
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
Yuzo Hebishima
 
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
健太 田上
 
JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)VOYAGE GROUP
 
CloudSQL v2は デキる子なのか?
CloudSQL v2は デキる子なのか?CloudSQL v2は デキる子なのか?
CloudSQL v2は デキる子なのか?
Kumano Ryo
 
SwaggerとAPIのデザイン
SwaggerとAPIのデザインSwaggerとAPIのデザイン
SwaggerとAPIのデザイン
Kazuhiro Hara
 
GraphQLについての5分間
GraphQLについての5分間GraphQLについての5分間
GraphQLについての5分間
Matsuo Obu
 
grpc-gateway を試してみた fukuoka.go#11
grpc-gateway を試してみた fukuoka.go#11grpc-gateway を試してみた fukuoka.go#11
grpc-gateway を試してみた fukuoka.go#11
Yutaka Tachibana
 
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
健人 井関
 
Fluxflex meetup 2011 in Tokyo
Fluxflex meetup 2011 in TokyoFluxflex meetup 2011 in Tokyo
Fluxflex meetup 2011 in TokyoKyosuke Inoue
 

Similar to RakSulのInternal API開発で gRPCを導入した話 (20)

Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurbSidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
Sidekiq Proを1年ほど使ってみて良かったところ、困ったところ | 新宿.rb 29th #shinjukurb
 
GAE + Spannerで目指せ No (Uncomfortable) Ops
GAE + Spannerで目指せ No (Uncomfortable) OpsGAE + Spannerで目指せ No (Uncomfortable) Ops
GAE + Spannerで目指せ No (Uncomfortable) Ops
 
レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話レガシーシステムのDBマイグレーションし始めた話
レガシーシステムのDBマイグレーションし始めた話
 
Rubyプログラミング教育に対する取り組みと事例紹介
Rubyプログラミング教育に対する取り組みと事例紹介Rubyプログラミング教育に対する取り組みと事例紹介
Rubyプログラミング教育に対する取り組みと事例紹介
 
Scala.jsはじめました!
Scala.jsはじめました!Scala.jsはじめました!
Scala.jsはじめました!
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streaming
 
SpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorbSpockからRSpecにきたときの気づき #coedorb
SpockからRSpecにきたときの気づき #coedorb
 
fluxflex meetup in Tokyo
fluxflex meetup in Tokyofluxflex meetup in Tokyo
fluxflex meetup in Tokyo
 
Deploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in FargateDeploy TypeScript with CodePipeline in Fargate
Deploy TypeScript with CodePipeline in Fargate
 
らくちん Go言語
らくちん Go言語らくちん Go言語
らくちん Go言語
 
Nodeにしましょう
NodeにしましょうNodeにしましょう
Nodeにしましょう
 
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
プログラミング初心者に ECMAScript(JavaScript) を最初の言語として勧めるべき? Meguro es6
 
Start-padrino
Start-padrinoStart-padrino
Start-padrino
 
JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)JavaScriptトレンド総括(2014)
JavaScriptトレンド総括(2014)
 
CloudSQL v2は デキる子なのか?
CloudSQL v2は デキる子なのか?CloudSQL v2は デキる子なのか?
CloudSQL v2は デキる子なのか?
 
SwaggerとAPIのデザイン
SwaggerとAPIのデザインSwaggerとAPIのデザイン
SwaggerとAPIのデザイン
 
GraphQLについての5分間
GraphQLについての5分間GraphQLについての5分間
GraphQLについての5分間
 
grpc-gateway を試してみた fukuoka.go#11
grpc-gateway を試してみた fukuoka.go#11grpc-gateway を試してみた fukuoka.go#11
grpc-gateway を試してみた fukuoka.go#11
 
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
 
Fluxflex meetup 2011 in Tokyo
Fluxflex meetup 2011 in TokyoFluxflex meetup 2011 in Tokyo
Fluxflex meetup 2011 in Tokyo
 

Recently uploaded

「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
嶋 是一 (Yoshikazu SHIMA)
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
osamut
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
Yuki Miyazaki
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
tazaki1
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
Osaka University
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
sugiuralab
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
azuma satoshi
 

Recently uploaded (9)

「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
「進化するアプリ イマ×ミライ ~生成AIアプリへ続く道と新時代のアプリとは~」Interop24Tokyo APPS JAPAN B1-01講演
 
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMMハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
ハイブリッドクラウド研究会_Hyper-VとSystem Center Virtual Machine Manager セッションMM
 
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
無形価値を守り育てる社会における「デー タ」の責務について - Atlas, Inc.
 
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライドHumanoid Virtual Athletics Challenge2024 技術講習会 スライド
Humanoid Virtual Athletics Challenge2024 技術講習会 スライド
 
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
生成AIがもたらすコンテンツ経済圏の新時代  The New Era of Content Economy Brought by Generative AI
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
ヒアラブルへの入力を想定したユーザ定義型ジェスチャ調査と IMUセンサによる耳タッチジェスチャの認識
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobodyロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
ロジックから状態を分離する技術/設計ナイト2024 by わいとん @ytnobody
 

RakSulのInternal API開発で gRPCを導入した話

  • 1. © RakSul,Inc. All Rights Reserved. RakSulのInternal API開発で gRPCを導入した話 Omotesando.rb #45 Nobuhiro Nikushi 2019/04/03
  • 2. © RakSul,Inc. All Rights Reserved. About me Nobuhiro Nikushi 二串 信弘   ● Works at RAKSUL INC. from 2017/3 ● Engineering Manager at Printing EC Team. ● Favorite Languages: Ruby, Golang, TypeScript, etc ● Private: English, Violin, 子育て Engineering Manager and Tech Lead at RAKSUL github: @nikushi twitter: @nikushi_jp
  • 4. ● ラクスルのシステムのRebuild ○ 一枚岩なレガシーシステムを ラクスルではどのように Rebuildしているの か?https://www.slideshare.net/nixiesan/rebuild-124366117 ○ そうだ、ラクスルを作り直そう! | RakSul Tech Blog https://tech.raksul.com/2017/12/18/raksul-platform-project/ ● 商品カタログ機能のInternal API化 # 今日の話 What do I do?
  • 6. © RakSul,Inc. All Rights Reserved. 印刷EC = raksul.com における商品カタログサービス。もともとモノリスアプリケーション 内に存在していた機能を別サービス化。 ユースケース ● ECサイトは商品仕様をAPI経由で参照できる ● カテゴリマネージャー向け(商品登録・更新、販売価格の更新など) What is MD API?
  • 7. © RakSul,Inc. All Rights Reserved. 商品仕様の例: チラシ・フライヤー
  • 8. © RakSul,Inc. All Rights Reserved. 商品仕様の例: 名刺
  • 9. © RakSul,Inc. All Rights Reserved. 商品仕様の例: 冊子
  • 10. © RakSul,Inc. All Rights Reserved. Components Monolithic App Monolithic App MD API GET https://raksul.com/flyer GET https://raksul.com/flyer gRPC over h2c server implemented by grpc gem, with Rails’ ecosystem. Still monolithic Rails app, but this layer acts like BFF. gRPC client stub, implemented by grpc gem
  • 11. © RakSul,Inc. All Rights Reserved. 商品カタログの特性 ● raksul.com の商品カテゴリ数はN個(チラシ、名刺、冊子、etc..) ● 商品カテゴリ毎にデータスキーマは異なる 本プロジェクトでAPI仕様記述言語に求めること ● API仕様記述ファイルを商品カテゴリ毎に分けたい ● API仕様記述のエディタでの書きやすさを重視 We choose gRPC, Why?
  • 12. © RakSul,Inc. All Rights Reserved. Protocol Buffers ● import によるファーストクラスのファ イル分割サポート ● エディタのサポートが強力 ○ 無論エディタによるが ○ JetBrains系エディタのproto plugin はとても良い ■ message間、ファイル間の コードジャンプ ■ syntax error feedback We choose gRPC, Why?
  • 13. © RakSul,Inc. All Rights Reserved. RakSulではAPI開発にSwaggerを使ってきたが本案件では採用しなかった ● $ref を使うとファイル分割できるが ○ $ref: '../components/pet.yml' こういうの ● ローカルエディタでのコードジャンプは効くが、Swagger Editorは未対応 ○ (余談) 社内アンケートではSwagger Editor 派と ローカルエディタ派にそもそも分かれた ○ (余談) 私個人としては面倒だが Swagger Editor 使っていた ● Swagger UIや committee がresolveしてくれない ○ `$ref` を resolve し1ファイルに統合するスクリプトを作る ? ■ `$ref` の解決は Ruby ではなく別途 node を使うことになる ○ ファイル修正するたびにコマンド実行 ? or Guard で watchする? Swagger, why not?
  • 14. © RakSul,Inc. All Rights Reserved. swagger-blocks という gem がある swagger記法をRuby の DSL で書ける 今回の要件も叶えれるが、本当に俺たちはRubyでSwaggerを書きたいか? 最終更新日が1 year ago 等々考えて見送った。
  • 15. © RakSul,Inc. All Rights Reserved. ● JSON Schema より圧倒的に書きやすい(とおもった) ○ 記述量少ない && エディタサポートがいい感じなのでサクサク書ける ● REST制約(GET/POST/PUT/DELETE)に縛られないAPI設計ができること ○ 技術負債解消の文脈では関数単位で切り出しがしやすい! ● メンバーのモチベーションは高い、技術的な裾のが広がった ○ Protocol Buffersが便利だと気づく ○ 他案件でも採用 ● インフラ的チャレンジ(Sidecar Envoy, Service Discovery, Service Mesh, Container, etc) gRPCを採用後に感じた良かったこと
  • 16. © RakSul,Inc. All Rights Reserved. gRPCを使ったサービスを本番運用に乗せるには考えることがたくさんある ● Infrastructure(monitoring, load balancing, graceful deploy, etc) ● Understanding gRPC protocol(status code, metadata, etc) ● Interceptor ● mock in unit tests ● mono git repository for proto files ● Understanding gRPC Server(Ruby and gRPC C-Core impl) ● etc ロングストーリー。これらの話はまたいつかの機会に話したい。 gRPC in Production
  • 17. © RakSul,Inc. All Rights Reserved. We are hiring!
  • 18. © RakSul,Inc. All Rights Reserved. Thank you!
  • 19. © RakSul,Inc. All Rights Reserved. Appendix
  • 20. © RakSul,Inc. All Rights Reserved. raksul-proto: mono repo for all systems’ proto files raksul-proto $ tree raksul/ raksul └── printmd └── v1 ├── businesscard.proto ├── b3flyer.proto ├── flyer.proto ├── price.proto …etc..
  • 21. © RakSul,Inc. All Rights Reserved. フロントエンド向けのAPI戦略 ● フロント向けのAPIは引き続き RESTFul APIを採用 ● Swaggerを使う. gRPC-Web も考えたが見送り ○ PMやフロントエンドエンジニアの慣れ chorome developer tools ● しかしここでJSON Schemaを書いてしまっては裏側をgRPCにしたとしても意味が 無い protoc-gen-swaggerを使ってフロントエンド向けAPIの仕様もProtocol Buffers で書いて swagger.json 出力するようにした ref: スキーマ定義言語 Protocol Buffers と protoc-gen-swagger を使って Web API のスキマを埋めよう | VOYAGE GROUP techlog https://techlog.voyagegroup.com/entry/protoc-gen-swagger protoc-gen-swagger